0

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で、適切なツールがインストールされていれば、箱から出してすぐに機能するはずです。

4

1 に答える 1

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  ]

編集:

これは、オブジェクトをそれ自体ではなく、原点を中心に回転させる一般的な方法であることに注意してください。

于 2012-07-22T15:54:17.557 に答える