29

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 は円の周りを移動する角度です。

私の最終結果は、カメラがまだ円の中心ではなく、原点に沿って回転していることです。誰でもこの問題を解決するのを手伝ってもらえますか? ありがとう!

4

4 に答える 4

29

次のいずれかを行う必要があります。

  • 原点を中心にカメラを回転させてから平行移動します (*)

また:

  • gluLookAtカメラを円の中心に向けたままにするために使用します

(*) 回転関数は通常、原点を中心に回転します。別のポイントを中心に回転するには、次のPことを行う必要があります。

  • 翻訳(-P)
  • 回転する
  • 翻訳(P)
于 2008-11-13T17:48:52.880 に答える
13

少し混乱しますが、次のようにする必要があると思います。

// 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)

順序を変更してはならないことに注意してください。

于 2009-04-03T07:18:55.263 に答える
2

シーン自体を回転させずに、カメラを回転させるのに苦労するのはなぜですか?
それははるかに簡単です。モデルビューマトリックスを原点を中心に回転させるだけです。まったく同じ結果が得られます。

于 2008-11-13T18:49:38.733 に答える
1

このような問題は、gluLookAt() を使用すると簡単に解決できます。カメラのパスを定義し (円は簡単です!)、「中心」点 (つまり、見ているもの) を固定します。

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

于 2008-11-13T17:53:41.203 に答える