读一读

世界空间是一个特殊的坐标系,因为它建立了我们所关心的最大的空间。世界坐标可以被用于描述绝对位置(就是世界坐标系中的位置),通常,我们会把世界空间的原点放置在游戏空间的中心。


模型空间就是和某个模型或者对象有关的。有时候模型空间也被称为对象空间或局部空间。每个模型都有自己独立的坐标空间,当他移动过旋转的时候,模型空间也会跟着移动和旋转。模型空间的原点和坐标轴通常都是由美术人员在建模软件里确定好的。

就好像这样子,拿自己作对比,想象一下自己就是那个模型哇,然后你脚跟为原点画出一个3维的坐标轴,那么眼睛大概就是(1,10,1)那样。


对坐标空间的变换实际就是在父空间和子空间之间对点和矢量进行变换。

假设子坐标空间C的三个坐标轴在父坐标空间P下表示xc、yc、zc,以及其原点位置Oc。当给定一个子坐标空间中的一点A=(a,b,c),计算它在父坐标空间下的位置Ap:

  1. 从坐标空间的原点开始:就是Oc

  2. 向x轴方向移动x个单位:Oc+axc

  3. 向y轴方向移动y个单位:Oc+axc+byc

  4. 向z轴方向移动z个单位:Oc+axc+byc+czc

  5. 结果Ap = Oc+axc+byc+czc

123.png

扩展到四维(能表示平移)

3ec49c7a97d8b8907e71310e79465d86.png


求出子坐标到父坐标的变换矩阵,就可以通过求逆来求出由父坐标到子坐标的变换矩阵了。


要想定义一个坐标空间,必须指明其原点位置和3个坐标轴的方向。而这些数值实际上是相对另一个坐标空间的,所有的都是相对的。也就是说,坐标空间会形成一个层次结构,每个坐标空间都是另一个坐标空间的子空间,反过来说,每个空间都有一个父坐标空间。


把平移、旋转、缩放组合起来,形成一个复杂的变换过程。可以向将各种变换矩阵相乘,再乘于变换的点。


123.png

变换的结果是依赖于变换顺序的,矩阵乘法是不满足交换律的,因此矩阵的乘法顺序很重要。

约定变换的顺序就是先缩放,再旋转,最后平移。


123.png

456.png

789.png

记忆技巧:设第一行和列为x行列,第二行和列为y行列,第三行和列为z行列。绕x轴旋转时,x行列的交叉元素设为1,x行列其他元素为0,最后一行列固定[0 0 0 1],其他的就是cos和sin了(都是cos,sin,sin,cos,两个sin轮着负,挺好记的)


123.png

3个系数都相同时为统一缩放

这样的矩阵只适合于沿坐标轴方向进行缩放。如果我们希望在任意方向上进行缩放,就需要使用一个复合矩阵。其中一种方法的主要思想就是,先将缩放轴变换成标准坐标轴,然后进行沿坐标轴的缩放,再使用逆变换得到原来的缩放轴朝向。


对一个点进行变换:

123.png

点的x、y、z分量分别增加了一个位置偏移。


对一个方向矢量进行变换:

456.png

平移矩阵不会对方向矢量产生任何影响。


齐次坐标是一个四维矢量。对于一个点,从三维坐标转换成齐次坐标是把其w分量设为1,而对于方向矢量来说,需要把其w分量设为0。

这样的设置,当用一个4×4矩阵对一个点进行变换时,平移、旋转、缩放都会施加于该点。但是如果是用于变换一个方向矢量,平移效果就会被忽略。


仿射变换(affine transform)就是合并线性变换和平移变换的变换类型。仿射变换可以使用一个4×4的矩阵来表示。为此,我们需要把矢量扩展到四维空间下,这就是齐次坐标空间(homogeneous space)