質問

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()で解決する方がずっと簡単だと思います。カメラのパスを定義し(円は簡単です!)、「中心」を維持します。ポイント固定(つまり、あなたが見ているもの)。

可能な唯一のトリックは、良いベクトルを定義することですが、通常はあまり多くの作業は行いません。パスとターゲットポイントが同じ平面にある場合、毎回同じアップベクトルを使用できます!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top