web-dev-qa-db-ja.com

ポイントを中心にカメラを回転させる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は、円の周りを移動する度数です。

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

27
Bryan Denny

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

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

または:

  • gluLookAtを使用して、カメラを円の中心に向け続ける

(*)回転機能は通常、原点を中心に回転します。別の点を中心に回転するにはPする必要があります:

  • 翻訳(-P)
  • 回転
  • 翻訳(P)
25
Alnitak

それは少し混乱しますが、私はあなたがすべきだと思います:

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

順序を変更しないでください。

10
neoedmund

カメラを回転させてシーン自体を回転させないという煩わしさを気にするのはなぜですか?
はるかに簡単です。 Originを中心にモデルビュー行列を回転させるだけです。まったく同じ結果が得られます。

2
shoosh

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

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

1
Drew Hall