一、引言
在计算机图形学的世界里,坐标是构建虚拟世界的基石。它就像地图上的经纬度,帮助我们精确地定位和描述图形对象的位置、形状和方向。通过对坐标的理解和运用,我们能够在计算机屏幕上创建出逼真的三维场景、精美的二维图形,以及实现各种复杂的图形变换和动画效果。本文将深入探讨图形学中坐标的相关概念、分类、应用以及坐标变换的原理和方法。
二、坐标系的基本概念
2.1 左手坐标系和右手坐标系
在计算机图形学中,常用的坐标系有左手坐标系和右手坐标系。DirectX 使用的默认坐标系是左手坐标系,而 OpenGL 使用的默认坐标系是右手坐标系。我们可以通过手来简单判断这两种坐标系:在左手坐标系中,大拇指指向 X 轴的正方向(指向右边),食指指向 Y 轴的正方向(上方),中指指向 Z 轴的正方向(远离自己的方向);在右手坐标系中,大拇指和食指的指向与左手坐标系相同,但中指指向 Z 轴的正方向是指向自己。
此外,左手坐标系和右手坐标系的旋转方向也有所不同。从坐标轴负方向看正方向(比如从 -1 看向 +1),左手坐标系的正向旋转方向是逆时针,负向旋转方向是顺时针;右手坐标系的正向旋转方向是顺时针,负向旋转方向是逆时针。从坐标轴正方向看负方向(比如从 +1 看向 -1),情况则相反。
2.2 笛卡尔坐标系
笛卡尔坐标系是直角坐标系和斜坐标系的统称。
2.2.1 直角坐标系
二维的直角坐标系通常由两个互相垂直的坐标轴设定,分别称为 x - 轴和 y - 轴。两个坐标轴的相交点称为原点,标记为 O。每一个轴都指向一个特定的方向,这两个坐标轴决定了一个平面,称为 xy - 平面,又称为笛卡尔平面。在直角坐标系中,我们可以用直角坐标 (x, y) 来表示平面上任意一点的位置。例如,图中绿点的坐标为 (2, 3),红点的坐标为 (-3, 1),蓝点的坐标为 (-1.5, -2.5),紫点的坐标为 (0, 0)。
2.2.2 斜坐标系
如果坐标系中两条坐标轴不垂直,那么这样的坐标系称为“斜坐标系”。与直角坐标系不同,斜坐标系在某些特定的应用场景中可能会更加方便。
2.3 其他常见坐标系
除了上述坐标系外,还有世界坐标系、物体坐标系和惯性坐标系等。世界坐标系是一个全局坐标系,所有的坐标系都可以变换到世界坐标系下。物体坐标系通常在三维开发或制图中使用,给绘制物体的本身设置一个坐标系,这样物体不论在哪个位置,都是相对于本身的物体坐标系的。惯性坐标系是世界坐标与物体坐标系直接互相转换的中间一个坐标系,其每个轴(x 轴,y 轴,z 轴)都平行于世界坐标系。
三、计算机图形学中的坐标系统
3.1 建模坐标系(MC)
建模坐标系是一个局部坐标系,同时可以是一个典型的平面直角坐标系。它的出现主要是为了模型构建与变换的方便。在创建基本形体或图形时,我们通常会将某些位于物体上的角点、中心点或靠近它们的点作为参考点,构建一个以该点为原点的参考坐标系。例如,在创建圆形时,一般将圆心作为参考点来创建圆周上其他各点,并以圆心为参考点进行变换,这样更加直观和方便。
3.2 世界坐标系(WC)
一旦对物体进行了建模,下一步就是将各个对象或者图形组合放到我们希望绘制的平面场景中。由于每个对象在创建时都有自身的建模坐标系,为了确定每一个对象的位置及其他对象的相对位置,就必须抛弃每一个对象自身的坐标系,将其纳入到一个统一的坐标系中,这个坐标系称为世界坐标系,也称用户坐标系。它是一个全局坐标系,也是一个典型的平面直角坐标系。这个过程实质上是将一个物体从局部空间组合装配到世界空间的变换过程。
3.3 观察坐标系(VC)
观察坐标系通常是以视点的位置为原点,通过用户指定的一个向上的观察向量来定义整个坐标系统。它主要用于从观察者的角度对整个世界坐标系内的对象进行重新定位和描述,从而简化几何物体在投影面的成像的数学推导和计算。在图形渲染中,我们通过 WebGL 在屏幕上展现给用户的内容并不是世界空间中摆放的全部内容,而是通过摄像机来模拟用户的眼睛所呈现的场景。观察空间就是从摄像机的视角所观察到的空间,也称作摄像机空间或视觉空间。
3.4 投影坐标系
物体从世界坐标描述转换到观察坐标后,可将三维物体投影到二维表面上,即投影到虚拟摄像机的胶片上,这个过程就是投影变换。以胶片中心为参考原点的空间坐标系称为投影坐标系,物体在投影坐标系中的坐标称为投影坐标。投影变换分为正交投影和透视投影。正交投影就是摄像机在原点,看向 -z 方向,顶部在 y 方向,在看向物体时将所有物体的 z 值归 0,然后将物体平移并缩放到 [-1, 1]^2 之间。透视投影则是近大远小,平行线也会变得不平行,人们眼睛所看到的就是透视投影的结果。
3.5 设备坐标系
设备坐标系是图形设备上采用的与具体设备相关的坐标系。它一般采用整数坐标,其坐标范围由具体设备的分辨率决定。设备坐标系上的一个点一般对应图形设备上的一个像素。由于具体设备的限制,设备坐标系的坐标范围一般是有限的。
3.6 规格化设备坐标系
规格化设备坐标系是为了避免设备相关性而定义的一种虚拟的设备坐标系。其坐标范围一般从 0 到 1,也有的是从 -1 到 +1。采用规格化设备坐标系的好处是屏蔽了具体设备的分辨率,使得图形处理能够尽量避开对具体设备坐标的考虑。实际图形处理时,先将世界坐标转换成对应的规格化设备坐标,然后再将规格化设备坐标映射到具体的设备坐标上去。
3.7 屏幕坐标系统
屏幕坐标系统也称设备坐标系统,它主要用于某一特殊的计算机图形显示设备(如光栅显示器)的表面的点的定义。在多数情况下,对于每一个具体的显示设备,都有一个单独的坐标系统。在定义了成像窗口的情况下,可进一步在屏幕坐标系统中定义称为视图区(view port)的有界区域,视图区中的成像即为实际所观察到的。
四、球坐标系及其应用
4.1 球坐标系的定义
在计算机图形学中,球坐标系是一种用于表示三维空间中点的位置的坐标系统。它通过半径和两个角度来描述点的位置,通常表示为 (r, θ, φ),其中 r 表示从原点到该点的距离(即半径),是一个非负数;θ(theta)表示从 Z 轴到该点的夹角,通常在 0 到 π(180 度)之间变化,θ = 0 表示点在 Z 轴的正方向,θ = π 表示点在 Z 轴的负方向;φ(phi)表示在 XY 平面内,从 X 轴到该点的投影的夹角,通常在 0 到 2π(360 度)之间变化,φ = 0 表示点在 X 轴的正方向,φ = π/2 表示点在 Y 轴的正方向,φ = π 表示点在 X 轴的负方向,φ = 3π/2 表示点在 Y 轴的负方向。
4.2 球坐标系与笛卡尔坐标系的转换
在计算机图形学中,通常需要将球坐标系转换为笛卡尔坐标系,以便进行图形绘制和计算。转换公式如下:
- x = r ⋅ sin(θ) ⋅ cos(φ)
- y = r ⋅ sin(θ) ⋅ sin(φ)
- z = r ⋅ cos(θ)
从笛卡尔坐标系到球坐标系的转换则可以通过逆运算得到。球坐标系转换为笛卡尔坐标系的目的主要包括便于计算和渲染、物理模拟、用户交互、简化数学计算以及数据存储和传输等。
4.3 球坐标系在游戏中的应用
球坐标系在游戏开发中有着广泛的应用,特别是在处理三维空间中的物体位置、运动和视角时。例如,在许多 3D 游戏中,玩家的视角通常是通过相机来控制的。使用球坐标系可以方便地实现相机的旋转和移动,通过调整角度 θ 和 φ 可以实现相机围绕目标物体的旋转,调整半径 r 可以实现相机与目标物体之间的距离变化,从而实现拉近或拉远的效果。此外,在一些游戏中,物体的运动也可以用球坐标系来描述,特别是在涉及到球形轨道或旋转运动时,如行星围绕恒星的运动、粒子系统中粒子的发射等。
五、坐标变换
5.1 二维变换
5.1.1 缩放变换
缩放变换是指将图形在 x 轴和 y 轴方向上进行缩放。如果想把一个图形缩小为原来的 0.5 倍,那么就需要将 x 坐标和 y 坐标都变为原来的 0.5 倍。在实际应用中,两个方向上的缩放可能不尽相同,例如 x 轴缩放为 0.5 倍,y 轴不缩放。缩放变换可以用矩阵的形式表示。
5.1.2 镜像变换
镜像变换是指将物体以某条轴进行镜像。例如,将物体以 y 轴进行镜像,可以用相应的表达式和矩阵形式来表示。
5.1.3 剪切变换
剪切变换就像是拽着图形的右上角沿着 x 轴向右拉了一段距离。变换后物体的 y 坐标保持不变,x 坐标在最高的点平移了 a,最低点没有移动,其它的点移动距离为 a * Y(Y 表示物体上点的 y 坐标值)。剪切变换也可以用矩阵形式表示。
5.1.4 旋转变换
旋转变换默认指的是绕原点 (0, 0) 逆时针旋转。物体绕原点逆时针旋转 θ 角的变换可以写成矩阵的形式。
5.1.5 平移变换
平移变换是指将图形沿 x 轴和 y 轴进行平移。平移变换原本是非线性变换,但通过引入齐次坐标,可以将其表示为线性变换的形式。齐次坐标与笛卡尔坐标系相比,会比笛卡尔坐标系多出一维。例如,原来的二维坐标系转为齐次坐标系后会变成三维。在将点和向量转为齐次坐标表示时,点在末尾添加 1,而向量添加 0,这是为了保护向量在平移过程中不发生变化。
5.1.6 逆变换
一个物体做一个变换,变换完以后要恢复到原来的位置,这个过程称为逆变换。逆变换在数学上的实现是乘以变换矩阵的逆矩阵。
5.1.7 组合变换
组合变换就是对一个物体进行多个变换,例如同时进行平移和旋转变换。需要注意的是,变换的顺序不同最终的结果也不同,因为矩阵乘法不满足交换律。组合变换矩阵相乘应用的顺序是从右到左。
5.1.8 非原点的旋转变换
对于一个不是绕原点旋转的变换,需要分三步实现:将物体旋转要绕的点移动到原点,移到原点后做旋转变换,旋转变换完成后平移回原来的位置。这个过程可以用一个表达式表示,矩阵变换作用在物体上的顺序是从右到左。
5.1.9 刚体变换
只有平移和旋转组成的变换称为刚体变换。例如,一个物体先旋转 45 度,再在 x 轴方向上平移一个单位,这样的变换就是刚体变换。刚体变换的本质是一个物体的位置和角度发生了变换,物体本身的形状并不发生任何变化。二维刚体变换的逆变换矩阵,只需要把原变换矩阵左上角 2×2 矩阵转置,右侧最后一列的平移分量符号取反即可得到。
5.2 三维变换
5.2.1 三维平移变换
三维平移变换是指将物体在三维空间中沿 x、y、z 轴进行平移。可以用相应的矩阵来表示三维平移变换。
5.2.2 三维缩放矩阵
三维缩放矩阵用于在三维空间中对物体进行缩放。与二维缩放变换类似,三维缩放可以在 x、y、z 轴方向上进行不同比例的缩放。
5.2.3 三维旋转矩阵
三维旋转矩阵包括绕 z 轴旋转矩阵、绕 x 轴旋转矩阵、绕 y 轴旋转矩阵和绕任意轴旋转矩阵。不同的旋转轴对应的旋转矩阵不同。
5.3 坐标系统之间的变换
在计算机图形学中,顶点坐标通常需要从局部空间按照一定的顺序一步步变换到屏幕空间,这个过程涉及到多个坐标系统之间的变换,包括模型矩阵变换、视图矩阵变换、投影矩阵变换和视口变换等。
5.3.1 模型矩阵变换
模型矩阵的作用是通过对物体进行位移、缩放、旋转等操作将其摆放到场景中的不同位置。它将物体从局部空间转换到世界空间。
5.3.2 视图矩阵变换
视图矩阵用于将世界坐标系下的坐标变化到摄像机坐标系。视变换是通过乘以视图矩阵实现的。视图矩阵可以由一个将摄像机平移至原点的矩阵 T 和一个将坐标点从世界坐标系转换至摄像机坐标系的矩阵 R 合成。
5.3.3 投影矩阵变换
投影矩阵将物体从观察空间转换到裁剪空间。投影矩阵分为正射投影矩阵和透视投影矩阵。正射投影和透视投影的差别很明显,透视投影看起来更加立体真实,而正射投影则没有这种效果。在不同的应用场景中,可以根据需要选择合适的投影方式。
5.3.4 视口变换
在做完投影变换后,所有物体都映射在标准坐标系中,但屏幕会有各种各样的分辨率,所以视口变换是为了将正常设备坐标映射到屏幕坐标。视口变换将 [-1, 1]^2 的 xy 平面变到 [0, width]x[0, height],这里通常不考虑 z 轴的变换,因为 z 轴在之后的其他地方有用。
六、结论
坐标在计算机图形学中起着至关重要的作用,它是构建虚拟世界的基础。通过对不同坐标系的理解和运用,以及掌握坐标变换的原理和方法,我们能够在计算机图形学的领域中实现各种复杂的图形效果和应用。无论是游戏开发、动画制作还是虚拟现实等领域,坐标的正确使用都是实现高质量图形渲染的关键。希望本文能够帮助读者更好地理解图形学中的坐标,为进一步深入学习和应用计算机图形学打下坚实的基础。