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 中的工作很奇怪的主要内容,如果未能解决你的问题,请参考以下文章