查看: 2418|回复: 10

关于摄像机姿态矩阵的疑惑

[复制链接]

该用户从未签到

发表于 2010-11-28 12:58:01 | 显示全部楼层 |阅读模式
我总感觉姿态矩阵应该是平移矩阵乘以旋转矩阵,而不应该是旋转乘以平移,应为如果先旋转的话,坐标系的方向就被改变了,再平移就相当于不是在世界坐标系中平移了,而是在旋转之后的坐标系中平移了(除非在视口变换的时候是左乘矩阵),也就谈不上在世界坐标系中的姿态了,当然,这是我以前在opengl中写漫游的想法,可能osg有所不同,有人能大致解释下么?
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2010-11-28 22:02:01 | 显示全部楼层
    在OSG里写漫游分为两种,一种是直接在viewer里添加matrixmanipulator,这个比较简单,例子大把。只需要照样在matrixmanipulator下重载一个就可以了。教程专区下面有osg 程序设计里面介绍的就有。

    另一种是对当node加到scenedata中的camera进行操作,这个需要在事件中调用camera进行setViewMatrixAsLookAt,要深刻理解其中的三个参数。

    比如点W向前可以这样做:理解了就知道该如何写了,其实和重载matrixmanipulator是一样的
                                                    camera->getViewMatrixAsLookAt(eye, center, up);
                                                    osg::Vec3 delta = center-eye;
                                                    eye = eye + delta/2.0;
                                                    camera->setViewMatrixAsLookAt(eye, center, up);

    该用户从未签到

    发表于 2010-11-29 08:05:33 | 显示全部楼层
    OpenGL中采用列矩阵右乘列向量来进行矩阵计算,因此顶点先旋转(R)后平移(T)被表达为T * R * v
    OSG中采用行矩阵左乘行向量的方法来运算,因此是v * R * T,这显然更符合一般的认知;并且OpenGL中对于矩阵接口的使用事实上是混乱的,OSG更正并统一了这一点

    该用户从未签到

    发表于 2010-11-29 11:24:32 | 显示全部楼层
    那还是先旋转再平移啊,这样跟lz说的有什么差别吗

    该用户从未签到

    发表于 2010-11-29 12:58:28 | 显示全部楼层
    最符合一般需要的当然是先旋转再平移。不过楼主似乎有别的想法,因此这里给出了一些解释

    该用户从未签到

     楼主| 发表于 2010-11-29 21:53:23 | 显示全部楼层
    5# array 我没有什么别的想法,如果R*T是眼空间到世界空间的变换,假设现在照相机在世界坐标系中的位置是osg::Vec3 v(posX,posY,posZ),最开始两坐标系是重合的,如果先旋转,再平移,那么平移后的位置在世界坐标系中还是v么?显然已经不是了,另一方面,从世界到眼空间的转换矩阵是前面两个矩阵相乘的逆矩阵,也就是(R*T)'=T'*R',这时候又是先平移,显然世界坐标系和眼坐标系是有旋转夹角的,所以在世界空间中T代表的平移方向和眼空间中T'代表的平移方向是不平行的,这就说明用这个矩阵来做变换前后不能统一,

    该用户从未签到

     楼主| 发表于 2010-11-30 09:14:23 | 显示全部楼层
    今天一大早就起来做了几个小测试,终于搞清楚了,由于osg采用的是右乘矩阵,所以在变换过程中矩阵是往左叠加,举个例子,先进行T1变换,然后进行T2变换,最后进行T3变换,那么最终的变换矩阵就是T3*T2*T1,这是经过我严格测试的,在osg里面变换顺序和解释顺序是相反的,这样就很好的解释了前面我提出的问题,实际上还是先进行的平移变换,然后再进行旋转变换。多谢各位热心帮忙

    该用户从未签到

     楼主| 发表于 2010-11-30 09:23:40 | 显示全部楼层
    3# array 更正一下,先旋转后平移的变换在opengl中是R*T*V,而在osg中应该是V*T*R

    该用户从未签到

    发表于 2010-12-2 09:47:06 | 显示全部楼层
    在osg里面变换顺序和解释顺序是相反的
    我认为您完全说错了

    先旋转后平移的变换在opengl中是R*T*V,而在osg中应该是V*T*R
    恰恰,在OSG中应当为v * R * T

    该用户从未签到

     楼主| 发表于 2010-12-30 13:24:22 | 显示全部楼层
    9# array 其实您说的和我说的结果是一样的,您解释v*R*T变换为先旋转再平移,您的参考坐标系至始至终都没变化,都是以最开始的坐标系为参考,第一步v*R得到的是点经过旋转后在最初坐标系中的坐标,这样后面的平移变换还是相对最初坐标系而言的,而不是相对经过旋转后的坐标系而言的,所以*T变换的相对性没有改变,而我解释的先平移再旋转则不一样,它是先经过平移变换,然后再进行旋转变换,这里的旋转变换是相对平移后的坐标系而言的,而不是以最初的坐标系为参考的,这里两种解释的结果其实是一样的,只是参考系不同而已。

    该用户从未签到

    发表于 2011-4-8 16:14:35 | 显示全部楼层
    回复 2# FreeSouth


        是不是用了第一种方法后,再用第二种方法就失效了?
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    OSG中国官方论坛-有您OSG在中国才更好

    网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

    联系我们

    • 工作时间:09:00--18:00
    • 反馈邮箱:1315785073@qq.com
    快速回复 返回顶部 返回列表