1

私の Direct3D アプリケーションでは、マウスまたは矢印キーを使用してカメラを移動できます。しかし、上方向ベクトルとして (0,1,0) をハードコーディングするLookAtLHと、カメラの向きによってはフレームが空白になります。

Y軸に沿って見ると、(0,1,0)が上方向として機能しなくなるという難しい方法を学びました(明らかですか?)。これらの特殊なケースごとに、上方向を別のものに切り替えることを考えています。これを処理するより優雅な方法はありますか?

4

2 に答える 2

4

前方を指すベクトル (あなたが見ているもの - あなたの位置) と右を指すベクトル (回転できない限り常に XZ 平面上) を計算できると仮定します。これらの両方のベクトルを正規化すると、上が前方 x 右になります (x は外積)。

一般に、ヨー、ピッチ、ロールを回転マトリックスに接続し、軸ベクトルを回転させて右、上、前に移動できますが、それは LookAtLH を使用して回避していると思います。

http://en.wikipedia.org/wiki/Rotation_matrix#The_3-dimensional_rotation_matriciesを参照してください。

于 2008-10-31T11:06:33.410 に答える
1

これを適切に処理するには、単位クォータニオンを使用します。クォータニオンは、3D 空間での方向をエンコードする 4 つの値のベクトルであり (一部の記事で主張されているような回転ではありません)、単位クォータニオンは、ベクトルの長さが sqrt(x^2+y^2+z^2+w^ 2) は 1.0 です。行列を使用して回転をエンコードすることに似た、クォータニオンを操作するための一連の数学演算があり、クォータニオンは縮退した向きを表すことができないという追加のボーナスがあります。結果を GPU に供給する必要がある場合は、クォータニオンを 3x3 または 4x4 行列に自由に変換できます。

問題は、カメラを動かしているときに、カメラの上方向に少しひねることです。反復ごとにカメラを強制的に (0,1,0) ベクトルの中心に再設定することで、実質的にカメラを回転させ、カメラの向きをクランプして球の表面にとどめますが、カメラがこの球の極には「上」を呼び出すのに適した方向がなく、マトリックスが特異になり、サイズがゼロのポリゴンが表示されます(したがって、黒い画面)。クォータニオンには、これらの極を補間して反対側に問題なく出力する機能があり、常に有効な行列が得られます。あなたがしなければならないのは、「ねじれ」を制御することだけです。

このねじれを測定するには、書籍 Graphics Gems 4 の Ken Shoemake の記事「Fiber Bundle Twist Reduction」を読む必要があります。彼は、この蓄積されたねじれを測定する良い方法と、不快な場合にそれを取り除く方法を示しています。

于 2008-11-06T00:04:08.340 に答える