图形流水线记录(2)世界坐标系/观察坐标系

Posted on 2008-11-19 21:57  活着就是幸福  阅读(1614)  评论(1编辑  收藏  举报

如果将物体全部放在世界坐标系中,然后按照事先想好的场景排好位置,也就是各自都乘以了各自的从物体坐标系到世界坐标系的变换矩阵,那么现在可以在世界坐标系中放置一个摄像机进行拍摄了。

按照(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)