openglでオイラー角を使いたいです。次のような提案をする人もいます。
glRotatef(Rx,1,0,0);
glRotatef(Rx,0,1,0);
glRotatef(Rx,0,0,1);
もちろん、一度に複数の方向に回転すると、この方法は完全に崩壊します。私が知る限り、より良いアプローチは、すべてを OpenGL が期待する形式 (角度とベクトル) に変換することです。
クォータニオンに対するオイラー角は、インターネット上のさまざまな場所でかなり広範囲にカバーされているものです。残念ながら、インターネット上のすべての投稿には異なる提案があり、私の人生ではどれもうまくいかないようです. 機能する提案がある可能性は非常に高いですが、完全に機能しない提案の長いリストの中で、それは私にはわかりません。
この提案に従うことで、私は親密になりました。回転は個々の方向で機能しますが、組み合わせると誤動作するように見えます。現在、私のコードは次のようになっています。
double c1 = cos((Rx/180.0f*3.141592)/2.0f);
double c2 = cos((Ry/180.0f*3.141592)/2.0f);
double c3 = cos((Rz/180.0f*3.141592)/2.0f);
double s1 = sin((Rx/180.0f*3.141592)/2.0f);
double s2 = sin((Ry/180.0f*3.141592)/2.0f);
double s3 = sin((Rz/180.0f*3.141592)/2.0f);
double x = (s1*c2*c3-c1*s2*s3)*180.0/3.141592;
double y = (c1*s2*c3+s1*c2*s3)*180.0/3.141592;
double z = (c1*c2*s3-s1*s2*c3)*180.0/3.141592;
double w = acos(c1*c2*c3+s1*s2*s3)*2.0*180.0/3.141592;
//normalize vector, maybe not necessary?
double mag = sqrt(x*x+y*y+z*z);
x /= mag;
y /= mag;
z /= mag;
glRotatef(w,x,y,z);
ここからどこへ行くべきかについて誰か提案を提供できますか?