ユーザーが一人称カメラを制御し、動きが球の内面に制限される 3D ゲームをプログラミングしています。動きを制限することはできましたが、クォータニオンを使用してカメラの向きを管理する方法がわかりません。理想的には、カメラ アップ ベクトルは球の法線に沿ってその中心を指し、ユーザーがどこに移動しても、常に球の底にいるかのように自由に見回すことができる必要があります。
2 に答える
おそらく、カメラの向きを表す 2 つのベクトルがあるとします。1 つはカメラの向きに対してどの方向が上であるかを説明するもので、もう 1 つはカメラが向けられている方向を示すものです。また、ある時点でカメラが配置されている位置もあります。たとえば、次のように指定された正規の向きと位置を定義します。V'up
V'norm
p'
Vアップ= <0, 1, 0> Vノルム= <0, 0, 1> p = <0, -1, 0>
クォータニオン回転q
を指定すると、これらのベクトルに回転を適用して次のようになります。
V' up = q V up q -1 V'ノルム= q Vノルムq -1 p' = q p q -1
特定の状況ではq
、カメラに適用する最終的な回転をもたらすさまざまな回転を増分的に蓄積するように定義します。その効果は、あなたが説明しているもののように見えるということです。つまり、静的に方向付けられ、配置されたカメラの周りで球体を移動するのではなく、静的に方向付けられて配置された球体の内部でカメラを移動します。
各増分は、ベクトル を中心とした角度 θ の回転によって計算されます。V = V'up x V'norm
クォータニオンは通常、自由空間の動き (フライト シムなど) でのジンバル ロックを回避するために使用されます。あなたの場合、実際にはジンバル効果が必要です。これは、直立を強制されたカメラが、ほぼ真っ直ぐ上または下を向く必要がある場合、必然的に奇妙な動作をするためです。
カメラが向いている方向を示す緯度/経度のペアとして、カメラの向きを表すことができるはずです。