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

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

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

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

于 2013-04-03T18:50:33.573 回答