gpt4 book ai didi

c++ - 欧拉角到 GlRotatef

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:03 24 4
gpt4 key购买 nike

我想在 opengl 中使用欧拉角。有些人建议像这样:

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

当然,如果您一次向多个方向旋转,则此方法完全失效。据我所知,更好的方法是将所有内容转换为 OpenGL 期望的格式(角度和 vector )

四元数的欧拉角在 Internet 上的许多不同地方都有相当广泛的介绍。不幸的是,似乎互联网上的每篇帖子都有不同的建议,而且就我的生活而言,它们似乎都不起作用。很有可能有一个建议有效,但我在一长串不太有效的建议中迷失了它。

正在关注 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);

任何人都可以提供关于从这里去哪里的任何建议吗?

最佳答案

第一个建议不起作用的原因是它相对于之前的旋转是旋转的。例如,第二行(假设你的意思是 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 Mathematics Library并使用扩展名。然后,您可以连续使用围绕每个轴的 axisAngle 旋转。

关于c++ - 欧拉角到 GlRotatef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15794842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com