查看: 1610|回复: 4

osg的坐标系问题

[复制链接]

该用户从未签到

发表于 2014-7-13 11:34:53 | 显示全部楼层 |阅读模式
《海军osg教程》里面有下面一段话:
通常osgGA::MatrixManipulator矩阵(osgProducer::Viewer中使用)使用的坐标系为Z轴向上。但是Producer和
osg::Matrix(也就是上文所创建的)使用Y轴向上的坐标系系统。因此,在获得逆矩阵之后,
我们需要将其从Y轴向上旋转到Z轴向上的形式。这一要求可以通过沿X轴旋转-90度来实现。
我感觉我都被这句话给搅乱了:
1.osg的世界坐标系为,z轴向上,y轴垂直屏幕向里,x轴水平向右,这个没有问题吧?
2.为什么旋转的时候的坐标系就和世界坐标系不一样?
3.这个转90度到底该怎么理解,看到很多地方都加90度?
4.转动相机的时候有这个坐标不一样,需要转90度,那么转动物体时呢?
5.如果不设定相机的ViewMatrix,相机的初始位置,姿态是什么样的?是因为
  初始姿态的原因才需要转90度的吗?
6.3d max 导出obj文件时,有一个“翻转yz轴”选项,这个和osg的坐标系有什么联系,
  3d max的坐标系和osg世界坐标系是一致的,那么到底要不要勾选“翻转yz轴”?
关于坐标系这块,总感觉没搞明白,希望大家能指点一下。

该用户从未签到

发表于 2014-7-14 10:50:13 | 显示全部楼层
这个需要了解各种坐标系。世界坐标系,眼坐标系,局部坐标系等概念。每个坐标系如何定义,关系如何?这需要去系统的了解。

该用户从未签到

 楼主| 发表于 2014-7-14 19:32:08 | 显示全部楼层
fenma3422 发表于 2014-7-14 10:50
这个需要了解各种坐标系。世界坐标系,眼坐标系,局部坐标系等概念。每个坐标系如何定义,关系如何?这需要 ...

谢谢,可以推荐一些参考资料吗,我不知道该看什么内容。

该用户从未签到

 楼主| 发表于 2014-7-15 10:46:48 | 显示全部楼层
我开的帖子,还是我自己来结束吧。
1.osg的世界坐标系,z上,x右,y里,毫无疑问,采用3d max 建模时,其坐标虽然
  与osg世界坐标系一致,但导出为obj文件时,必须选择“翻转yz轴”否则,坐标系
  会出问题,但是导出为3ds文件时,或者采用Creator建模,则不存在这样的问题。obj
  文件为何会这样,不太清楚。
2.旋转90度的原因可以理解为,相机最初的位置为:eye=(0,0,0),center=(0,0,-1),
  lookat=(0,1,0),可见相机最初在原点,朝向z轴负向观察,但通常我们并不希望俯瞰
  所以要旋转90度,这里应该是绕x轴逆时针转90度,此时相机朝向y轴正向。
3.接下来就可以按照自己希望的那样设计相机的位置和俯仰了,

osg::Matrixd myCameraMatrix;
        osg::Matrixd cameraRotation;
        osg::Matrixd cameraTrans;
        cameraRotation.makeRotate(
                osg:egreesToRadians(0.0), osg::Vec3(0,1,0), // 滚转角(Y轴)
                osg::DegreesToRadians(-15.0), osg::Vec3(1,0,0) , // 俯仰角(X轴)
                osg::DegreesToRadians( 5.0), osg::Vec3(0,0,1) ); // 航向角(Z轴)
        cameraTrans.makeTranslate( 10,-330,145 );
        myCameraMatrix = cameraRotation * cameraTrans;
osg::Matrixd i = myCameraMatrix.inverse(myCameraMatrix);
viewer.getCamera()->setViewMatrix(i*osg::Matrix::rotate( -osg:I_2, 1, 0, 0 ));
这里要补充两点:a.setViewMatrix设置的是相机在世界坐标系姿态矩阵的逆矩阵,这也就是为
什么需要inverse一下。b.为什么逆矩阵后面乘了一个-PI/2的旋转矩阵?首先,前面已经解释了
为什么要乘90的旋转矩阵,第二点,正常的写法应该是:
myCameraMatrix =osg::Matrix::rotate( osg::PI_2, 1, 0, 0 )* cameraRotation * cameraTrans;
i= myCameraMatrix.inverse(myCameraMatrix);
viewer.getCamera()->setViewMatrix(i);
这样好理解了吧,先转90度,再调整姿态,最后调整位置,然后得到逆矩阵,这种写法和前面的写法是
等效的,但是这种写法更好理解。

最后再补充一下,下面这两种写法也是可行的,但是前提是要设置一个CamaraManipulator,否则会报错,
viewer.getCameraManipulator()->setByInverseMatrix(i*osg::Matrix::rotate( -osg::PI_2, 1, 0, 0 ));//正确,这种结果可行
viewer.getCameraManipulator()->setByMatrix(osg::Matrix::rotate( osg::PI_2, 1, 0, 0)*myCameraMatrix);//正确,结果可行
原因我就不详细解释了,可以参照前面设置相机的情形进行理解。
最后,终于搞明白了这个问题,恭喜一下自己,写出来给大家共同分享一下,希望,不明白的人能搞明白。

该用户从未签到

发表于 2014-7-15 22:09:48 | 显示全部楼层

从我不多的经验来看,遵从opengl坐标系的,到osg里面,绕x轴砖90度,就回正了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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