1

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);

ここからどこへ行くべきかについて誰か提案を提供できますか?

4

1 に答える 1

1

最初の提案が機能しない理由は、以前の回転に対して相対的に回転しているためです。たとえば、2 行目 (glRotatef( Rx ,1,0,0); glRotatef( Ry ,0,1,0); glRotatef( Rz ,0,0,1);) を意味すると仮定すると、新しい行に対して相対的に回転します。最初の行によってすでに回転されている y 軸。元の軸に対して回転させたい。

Wolfram Alpha ( http://mathworld.wolfram.com/EulerAngles.html ) には、使用したい表現に関係なく、オイラー角の包括的な説明があります。

1 つの可能性は、OpenGL 数学ライブラリを使用し、拡張機能を使用することです。次に、各軸の周りで axisAngle 回転を連続して使用できます。

于 2013-04-03T18:50:33.573 に答える