ある位置に適用された方向ベクトルがあり、カメラが見えるべきポイントを与えてくれます。 glRotatefを適切に使用するために、そのヨー、ピッチ、ロールからどのように取得できますか?
前もって感謝します
おそらく、実際にはヨー、ピッチ、ロールは必要ありません。正しい変換が必要です。 gluLookAt
を使用してビルドしてみてください。 ドキュメント 。
方向ベクトルはどの方向を調べるか(ヨーとピッチ)しか教えてくれないため、方向ベクトルからヨー、ピッチ、ロールを取得することはできません。
ヨーとピッチを取得するには、三角法を使用します-ある程度の実用的な知識があると思います。角度を視覚化するためのいくつかの便利な図については、 このwikiページ を確認してください。
Y =ヨー、P =ピッチとします。
最初に必要なヨーを取得します。
tan(Y) = x/(-y)
今ピッチを取得するには:
tan(P) = sqrt(x^2 + y^2)/z
YとPの実際の値を取得するには、逆tanを使用する必要があります。上記では、tanを使用して導出を明確にしています。
マイナス記号は、角度と軸をどのように定義するかによって異なりますが、理解する必要があることに注意してください。
次に、ロールを0または好きなように設定できます。
これらの方程式はどれも「間違っている」ものではありませんが、すべて少し不器用です。 Ryder052、あなたの例はあなたがコメントしたように特定のケースを説明していません。なぜatan2を使わないのですか?
与えられた単位(正規化された)方向ベクトルd
pitch = asin(-d.Y);
yaw = atan2(d.X, d.Z)
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;