2

関数 D3DXMatrixLookAtLH() の説明では、z 軸が normal( AtVec - EyePosVec ) の結果であることがわかっているため、x 軸は " normal( cross ( UpVec , z-axis ) ) " に等しくなります。 time 、問題なく行列を計算できます。

ただし、通常、 UpVecは (0, 1, 0) ですが、特別な状況下では、z 軸と UpVec を平行にすることができます。したがって、(私が思うに)y 軸と x 軸がゼロベクトルになるため、適切なカメラ基盤を構築することはできません。では、どうすればこれを修正できますか? または私は何か間違っていますか?

4

2 に答える 2

2

ビュー変換を定義するには、直交基底を計算する必要があります。これは、互いに直交し、単位長を持つ基底ベクトルのセットです。

単位長基準は、ベクトルを正規化することで簡単に達成できます。

外積は、ベクトルを直交させるために使用されます。すでに述べたように、最初に x ベクトルが直交化され、その後、直交化することによってアップ ベクトルが再計算されます。

x 軸 (右方向) は常にビュー方向とアップ ベクトルに依存します。(0, 1, 0) のアップ ベクトルを想定すると、x 軸はビュー方向のみに依存します。以下にいくつかの例を示します (ビューの方向は常に同じ平面にあります)。

ビジュアライゼーションを表示

ビューの方向がアップ ベクトルを通過し、その側が変わると、右のベクトルが反転することがわかります。これが、アップ ベクトルとビュー方向が平行である場合に計算が失敗する理由です。右のベクトルがどこを指すかを決定する方法はありません (その結果、クロス積がゼロになります)。これらのベクトルを使用してシーンをレンダリングすると、ビュー方向がアップ ベクトルを通過すると、イメージが水平方向に反転することがわかります。

y 軸に平行なビュー方向を指定する場合は、平行ではないアップ ベクトルを指定する必要があります。これにより、妥当な右ベクトルを計算することができます。

もちろん、特定の右ベクトルを で固定したい場合は、アップ ベクトルを計算できますup = cross(direction, right)

于 2013-08-19T10:06:39.987 に答える
1

したがって、(私が思うに)y 軸と x 軸がゼロ ベクトルになるため、適切なカメラ基盤を構築することはできません。

はい、これは以下のような特殊なケースを作成した場合に発生します。

lookAt = D3DXVector3(0, 0, 0);
eyePos = D3DXVector3(0, Y, 0);

正確に言えば、結果は不正確なマトリックスではなく、シーンに注目して表示される単なるマトリックスです。

では、どうすればこれを修正できますか?

これを防ぐために、応答を行う必要があります。

于 2013-08-19T09:39:20.223 に答える