围绕世界的Y轴旋转相机(在O(0,0,0)处)

时间:2012-07-22 15:23:30

标签: c++ opengl 3d linear-algebra openscenegraph

我试图围绕世界的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的底部找到它。整个项目可以在this revision in a gist找到。

在GNU / Linux机器上,只需键入make,它就可以在安装了适当工具的情况下开箱即用。

1 个答案:

答案 0 :(得分:3)

围绕另一个轴旋转相机非常简单,只需按顺序执行以下步骤:

  • 将相机翻译成您世界的起源
    • 如果相机位于(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  ]

编辑:

请注意,这是围绕原点旋转对象的一般方法。