12

3D オブジェクトが任意の 3D ポイントに面するように、2 つの角度 (ヨーとピッチ) を計算する必要があります。これらの回転は、最初の回転 (下の図に基づいて Z とします) の後、Y 軸もオブジェクトと共に回転するため、「オイラー」回転として知られています。

これは私が使用しているコードですが、完全には機能していません。地面 (Y = 0) にある場合、オブジェクトはポイントに面するように正しく回転しますが、ポイントを Y 方向に上に移動するとすぐに、回転が正しく見えません。

// x, y, z represent a fractional value between -[1] and [1]
// a "unit vector" of the point I need to rotate towards

yaw = Math.atan2( y, x )
pitch = Math.atan2( z, Math.sqrt( x * x + y * y ) )

点から 2 つのオイラー角を計算する方法を知っていますか?


下の写真は、私が回転する方法を示しています。これらは私が計算する必要がある角度です。(唯一の違いは、Z、Y、X ではなく、X、Y、Z の順序でオブジェクトを回転させていることです)

写真

ここに画像の説明を入力


これが私のシステムです。

  • 座標系は、x = 右、y = 下、z = さらに奥です。
  • オブジェクトはデフォルトで (0,0,1) にあり、後ろ向きです
  • 回転は X、Y、Z の順で、X の回転はピッチ、Y はヨー、Z はロールです。

私のシステム

4

4 に答える 4

15

これが私の作業上の仮定です:

  • 座標系(x、y、z)は、正のxが右、正のyが下、zが残りの方向になるようになっています。特に、y=0はグランドプレーンです。
  • 現在(0,0,1)の方を向いている(0,0,0)のオブジェクトは、(x、y、z)の方を向いています。
  • これを実現するために、x軸を中心に回転し、続いてy軸を中心に回転します。最後に、物事を直立させるために、z軸を中心に回転します。

(ヨー、ピッチ、ロールという用語は混乱を招く可能性があるため、使用を避けたいと思いますが、大まかに言えば、対応はx =ピッチ、y =ヨー、z =ロールです。)

この設定で問題を解決するための私の試みは次のとおりです。

rotx = Math.atan2( y, z )
roty = Math.atan2( x * Math.cos(rotx), z )
rotz = Math.atan2( Math.cos(rotx), Math.sin(rotx) * Math.sin(roty) )

うまくいけば、これは兆候まで正しいです。兆候を修正する最も簡単な方法は試行錯誤だと思います。確かに、あなたはサインオンを取得して修正したように見えます-zに関する微妙な問題を含みます-したがって、サインオンrotxroty修正するだけで済みrotzます。

これは自明ではないと思いますが(おそらく、どのオクタントにいるかによって異なります)、間違っていると言う前に、いくつかの可能性を試してください。幸運を!


これが最終的に私のために働いたコードです。

オブジェクトが前の象限(正のZ)から後ろの象限に移動したときに発生する「フリップ」効果に気づきました。前象限では、オブジェクトの前部は常にポイントに面します。後象限では、オブジェクトの後ろは常にポイントに面しています。

このコードは、オブジェクトの前面が常にポイントに面するように、フリップ効果を修正します。試行錯誤しながら出会ったので、何が起こっているのかよくわかりません!

 rotx = Math.atan2( y, z );
 if (z >= 0) {
    roty = -Math.atan2( x * Math.cos(rotx), z );
 }else{
    roty = Math.atan2( x * Math.cos(rotx), -z );
 }
于 2010-10-26T08:30:23.277 に答える
7

リッチセラーの回答は、2つの座標系間の回転を表すオイラー角のセットを前提として、ある3D座標系から別のシステムに点を回転させる方法を示しています。

しかし、それはあなたが何か違うものを求めているように聞こえます:

あなたが持っている:単一の点の3D座標

必要なもの:オイラー角のセット

それがあなたが求めているものであるならば、あなたは十分な情報を持っていません。オイラー角を見つけるには、両方の座標系で少なくとも2点の座標を使用して、一方の座標系からもう一方の座標系への回転を決定する必要があります。

オイラー角はあいまいになる可能性があることにも注意する必要があります。リッチの答えは、回転がZ、X'、Z'の順に適用されることを前提としていますが、これは標準化されていません。オイラー角を使用して他のコードと相互運用する必要がある場合は、同じ規則を使用していることを確認する必要があります。

オイラー角の代わりに回転行列またはクォータニオンの使用を検討することをお勧めします。

于 2009-08-09T23:15:50.563 に答える
3

この一連のローテーションにより、求めているものが得られます。

  1. Xについて:0
  2. Yについて:atan2(z、x)
  3. Zについて:atan2(y、sqrt(x * x + z * z))

これらの用語をどのように使用しているかを最初に定義しない限り、これらが「ロール」、「ピッチ」、「ヨー」の観点から何であるかを説明することはできません。標準的な方法でそれらを使用していません。

編集:
大丈夫、それからこれを試してください:

  1. Xについて:-atan2(y、z)
  2. Yについて:atan2(x、sqrt(y * y + z * z))
  3. Zについて:0
于 2010-10-27T17:54:33.687 に答える
-2

軸の回転について言えば、ステップ 3 は、Y'' 軸を中心とした X'、Y''、および Z' 軸の回転であったと思います。

于 2009-09-02T00:50:02.677 に答える