0

立方体の回転を表すクォータニオンがあります。この立方体は、一度に 90 度だけ、左、上、右、下に順番に回転できるため、常に面の 1 つを直接見ています。OpenGL の右手座標系を使用すると、これは画面を見て +z を向いている面です。

キューブの「ロール」を取得したい。つまり、現在ワールド +z に面している面が、この絶対 z 軸を中心にどれだけ回転するかということです。

誰かがこれを行うための最良の方法を説明できますか? オイラー角に変換しますか (これは適切なオプションではないようです)? 派手な四元数計算を行いますか? 私はあらゆる種類のコード スニペットを試しましたが、ここで最後のストローにいます。

4

1 に答える 1

1

各面には法線があります (立方体のローカル空間に相対するベクトルで、面からまっすぐに向いています)。それは数学的に明白です。ただし、立方体がサイコロであり、各面に特定のこの向きの数字があるかのように、各面に「直立」の向きも必要であるように聞こえますが、これは本質的にプロパティではありません。しかし、先に進んで定義することができます。特定の面の「直立」ベクトルを、立方体のローカル空間でサイコロの数字の下から上を指すベクトルと考えてください。

これで、6 つの顔の法線と、それに対応する 6 つの直立ベクトルができました。ビューアーのワールド空間の「後方ベクトル」と「直立ベクトル」もあり、それぞれ +Z と (おそらく) +Y です。ここからは簡単です。

  1. サイコロの向きによって 6 つの面の法線を変換し、どれが +Z を生成するかを確認します。
  2. サイコロの向きによって、その面の直立ベクトルを変換します。
  3. を使用して、+Y と面のワールド空間直立ベクトルの間の +Z 軸周りの符号付き角度を見つけますatan2(dot(+Z, cross(+Y, faceUprightWS)), dot(+Y, faceUprightWS))
于 2013-07-16T11:04:30.217 に答える