Euler角度与GlRotatef

时间:2013-04-03 18:11:51

标签: c++ visual-c++ opengl

我想用opengl使用euler角度。有些人建议如下:

glRotatef(Rx,1,0,0);
glRotatef(Rx,0,1,0);
glRotatef(Rx,0,0,1);

当然,如果你一次向多个方向旋转,这种方法就完全崩溃了。据我所知,更好的方法是将所有内容转换为OpenGL期望的格式(角度和向量)

Euler与Quaternion的角度在互联网上的许多不同地方被广泛覆盖。不幸的是,似乎互联网上的每个帖子都有不同的建议,而对于我的生活,它们似乎都没有用。很可能有一个有效的建议,但在一长串没有相当有用的建议中我不知道。

根据this建议让我接近。轮换在各个方向上起作用,但是当它们组合时它们似乎行为不端。目前我的代码如下所示:

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

有人可以就这里的去处提出任何建议吗?

1 个答案:

答案 0 :(得分:1)

第一个建议不起作用的原因是因为它相对于先前的旋转而旋转。例如,第二行(假设您的意思是glRotatef( Rx ,1,0,0); glRotatef( Ry ,0,1,0); glRotatef( Rz ,0,0,1);)将相对于已经被第一行旋转的新y轴旋转。您想要相对于原始轴旋转。

Wolfram Alpha(http://mathworld.wolfram.com/EulerAngles.html)对Euler Angles有全面的描述,无论你想使用什么表示。

一种可能性是使用OpenGL Mathematics Library并使用扩展名。然后,您可以连续围绕每个轴使用axisAngle旋转。