OpenGL恒定旋转角度

时间:2016-09-26 10:04:36

标签: c++ opengl graphics rotation glut

我最近正在做一些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句柄",这表明我的过量文件不完整,我猜?

那么有没有人知道如何修复枚举问题或者如何解决这个问题以创建一个场景,让我有一个以恒定速度旋转的物体?

非常感谢!

1 个答案:

答案 0 :(得分:1)

根据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

并像这样计算deltatime:

int preTime= 0;
while( ... )
{
     int currentTime= glutGet(GLUT_ELAPSED_TIME);
     int deltaTime = currentTime- preTime;
     preTime = currentTime;

     //... pass the deltaTime to whatever you want...
}