web-dev-qa-db-ja.com

3Dベクトルからヨー、ピッチ、ロールを取得する方法

ある位置に適用された方向ベクトルがあり、カメラが見えるべきポイントを与えてくれます。 glRotatefを適切に使用するために、そのヨー、ピッチ、ロールからどのように取得できますか?

前もって感謝します

14
Jack

おそらく、実際にはヨー、ピッチ、ロールは必要ありません。正しい変換が必要です。 gluLookAtを使用してビルドしてみてください。 ドキュメント

8
sigfpe

方向ベクトルはどの方向を調べるか(ヨーとピッチ)しか教えてくれないため、方向ベクトルからヨー、ピッチ、ロールを取得することはできません。

ヨーとピッチを取得するには、三角法を使用します-ある程度の実用的な知識があると思います。角度を視覚化するためのいくつかの便利な図については、 このwikiページ を確認してください。

Y =ヨー、P =ピッチとします。

最初に必要なヨーを取得します。

tan(Y) = x/(-y)

今ピッチを取得するには:

tan(P) = sqrt(x^2 + y^2)/z

YとPの実際の値を取得するには、逆tanを使用する必要があります。上記では、tanを使用して導出を明確にしています。

マイナス記号は、角度と軸をどのように定義するかによって異なりますが、理解する必要があることに注意してください。

次に、ロールを0または好きなように設定できます。

16
pheelicks

これらの方程式はどれも「間違っている」ものではありませんが、すべて少し不器用です。 Ryder052、あなたの例はあなたがコメントしたように特定のケースを説明していません。なぜatan2を使わないのですか?

与えられた単位(正規化された)方向ベクトルd

pitch = asin(-d.Y);
yaw = atan2(d.X, d.Z)
14
jjhavokk

pheelicksの方程式は間違っています。親愛なる将来のグーグル、ここであなたは何が機能しているのかを手に入れました:

ピッチ:X軸による回転、ヨー:Y軸による回転、ロール:Z軸による回転を想定しています。方向ベクトルV(x、y、z)

pitch = asin(V.y / length(V));
yaw = asin( V.x / (cos(pitch)*length(V)) ); //Beware cos(pitch)==0, catch this exception!
roll = 0;
2
Ryder052