カメラをポイントの周りに回転させるOpenGL
質問
OpenGLでは、ポイントからカメラを回転させようとしていますが、カメラはポイントから距離rで、回転するときにポイントに面しています。言い換えると、カメラは中心から半径rの円の円周に沿って移動し、カメラは円周に沿った任意の点で中心に向かいます。
3D空間で円の中心は(3、0、3)であるとしましょう;
試しました:
// move to center of circle
glTranslatef(-3, 0, -3)
// move a distance away from the circle
glTranslatef(0, 0, r);
// rotate along the y "up" axis
glRotatef(CameraAngle, 0, 1, 0);
CameraAngleは、円の周りを移動する度数です。
私の最終結果は、カメラが円の中心ではなく、原点に沿って回転していることです。誰でもこの問題の解決を手伝ってくれますか?ありがとう!
解決
次のいずれかが必要です:
- カメラを原点の周りで回転させてから、変換します(*)
または:
-
gluLookAt
を使用して、カメラを円の中心に向けておく
(*)回転関数は通常、原点を中心に回転します。別のポイント P
を中心に回転するには:
- translate(-P)
- 回転
- translate(P)
他のヒント
少しわかりにくいですが、次のようにする必要があります。
// move camera a distance r away from the center
glTranslatef(0, 0, -r);
// rotate
glRotatef(angley, 0, 1, 0);
glRotatef(anglex, 1, 0, 0);
// move to center of circle
glTranslatef(-cx, -cy, -cz)
順序は変更しないでください。
なぜカメラ自体を回転させずに、シーン自体を回転させないのが面倒なのでしょうか?
もっと簡単です。 modelviewマトリックスを原点の周りで回転させるだけです。まったく同じ結果が得られます。
このような問題は、gluLookAt()で解決する方がずっと簡単だと思います。カメラのパスを定義し(円は簡単です!)、「中心」を維持します。ポイント固定(つまり、あなたが見ているもの)。
可能な唯一のトリックは、良いベクトルを定義することですが、通常はあまり多くの作業は行いません。パスとターゲットポイントが同じ平面にある場合、毎回同じアップベクトルを使用できます!
所属していません StackOverflow