2

球面上の点を中心とする 3D カメラがあります。それは、球の極を除いて、その周りを完全に追従し、回転します。球は実際には、位置座標の管理を容易にするために球に投影された立方体であることに注意してください。

オブジェクトが球の周りを水平に移動する場合、カメラは意図したとおりに機能します。ただし、オブジェクトが球体の上部または下部の極に向かって移動する場合、カメラは極の周りをラップします。ポールをまっすぐ通過すると、180 度回転して通過するように見えます。

なぜこれが起こっているのか理解しています。カメラが自分自身の向きを知るには、グローバル アップ ベクトルが必要です。アップ ベクトルを別の方向 (Right など) に変更すると、カメラは上部または下部の極を中心にフリップしなくなりますが、代わりに、球体の左右の極で同じ動作を示します。

私の質問は、これが起こらないようにカメラの動作を変更する方法です。私が望むのは、カメラが一定の位置にあり、球体を見て、球体が X 軸と Z 軸を中心に回転しているようにカメラが感じるようにすることです。

これにより、「間違った」向きになる可能性があることを認識しています。たとえば、ユーザーが球の前面から開始し、上に移動してから左に移動すると、最終的に球の左側になりますが、カメラは90度回転しますZ 軸上で 20 度回転しますが、前面から開始して直接左面に移動した場合、回転はありません。カメラが顔を横切ったことを検出し、カメラのローカル回転をゆっくりと「修正」するか、ユーザーがカメラのロックを解除できるようにして、カメラの角度を自分で処理できるため、これは問題ありません。

参考までに、私のカメラは現在、この質問のソリューションを使用して計算されています: カメラの回転は任意の平面に位置合わせされています

どんな洞察もいただければ幸いです!

4

1 に答える 1

1

球体をトラックボールのように動作させたい場合は、ユーザー コントロールで指定された回転マトリックスにインクリメンタル回転 (x 軸と y 軸など) を適用します。

更新後に回転行列を「再正規化」する必要があります。そうしないと、数値エラーが入り込み、回転行列は最終的に回転行列ではなくなります。計算は次のようになります。

update =  RotX(userInput.dX) * RotY(userInput.dY)
rawUpdatedRot = userRot * update
newZ = Normalize( Cross(rawUpdatedRot.x, rawUpdatedRot.y) )
newY = Normalize( Cross(newZ, rawUpdatedRot.x) )
newX = Normalize( rawUpdatedRot.x )
userRot = Matrix(newX, newY, newZ)
于 2013-03-26T17:23:41.680 に答える