glRotatef() 在 Opengl 中的工作很奇怪

Posted

技术标签:

【中文标题】glRotatef() 在 Opengl 中的工作很奇怪【英文标题】:glRotatef() works weird in Opengl 【发布时间】:2020-11-04 09:47:16 【问题描述】:

我即将在 C++ OpenGL、MFC 应用程序中制作一个旋转球体。 所以我在demo.h 中声明了一个具有旋转速度的变量:

GLfloat angle;
void Init();

另外,我初始化了该变量并在demo.cpp 中的 xyz(0,0,0) 处实现了一个法线球体:

Init();
angle += 1;
glRotatef(angle, 0, 1, 0);
GLUquadricObj* a = gluNewQuadric();
gluSphere(a, 10, 100, 100);  //radius = 10

Init() 是用户自定义函数,初始化角度变量的值:

void Init() = 
    angle = 1.0;

在这种情况下,球体旋转良好。但是,如果我将 angle += 1; 更改为 angle += angle; , 然后球体不会以相同的速度旋转并最终消失:( 我不知道这两者有什么区别。申请有问题吗 "+=" 运算符转 GLfloat 类型变量?

【问题讨论】:

Angle += angle 乘以 2。很快你就会达到可以表示为浮点数的极限。 angle += angle; 类似于angle *= 2; 将实现的目标。 IE。在每次执行语句时,angle 的值加倍。如果你在纸上尝试这个,你会注意到angle 的值增加的速度有多快。迟早你会得到巨大的价值,最后你的GLfloat 会溢出。 (每个程序员都应该意识到这一点。) 【参考方案1】:

angle += angle 每次更新都会使旋转值加倍。根据您的更新频率,旋转几乎会立即变得完全不稳定,并且最多会在几秒钟内溢出可能的浮点值,从而变为 INFINITY,OpenGL 很可能会出错。

【讨论】:

哦...你是对的,我从来没有想过它。真的很感激:))

以上是关于glRotatef() 在 Opengl 中的工作很奇怪的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL/GLUT:glTranslatef 和 glRotatef 在绘制立方体之前还是之后?

OpenGL:glRotatef 旋转啥?

opengl glrotatef 无法正确旋转

使用 glRotatef() 时的 OpenGL 坐标问题

OpenGL glRotatef

使用 gl.glrotatef 旋转对象