0

OpenGL ESシーン内で「カメラ」を回転させるセンサーから派生したクォータニオンがあります。また、このクォータニオンの逆数をシーン内の特定のオブジェクトに適用することで、オブジェクトが「カメラ」に「向き合っている」ようになりました。これは期待どおりに機能します。問題は、これらのオブジェクトの Z 軸の回転を無効にする必要があることです。Z コンポーネント内で回転しないクォータニオンをどのように考え出すのですか?

私のテスト: オイラー角を抽出し、否定四元数を作成し、2 つの四元数の乗算からこれらのオブジェクトの回転行列を作成しようとしましたが、結果は正しくありません。

glm::quat rMQ = cam->getCameraQuaternion();// retrieve camera quat
glm::vec3 a = glm::eulerAngles((rMQ))* 3.14159f / 180.f; // Euler angle set derived
glm::quat rMZ = glm::angleAxis(-a.z, vec3(0.0f, 0.0f, 1.0f)); // negating quaternion
glm::mat4 fM = glm::inverse(glm::mat4_cast(rMQ*rMZ)); //final mat4 for GL rotation
4

2 に答える 2

1

クォータニオンを使用する場合、「z 軸上の回転」はなく、軸と角度だけです。オイラーに変換し、1 つのコンポーネントの符号を反転してから、クォータニオンに戻す必要があります。

オイラー角の場合、回転の順序を定義するのはユーザー次第です。回転は可換ではないため、順序は重要です。そのため、回転をコンポーネントに一般的に分解することはできません。通常、順序は xyz ですが、そうしなければならない理由はありません。一部の API では、順序を選択できます。

于 2013-07-26T06:56:21.200 に答える