0

d. 方向を見ている一人称カメラを持つ。

カメラをターゲット t (関連付けられた方向 d2) に向けさせるには、d を何らかの軸を中心に回転させる必要がありますよね? この軸はカメラを通り、d と d2 によって形成される平面に垂直でなければなりませんよね?

ベクトル d をフレームごとにある程度回転させているとします。回転軸は変化しないはずです。これは、d がゆっくりと d2 に近づいているにもかかわらず、対応する平面が変化しないからです。

それがすべて本当なら、なぜ以下の例の回転軸が呼び出しごとに変化するのか疑問に思っています。回転は正確に機能しますが、回転の開始から終了まで速度が低下します。

この投稿は、ソース コードも確認できる現在の質問 hereのコンテキストからのものです。

4

1 に答える 1

0

指している方向_rotationAxisは変化していないため、あなたが述べた回転方向は一定で正しいです。ただし、大きさ_rotationAxisが変化しているため、x、y、z コンポーネントの値が異なり、回転量も異なります。

交差を実行して回転軸を取得すると、結果のベクトルの長さは、交差した 2 つのベクトルの長さと、それらを分離する角度の関数になります。結果のベクトルの方向は、2 つの入力ベクトルの両方に対して常に 90 度です。

ほとんどの場合、使用している 2 つのベクトルの長さは一貫しており、単位の長さである可能性が最も高いですが、フレームごとにそれらの間の角度が小さいため_rotationAxis、フレームごとに異なる長さになります。

Xna では、生成される回転の量は、CreateFromAxisAngleプラグインする角度だけでなく、軸ベクトルの長さによっても決定されます (ドキュメントでは明らかではありませんが、それでもなお真実です)。したがって、各フレームで使用する回転軸がどんどん短くなり、フレームごとに回転量がどんどん小さくなります。回転軸ベクトルの長さが 1.0 (単位長ベクトル) の場合にのみ、プラグインした回転角度になります。

で使用する前に、 を正規化し_rotationAxisて単位長にする必要がありCreateFromAxisAngleます。

_rotationAxis = Vector3.Cross(Direction, _flyTargetDirection);
_rotationAxis.Normalize();
_rotation = Matrix.CreateFromAxisAngle(_rotationAxis, MathHelper.ToRadians(_flyViewingSpeed - Math.ToRadians(rotationSpeed)));
于 2012-10-09T20:10:56.590 に答える