左右手坐标系的差别
左右手坐标系的转换问题。
左右手坐标系的差别在于几个方面:
1. 首先左右手坐标系的摄像机坐标系的构造方式是不同的,区别在于右手坐标中摄像机坐标系的负Z轴方向代表了,摄像机的方向也就是。而左手坐标系中的正Z轴代表了摄像机方向。因此在左手坐标系中摄像机坐标系的Z轴是(Look at - eyepos)而右手坐标系中摄像机的Z轴则是(eyepos - Look at )因为右手坐标系中Z轴和摄像机方向相反。接下来对于用户定义的摄像机Up方向也就是摄像机坐标系的Y轴,左右手坐标系都是相同的,最后是摄像机的Right方向(摄像机的X轴)定义为Z Cross Y 这里Cross代表叉积的意思,这个叉积的结果是什么呢,结果是得到一个垂直于Z和Y组成平面的一个向量。关于叉积的这个向量他是符合从Z转到Y的左右手旋转法则的为什么说左右手,这是因为如果世界坐标系是右手坐标系的话,那么这个Right向量的计算结果符合右手螺旋法则。如果在左手坐标系中的话则符合左手螺旋法则。举个非常简单的例子。如果摄像机的Z轴向量在世界坐标系中的坐标是(1,0,0)也就是世界坐标系中的X轴,Y轴向量在世界坐标系中的坐标是(0,1,0),那么摄像机Z轴的世界坐标 =摄像机 Y的世界坐标 Cross 摄像机 Z轴的世界坐标 = (0 ,1 ,0)Cross (1,0,0)= (0,0,-1)也就是说最后摄像机X轴的世界是世界坐标系中的负Z方向。如果你在纸上分别画出2个坐标系的话,就可以知道在左手坐标系中使用左手法则从Y轴转到X轴是负Z轴方向,在右手坐标系中则是使用右手法则从Y轴转到X轴是负Z轴方向。
那么这么做有什么好处呢。这样一来如果你朝向摄像机的方向(注意是摄像机方向不是摄像机的Z方向因为右手坐标系中摄像机是负Z方向)并且你的脚向头部朝向摄像机的Y方向那么你的右边就是摄像机的Right(X轴)方向了,这是符合常理的因为不管D3D还是OpenGl都是把正X的点画在屏幕的右方,负X的点画在屏幕的左方的,如果你的右边是摄像机X轴的负方向那么原先你期待画到右边的点最终会按照屏幕做了个反射,其结果就是图形和所想得左右颠倒。因为图形API只认X轴的正负,并不知道X轴到底在你的哪一边。这里要注意我说的这种状态必须是和摄像机坐标系的构造方式和世界坐标系的左右手坐标系相一致才能够,达到。具体来说
1:如果在左手世界坐标系中你必须将摄像机的Z轴定位摄像机的方向然后计算Right方向这样计算出来的Right方向才能够符合前面所说的面朝摄像机方向(摄像机正Z轴)然后脚到头的向量和摄像机Y轴一致,这时候Right向量才会在你的右边。>.<不高兴画图了,有疑问的话可以自己试一下。
2:如果右手世界坐标系的话你必须将摄像机的负Z轴定位摄像机的方向然后计算Right方向这样计算出来的Right方向才能够符合前面所说的面朝摄像机方向(摄像机负Z轴)然后脚到头的向量和摄像机Y轴一致,这时候Right向量也会在你的右边。
3:如果你非要在左手世界坐标系中使用 (2)的摄像机坐标构造方法也就是把负Z轴定位摄像机的方向然后计算Right方向,你会发觉你死的很惨,因为最终的Right方向并不会在你的右边而是到了你的左边。最终结果就是,,,左右图像颠倒。事与愿违不相信你也可以自己画张图试试看是不是这样构造出来的Right方向到了你的左边。。。
4:如果你非要在右手世界坐标系中使用 (1)的摄像机坐标构造方法也就是把Z轴定位摄像机的方向然后计算Right方向,你同样会发觉你死的很惨,因为最终的Right方向并不会在你的右边而是到了你的左边。最终结果也是,,,左右图像颠倒。事与愿违。
5:如果你已经处于3 ,4的状态又不想在视矩证的构造上作改动。。那么唯一的方法就是去改投影矩阵通过在投影矩阵中将X坐标取翻,具体就是在D3D中将投影矩阵第一列取反,在Opengl中将投影矩证第一行取反。但是这样做完全属于职能划分不明确,因该由视矩阵完成的事情却交给了投影矩阵去做
今天先写到。改天在用数学简单推导以下使用Opengl和D3D的视矩证和投影矩阵为什么会画出左右颠倒的2负图像。
fish.shadow song 若愚.影歌
posted on 2008-10-18 13:29 fish.shadow song(若愚.影歌) 阅读(2200) 评论(1) 编辑 收藏 举报