私は OpenGL エンジンの回転にクォータニオンを使用します。現在、x、y、z 回転の回転行列を作成するために、軸回転ごとにクォータニオンを作成します。次に、これらを乗算して最終的なクォータニオンを取得します。
void RotateTo3(const float xr ,const float yr ,const float zr){
quat qRotX=angleAxis(xr, X_AXIS);
quat qRotY=angleAxis(yr, Y_AXIS);
quat qRotZ=angleAxis(zr, Z_AXIS);
quat resQuat=normalize(qRotX * qRotY * qRotZ);
resQuat=normalize(resQuat);
_rotMatrix= mat4_cast(resQuat);
}
これですべて問題ありませんが、3 つの軸角度すべてから 1 つのクォータニオンのみを作成し、最後の乗算をスキップしたいと考えています。クォート コンストラクターの 1 つには、次のようなオイラー角度ベクトルのパラメーターがあります。
quat resQuat(vec3(yr,xr,zr))
したがって、これを試してみると、最終的な回転が間違っています.( quat(vec3(xr,yr,zr)) も試しました).GLMに、3つの軸すべてから最終的な四元数を1つのインスタンスで埋める方法はありませんか?
さて、もう1つ: Nicol Bolasが示唆したように、 glm::eulerAngleYXZ() を使用して回転行列をすぐに埋めることができます.彼の意見では、中間の四元数ステップを実行するのは無意味です..しかし、私が見つけたのは少なくとも私にとっては、正しく動作しません。例えば:
これ :
mat4 ex= eulerAngleX(radians(xr));
mat4 ey= eulerAngleY(radians(yr));
mat4 ez= eulerAngleZ(radians(zr));
rotMatrix= ex * ey * ez;
これと同じものを返しません:
rotMatrix= eulerAngleYXZ(radians(yr),radians(xr),radians(zr));
そして、正しい回転状態との比較から、最初の方法は正しい回転を与え、2番目の方法は間違っています。