- Coordinate Systems
- Coordinate Spaces
- Object Space
- World Space
- Inertial Space
- Camera Space
- Combining Coordinate Spaces
- References
在本文中,我想为想要参与游戏编程的人提供简短的数学入门。这并不是对成为一名成功的游戏程序员必须知道的所有数学理论的详尽解释,但这是在您作为游戏程序员开始之前必须知道的最少量的信息。
本文假设您有一个最小的理解向量和矩阵。我将简单地展示向量和矩阵的应用以及它们如何应用于游戏编程。
Coordinate Systems
在我们谈论变换之前,我们必须对我们的坐标系是什么做出正式的定义。DirectX
使用的默认坐标系是左手坐标系。OpenGL
使用的默认坐标系是右手坐标系。
记住你正在使用的坐标系的最简单方法是用你的双手。如果您将拇指,食指和中指指向彼此正交,则每个手指将指向坐标空间中正基本轴的方向。使用左手,拇指指向右侧( 轴),食指指向上方( 轴),中指指向远离您( 轴) 。
使用右手,拇指( 轴)和食指( 轴)仍指向同一方向,但中指( 轴)指向相反的方向。如果我们围绕食指旋转手( 轴)以使拇指指向右侧,那么您的中指( 轴)将指向您。
要记住的另一个重要注意事项是<font color=red>旋转方向</font>。如果您将拇指指向旋转轴的正方向并将手指绕着假想轴弯曲,则手指将沿正向旋转方向卷曲。如果你用左手做这个,当你的拇指向下看时,你的手指会顺时针方向卷曲。但是,如果你用右手做这个,当你的拇指向下看时,你的手指会逆时针方向卷曲。
下表显示了正旋转和负旋转的旋转方向,具体取决于坐标系的旋向性。
Coordinate Spaces
- 在3D游戏引擎中,我们通常处理几个不同的坐标空间。最常用的空间包括对象空间,世界空间,惯性空间和相机空间。
Object space, World space, Inertial space, and Camera space
Object Space
在对象空间(也称为局部空间或建模空间)中,对象的顶点相对于它们描述的对象表示。也就是说,如果你没有从原点移动对象,那么艺术家想要显示它们的方式。
下图显示了对象空间中对象的示例。从图像中可以看出,对象位于它的相对原点。
World Space
世界坐标空间是描述所有其他对象空间的全局坐标空间。下图显示了世界空间中描述的对象。注意对象的世界变换如何通过一些平移和旋转将它远离世界原点。
Inertial Space
惯性空间是物体空间和世界空间之间的“中间”空间。惯性空间的原点与物体空间的原点相同,惯性空间的轴与世界空间轴的轴平行。
将点从物体空间转换为惯性空间仅需要旋转,而将点从惯性空间转换为世界空间仅需要平移。
图像显示了惯性空间的一个例子。
Camera Space
相机空间是与观察者关联的坐标空间。相机空间被认为是我们所看到的内容和方向。摄像机的坐标轴通常假设正 轴指向右,正 轴指向上,而在左手坐标系中,正 轴指向前方或场景。在右手坐标系中, 轴反转,因此负 轴指向前方,或指向我们场景中的对象。 这些摄像机轴的更常见名称是 “Right”, “Up”, and “At”
轴。
相机空间变换与投影变换一起用于回答以下问题:
- 物体完全是在相机的视野中,部分在视野中,还是完全不在视野中,
- 一个物体比另一个物体更靠近相机,
- 物体是直接位于相机前方,上方,下方,左侧还是右侧的物体。
Combining Coordinate Spaces
在3D计算机图形中,使用 齐次坐标系(homogeneous coordinate system) 描述坐标空间。齐次坐标系允许我们以相似的方式表示所有仿射变换(平移,旋转,缩放和透视投影),因此可以轻松地将它们组合为单个表示。
可以使用矩阵乘法来组合任何数字坐标空间,从而产生可以应用于对象所有顶点的单个矩阵。
甚至可以组合多个世界坐标空间,以得出描述对象中所有顶点位置的最终坐标空间。这对于嵌套的坐标空间很有用,在该坐标空间中,对象相对于“父”对象的位置被表达。更改父对象的世界变换后,子对象的变换也会隐式更改。使用此方法,可以从几个较小的场景构建复杂的场景,然后将其放置在较大的场景中以创建完整的世界。
References
Fletcher Dunn and Ian Parberry (2002). 3D Math Primer for Graphics and Game Development. Wordware Publishing.