图形流水线记录(1)物体坐标系/世界坐标系

Posted on 2008-11-19 20:55  活着就是幸福  阅读(616)  评论(0)    收藏  举报

物体坐标系是模型本身的一个坐标系,一般来讲都是以物体的中心为原点,按一定的比例放置一个物体。比如以自己的腹部为中心,以视线的方向为Z轴正方向,右手方向为X轴正方向,从脚到头的方向为Y轴正方向,以米为单位,假设身高为1.75米,那么自己的头(中心)会处于物体坐标系(0, 0.875, 0)的位置(如果X或Z不是0,你就长歪了)。

世界坐标系是把一堆物体集中放置在一起并且指出它们互相关系的坐标系。比如我和女朋友,两个人从自己来说都处于自己坐标系的中心,但是从同处一室的角度来看,那么以屋子中心为世界坐标系原点,她就恰好处于世界坐标系的中心(其实我想在中心),而我只能靠边站,以米为单位,在世界坐标系的位置(1, 0, 1)处(如果Y是正值表示我站在凳子或者床上,如果是负值表示我的脚在地板里,也就是说我要给房东修地板的钱)。

那么把物体从物体坐标系变换到世界坐标系的办法就是乘以一个变换矩阵,我们在DirectX里面是右乘一个变换矩阵。但是实际上是连续相乘了2个变换矩阵:旋转矩阵和平移矩阵。即

vecPosInWorld = vecPosInModel * MatModelToWorld

= vecPosInModel * (MatModelToWorldRotation * MatModelToWorldTranslation)    (1)

那么将物体从世界坐标系变换回物体坐标系的办法就是做相反的动作,自然的可以把物体在世界坐标系中的位置乘以相反的矩阵,即:

vecPosInModel = vecPosInWorld * MatWorldToModel                     (2)

而MatWorldToModel实际上就是MatModelToWorld的逆矩阵,即

MatModelToWorld = Inverse(MatWorldToModel);                    (3)

带入(3)到(2)中,得

vecPosInModel = vecPosInWorld * MatWorldToModel

= vecPosInWorld * Inverse(MatModelToWorld)

= vecPosInWorld * Inverse(MatModelToWorldRotation * MatModelToWorldTranslation)

= vecPosInWorld * Inverse(MatModelToWorldTranslation) * Inverse(MatModelToWorldRotation)

那么把物体变换回物体坐标系的话就需要先平移再旋转。