如果将物体全部放在世界坐标系中,然后按照事先想好的场景排好位置,也就是各自都乘以了各自的从物体坐标系到世界坐标系的变换矩阵,那么现在可以在世界坐标系中放置一个摄像机进行拍摄了。
按照(1)里面的例子,我女朋友处于屋子的中心(世界坐标系的原点),我处于(1, 0, 1)处,两个人都是和世界坐标系坐标轴重叠,也就是都看着Z轴方向,都处于立正的状态(其实干点别的更好),那么她的MatTransToWorld变换矩阵就是:
1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
0, 0, 0, 1
而我的就是
1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
1, 0, 1, 1
表示我平移了。
现在把我换成一台摄像机,镜头方向水平朝向Z轴,位置仍然在世界坐标系的(1, 0, 1)处。那么相对于摄像机,我女朋友处于( -1, 0, -1)的位置,
这实际上就是她在摄像机坐标系中的位置。那么把她从世界坐标系平移到摄像机坐标系的矩阵就是观察矩阵。即:
vecPosInCamera = vecPosInWorld * MatWorldToCamera(即MatView);
别忘了,摄像机本质上也是一个物体,摄像机坐标系实际上就是摄像机所在的物体坐标系,按照(1)里面的公式:
vecPosInModel = vecPosInWorld * MatWorldToModel
这里vecPosInModel实际上就是vecPosInCamera,MatWorldToModel就是MatWorldToCamera。那么按照(1)的推论,将物体从摄像机坐标系变换回世界坐标系的矩阵就是MatCameraToWorld,即Inverse(MatWorldToCamera)。
又,把物体从摄像机坐标系变到世界坐标系要先旋转再平移,那么从世界坐标系到摄像机坐标系就要先平移相机平移的逆,再旋转相机旋转的逆。这个结果出来就是观察矩阵。下面对观察矩阵求逆,也就是求MatCameraToWorld。
MatCameraToWorld = Inverse(MatWorldToCamera)
= MatCameraToWorldRotation * MatCameraToWorldTranslation
这个矩阵其实就是摄像机在世界坐标系的变换矩阵。其中前三行分别是摄像机在世界坐标系中的x(Right), y(Up), z(View)三个向量,而第四行是摄像机在世界坐标系中的平移。由此可知观察矩阵的前三列是摄像机在世界坐标系中的x(Right), y(Up), z(View)三个向量,而第四行是摄像机在世界坐标系中的平移的逆。如果把物体乘以这个矩阵,那么就变换回了世界坐标系。即
vecPosInCamera = vecPosInCamera * MatCameraToWorld
= vecPosInCamera * (MatCameraToWorldRotation * MatCameraToWorldTranslation)