OpenGL恒定旋转角度

OpenGL constant rotation angle

本文关键字:旋转 OpenGL      更新时间:2023-10-16

我最近在做一些openGL编程,它涉及基本的矩阵变换,如平移,旋转和缩放。我在做旋转时遇到了一些问题。这是我的问题。

现在我使用一个变量rotationDegree和一个变量rotationStepSize来控制旋转。当旋转标志位于

//inside paintGL function
if(rotationFlag is on)
     rotationDegree += rotationStepSize
     if(rotationDegree > 360.0f)
         rotationDegree -= 360.0f

奇怪的是,由于我将rotationStepSize定义为非常小,旋转开始时非常慢,但随着时间的增加,它变得越来越快!

我对这一现象提出了两种解释:

  • 360f不是glm::rotate
  • 中度数参数的取值范围。
  • 程序启动缓慢,导致paintGL被绘制到屏幕较少。然后,随着程序变得稳定(或其他参数没有改变),mainLoopEvent执行得越来越快,导致paintGL被绘制得更多。
有谁知道如何解决这个问题吗?我用谷歌搜索关于使用glutget(GL_TIME_ELAPSED),但在我的机器上,这个函数报告"glutget:缺少ENUM句柄",这表明我的glut文件不完整,我猜?

所以有人知道如何解决枚举问题或如何绕过这个来创建一个场景,我有一个对象在恒定速度旋转?

非常感谢!

根据freeglut_state.c,定义了glutGet函数

int FGAPIENTRY glutGet( GLenum eWhat )
{
#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE
    int returnValue ;
    GLboolean boolValue ;
#endif
    switch (eWhat)
    {
        case GLUT_INIT_STATE:
        return fgState.Initialised;
        case GLUT_ELAPSED_TIME:
        return fgElapsedTime();
    }

我没有使用freeglut,但是看看文档,也许你应该尝试GLUT_ELAPSED_TIME而不是GL_TIME_ELAPSED ?

,然后像这样计算delta时间:

int preTime= 0;
while( ... )
{
     int currentTime= glutGet(GLUT_ELAPSED_TIME);
     int deltaTime = currentTime- preTime;
     preTime = currentTime;
     //... pass the deltaTime to whatever you want...
}