我正试图围绕世界的Y
轴旋转相机,在我的项目中用3D十字标记。
我所完成的是围绕它自己的轴旋转,这很酷,但这不是我想要的。
如何通过使用四元数和一些数学来实现这一点,而不是osg::PositionAttitudeTransforms
或任何易于使用但难以理解的基础设施。
我想了解它背后的数学原理。
相关代码是
osg::Matrixd camM;
std::stringstream oss;
osg::Quat x_rot_q(osg::DegreesToRadians(-DEG), osg::Vec3d(1.0, 0.0, 0.0));
osg::Quat y_rot_q(osg::DegreesToRadians(DEG), osg::Vec3d(0.0, 1.0, 0.0));
camM = cameraManipulator->getMatrix();
camM.makeRotate(x_rot_q * y_rot_q);
camM.setTrans(250.0, 300.0, 250.0);
cameraManipulator->setByMatrix(camM);
osg::Quat y_delta_trans(osg::DegreesToRadians(DEG_DELTA), osg::Vec3d(0.0, 1.0, 0.0));
while(!viewer.done()) {
oss.str(std::string());
oss.clear();
camM = cameraManipulator->getMatrix();
camM.makeRotate(camM.getRotate() * y_delta_trans);
camM.setTrans(250.0, 300.0, 250.0);
cameraManipulator->setByMatrix(camM);
oss << getMatrixRepresentation(camM);
hudGeode->setStatus(oss.str());
viewer.frame();
}
您可以在文件Simple.cpp
的底部找到。整个项目可以在本次修订中找到要点。
在GNU/Linux盒子上,只需键入make
,就可以在安装了适当工具的情况下开箱即用。
绕另一个轴旋转相机相当简单,只需按顺序执行以下步骤:
- 将相机平移到世界的原点
- 如果相机相对于世界原点位于(Xc,Yc,Zc),则意味着(-Xc,-Yc,-Zc)的翻译
- 按您希望的旋转方式旋转相机
- 反转先前的翻译,即执行(Xc,Yc,Zc)的翻译
或者在数学上作为矩阵乘积:
[ 1 0 0 -Xc ] [ 1 0 0 Xc ]
Transformation Matrix = [ 0 1 0 -Yc ] Rotation Matrix [ 0 1 0 Yc ]
[ 0 0 1 -Zc ] [ 0 0 1 Zc ]
[ 0 0 0 1 ] [ 0 0 0 1 ]
编辑:
请注意,这是绕原点旋转对象的一般方法,而不是绕其自身的原点旋转对象。