0

gluLookAt 関数のパラメーターを変更することで、ユーザーが自分自身を見回すことができる単純なアプリケーションを実装しようとしています。次の方法で y 軸を中心とした回転を実装しました。

float cx1;
float cz1;

float d1 = cx - eyex;
float d2 = cz - eyez;

cx1 = d2*sin(alfa*PI / 180) + d1*cos(alfa*PI / 180);
cz1 = d2*cos(alfa*PI / 180) - d1*sin(alfa*PI / 180);
yRotationAngle = yRotationAngle +alfa;

cx = cx1 + eyex;
cz = cz1 + eyez;

これは正常に機能しますが、x 軸を中心に回転しようとすると、目的の動作が得られません。カメラを「上」と「下」に回転させたかったのですが、その瞬間に私がいる特定の方向に向けました。x 軸を中心に回転するコードは、次のように実装されています。 float d1 = cy - eyey; float d2 = cz - eyez;

//rotate around x
cy1 = cos(angleToRotate) * d1 - sin(angleToRotate) * d2;
cz1 = sin(angleToRotate) * d1 + cos(angleToRotate) * d2;

cy = cy1 + eyey;
cz = cz1 + eyez;

xを中心に回転する前に、y軸を中心に逆回転する必要がありますか? もしそうなら、回転するのに必要な角度の値は?

4

1 に答える 1

1

2 番目の回転の計算は、現在の位置を基準にして適用するため、少し複雑になります。しかし、現在の角度を追跡し、カメラを回転させるときに角度を加算/減算すれば、この全体をはるかに簡単にできると思います。基本的に、主に球座標空間で操作し、回転を適用するときにデカルト座標のみを計算します。

これを行うには、2 つの角度が必要です。次の命名法を使用します。

  • yawAng: z 軸を基準にして測定された、y 軸を中心とした現在の回転角度。
  • pitchAng: xz 平面に対する角度。上向きは正 (正の y 方向、下向きは負)。

これにより、基本的なカメラの回転は単純にこれらの角度の増分/減分になります。の増分angInc:

  • 左:yawAng += angInc
  • 右:yawAng -= angInc
  • 上:pitchAng += angInc
  • 下:pitchAng -= angInc

次に、gluLookAt()変換を適用するときに、標準の式を使用して球座標をデカルト座標に変換します。dカメラと中心の間の距離:

cx = eyex + d * sin(yawAng) * cos(pitchAng);
cy = eyey + d * sin(pitchAng)
cz = eyez + d * cos(yawAng) * cos(pitchAng);
于 2014-12-25T01:27:51.417 に答える