1

私の OpenGL アプリケーションには、キーボード (動き) とマウス (見回す) を使用して制御されるカメラがあります。

今まではすべて問題なく動作していましたが、カメラを Y 軸で 300 を超えて動かすと、マウスを動かしたときにカメラがおかしくなり始めることに気付きました。たとえば、Y = 310 に移動してマウスを上に移動すると、マウスが上を向くと同時に左に回転し始めます。

この理由が何であるかはわかりません。誰でも助けることができますか?

gluLookAt() の前方位置と上方位置を計算するコードは次のとおりです。

二重cosR、cosP、cosY; // double sinR、sinP、sinY からの sin/cos の一時値; //入力されたロール/ピッチ/ヨー

if(Yaw > 359) Yaw = 0;
if(Pitch > 359) Pitch = 0;
if(Yaw < 0) Yaw = 359;
if(Pitch < 0) Pitch = 359;


cosY = cosf(Yaw*3.1415/180);
cosP = cosf(Pitch*3.1415/180);
cosR = cosf(Roll*3.1415/180);
sinY = sinf(Yaw*3.1415/180);
sinP = sinf(Pitch*3.1415/180);
sinR = sinf(Roll*3.1415/180);

//forward position
forwardPos.x = sinY * cosP*360;
forwardPos.y = sinP * 360;
forwardPos.z = cosP * -cosY*360;

//up position
upPos.x = -cosY * sinR - sinY * sinP * cosR;
upPos.y = cosP * cosR;
upPos.z = -sinY * sinR - sinP * cosR * -cosY;
4

1 に答える 1

8

ジンブルロック。 ここで説明します。

四元数は、この問題に対する標準的な解決策です。

簡単に言うと、上記の計算で 2 つの軸の角度が互いに近づくと、利用可能な動きが失われます。これを防ぐには、4 番目の自由度が必要です。これは、Quaternion 数学が許可するものです。

于 2013-04-11T22:47:32.840 に答える