游戏程序员的3D数学入门(坐标系)之美_游戏引擎开发

在本文中,我想为想要参与游戏编程的人们提供简短的数学入门。这并不是对一个成功的游戏程序员必须了解的所有数学理论的详尽解释,但这是您开始成为游戏程序员之前必须了解的最少信息。

本文假定您对向量和矩阵有最少的了解。我将简单展示向量和矩阵的应用以及它们如何应用于游戏编程。

坐标系

在讨论转换之前,我们必须对坐标系进行正式定义。DirectX使用的默认坐标系是左手坐标系。OpenGL使用的默认坐标系是右手坐标系。

记住你使用的坐标系的最简单的方法就是用你的手。如果你用拇指、食指和中指相互垂直,那么每个手指都将指向坐标空间中正主轴的方向。用左手,你的拇指指向右边(X轴),食指指向上(Y轴),中指指向远离你的地方(z轴)。

用右手,你的拇指(X轴)和食指(Y轴)仍然指向同一方向,但中指(Z轴)指向相反方向。如果我们绕着食指旋转我们的手(Y轴),让你的拇指指向右边,那么你的中指(z轴)就会指向你。

另一个重要的注意事项是旋转的方向。如果你把你的拇指指向旋转轴的正方向,然后把你的手指绕着假想的轴卷曲,你的手指就会朝着旋转轴的正方向卷曲。如果你用左手这样做,当你向下看拇指时,你的手指会顺时针方向卷曲。然而,如果你用右手这样做,当你向下看拇指时,你的手指会逆时针方向卷曲。

这可以在下面的图片中看到:

游戏程序员的3D数学入门(坐标系)之美_游戏引擎开发_02

下表显示了正旋转和负旋转的旋转方向,具体取决于坐标系的利手。

Counter-Clockwise(逆时针),Clockwise(顺时针),Positive Rotation(正向旋转),Negative Rotation(负旋转)

游戏程序员的3D数学入门(坐标系)之美_游戏引擎开发_03

坐标空间

在3D游戏引擎中,我们通常处理几个不同的坐标空间。最常用的空间包括对象空间,世界空间,惯性空间和相机空间。

对象空间

在对象空间(也称为局部空间)或建模空间中,对象的顶点是相对于它们描述的对象表达的。也就是说,如果您没有将物体从原点移开,则艺术家希望它们显示的方式。

下图显示了对象空间中对象的示例。从图像中可以看到,对象位于其相对原点。

游戏程序员的3D数学入门(坐标系)之美_游戏引擎开发_04

世界空间

世界坐标空间是为其描述所有其他对象空间的全局坐标空间。下图显示了在世界空间中描述的物体。请注意,对象的世界变换是如何通过某种平移和旋转将其从世界上移开的。

游戏程序员的3D数学入门(坐标系)之美_游戏引擎开发_05

惯性空间

惯性空间是物体空间和世界空间之间的“中途”空间。惯性空间的原点与物体空间的原点相同,并且惯性空间的轴与世界空间的轴平行。

将点从物体空间转换为惯性空间仅需要旋转,而将点从惯性空间转换为世界空间仅需要平移。

图像打击显示了惯性空间的示例。

游戏程序员的3D数学入门(坐标系)之美_游戏引擎开发_06

相机空间

相机空间是与观察者相关联的坐标空间。相机空间被认为是我们所观察事物的起源和方向。相机的坐标轴通常假定正X轴指向右侧,正Y轴指向上方,而在左手坐标系中,正Z轴指向前方或场景。在右手坐标系中,Z轴是反向的,因此负-Z

轴指向前方,或者指向场景中的对象。这些相机轴的一个更常见的名称是“右”、“上”和“在”轴。

相机空间变换和投影变换可用于回答以下问题:

  • 是一个完全在摄像机中,部分在摄像机中,或者根本不在摄像机中的物体,
  • 一个物体比另一个更靠近相机,
  • 是相机正前方、上方、下方、左侧或右侧的对象。

组合坐标空间

在3D计算机图形中,使用齐次坐标系描述坐标空间。齐次坐标系允许我们以相似的方式表示所有仿射变换(平移,旋转,缩放和透视投影),因此可以轻松地将它们组合成单个表示。

可以使用矩阵乘法来组合任何数量的坐标空间,从而产生可以应用于对象所有顶点的单个矩阵。

甚至可以组合多个世界坐标空间,以得出描述对象中所有顶点位置的最终坐标空间。这对于嵌套坐标空间很有用,在该坐标空间中,对象相对于“父”对象的位置被表达。当父对象的世界变换更改时,子对象的变换也将隐式更改。使用此方法,可以从几个较小的场景构建复杂的场景,然后将其放置在较大的场景中以创建完整的世界。

参考文献
游戏程序员的3D数学入门(坐标系)之美_游戏引擎开发_07

用于图形和游戏开发的3D数学入门

Fletcher Dunn和Ian Parberry(2002)。用于图形和游戏开发的3D数学入门。Wordware发布。