|
楼主 |
发表于 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);//正确,结果可行
原因我就不详细解释了,可以参照前面设置相机的情形进行理解。
最后,终于搞明白了这个问题,恭喜一下自己,写出来给大家共同分享一下,希望,不明白的人能搞明白。 |
|