在3d世界中,我们需要不停的在各个空间里面转换坐标,比如把物体由模型空间转化到世界空间,把世界空间中的点转换到摄像机的视图空间。我们知道,坐标转换可以用向量与一个转换矩阵相乘来达到转换目的。但要注意的是如果选择的是行向量,则是矩阵放在右边相乘,如果是列向量,则需要把矩阵放在向量左边相乘。如果不考虑位移,则我们可以用一个3X3矩阵来表示旋转或者缩放操作。
如果我们用行向量来表示某个模型空间中的某个点p( px py pz ),假设模型经过旋转后,新的轴在世界空间中表示为 r(表示左右轴),u(表示向上的轴)f(表示向前的轴),则旋转矩阵为
rx ry rz
ux uy uz
fx fy fz
p与矩阵相乘后我们得到新的x点为 px*rx+py*ux+pz*fx,也就是p与旋转矩阵的列向量的点积。向量的点积也可以理解为一个向量在一个向量上面的投影。如果我们从列的角度来观察刚才的旋转矩阵,其实我们可以发现第一列其实是原来的r轴向相反的方向旋转后的新的r轴。同理第二列第三列相同。这样我们就不难理解了。一个模型旋转一个角度,我们可以让模型不动,让坐标轴沿着相反的方向旋转相同的角度。旋转后,每列就是坐标轴新的向量表示。点与旋转矩阵相乘,其实就是原来的点在新的坐标轴上面的投影。
在把所有的模型都转换到世界坐标空间后,我们需要转到到视图空间,假定我们知道摄像机的从模型空间到世界空间的转换矩阵就是上面的旋转矩阵,要把物体转换到相机空间,就需要上面矩阵的逆,正交矩阵的逆可以用该矩阵的转置矩阵来表示。所以变换矩阵变为
rx ux fx
ry Uy fy
rz uz fz
世界空间中的某点p与该矩阵相乘,则得到(p*r ,p*u ,p*f),从这里可以看到世界空间的点转换到视图空间,其实就是点在相机各个坐标上面的投影。这里没有考虑位置转换,只考虑3X3矩阵是为了简化思考。