0

私は、ピッチヨーとロールをそれらの間で独立させる方法を理解しようと懸命に努力しています。z 軸 (ピッチ) で何かを回転させるとすぐに、2 番目の回転 (y 軸ヨー) は最初の結果に依存し、3 番目の回転 (x 軸、ロール) は他の 2 つの結果に依存します。そのため、独立したピッチ、ヨー、ロールを使用する代わりに、それらの 3 つの混合物を取得します。

オブジェクトの角度を配列 [pitch,yaw,roll] に格納し、変換中にこれらの角度をデコードして、ヨーイングがオブジェクトを特定の位置に置き、ピッチに対応する角度を取ることができればいいのにと思いますが、両方の化合物ではありません...

「任意軸回転行列」への言及を見てきました。望ましい結果を得るのに役立ちますか??? 1) ヨーを適用 (gl.glRotatef(beta, 0.0f, 1.0f, 0.0f);) 2) 手動でベクトル (1.0f,0.0f,0.0f) をベータで回転させた結果の軸を取得 3) を使用してピッチを適用2 で得た軸 {そしてロールの場合... 1,2,3 が正しい場合} 4) 2 で得た軸をその x の周りで回転させて 5) 4 で得た軸を使用してロールを適用する

それはうまくいくでしょうか?より良い解決策はありますか?[ピッチ、ヨー、ロール] 形式でオブジェクトのローカル方向を維持したいと考えています。

私は何日も苦労してきましたが、できればクォータニオンの使用を避けたいと思っています。3D オブジェクトは 0,0,0 に対して相対的に保存され、{1,0,0} に沿って見て、フレームごとに目的地と角度に変換されるため、ジンバル ロックの問題はおそらく簡単に回避できるはずです。

つまり、カメラは正常に動作し、ワールド座標は正しく作成されていますが、ヨー、ピス、ロールに基づくオブジェクト ローカル変換を適用する方法や場所がわかりません。

結果は配列 [y,p,r] から読み取る必要があり、それらの組み合わせは重複してはなりません

実際、私の変換は次のとおりです。

gl.glLoadIdentity(); 
float[] scalation = transform.getScalation();
gl.glScalef(scalation[0], scalation[1], scalation[2]); 
float[] translation = transform.getTranslation();
gl.glTranslatef(translation[0], translation[1], translation[2]);
float[] rotation = transform.getRotation();
gl.glRotatef(rotation[0], 1.0f, 0.0f, 0.0f);
gl.glRotatef(rotation[1], 0.0f, 1.0f, 0.0f);
gl.glRotatef(rotation[2], 0.0f, 0.0f, 1.0f);
4

3 に答える 3

6

向きは常に角度の順序に依存します。彼らを独立させることはできません。ベクトルを行列で乗算して回転させますが、行列の乗算は可換ではありません。注文を 1 つ選択して、それと一致させることができます。これらの問題に対して、一般的な選択は ZYX 方向付け方法です (最初にロール、次にピッチ、最後にヨー)。角度を扱うときの個人的な参考資料は、このドキュメントです。これは非常に役立ちます。

于 2012-08-05T20:14:34.570 に答える
4

ヨー/ピッチ/ロールを使用する場合、最終的な方向は常に適用する量と順序に依存します。読みやすさや単純さが必要な場合は、他のスキームを選択できます。私は前方ベクトル (F) を選択し、正規の「ワールド アップ」ベクトルに基づいて右および上ベクトルを計算し、行列の列に入力するのが好きです。必要に応じて、「軸スピン」角度項を追加できます。クォータニオンに少し似ていますが、より人間が読める形式です。この表現を使用して、基本的な WASD スタイルのカメラを制御します。

于 2012-08-05T20:59:49.507 に答える
1

累積 (ヨー、ピッチ、ロール) 回転には、個別の変換の結果である変換行列を、それらが発生した順序で保持する必要があります。結果の行列は、ある軸とある角度を中心とした回転です。

于 2014-05-29T10:07:54.230 に答える