OpenGL恒定旋转角度

Posted

技术标签:

【中文标题】OpenGL恒定旋转角度【英文标题】:OpenGL constant rotation angle 【发布时间】:2016-09-26 10:04:35 【问题描述】:

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

现在我使用变量rotationDegree 和变量rotationStepSize 来控制旋转。当旋转标志打开时

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

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

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

360f 不是 glm::rotate 中 degree 参数的取值范围 程序启动缓慢,导致paintGL 在屏幕上绘制的较少。然后随着程序变得稳定(或其他参数没有变化),mainLoopEvent 执行得越来越快,导致paintGL 被绘制得更多。

有谁知道如何解决这个问题?我用谷歌搜索了关于使用 glutget(GL_TIME_ELAPSED),但是在我的机器上,这个函数报告“glutget:缺少 ENUM 句柄”,这表明我的 glut 文件不完整,我猜?

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

非常感谢!

【问题讨论】:

只是一个赌注,但您使用glLoadIdentity 或任何其他矩阵重置方法吗?如果不是,那么您正在旋转已经旋转的矩阵,这意味着步长增量是速度。 对不起,我在问题细节中不清楚。我正在使用新的 openGL,具有可编程管道。每次我将对象平移回原点时,旋转rotationDegree 中指定的度数并将对象平移回其原始位置。所有这些都放在一个矩阵中,然后我会将这个 modelToWorld 矩阵传递给顶点着色器。 在每帧之前检查矩阵是否为单位(或处于定义的初始状态)... @Spektre 是的,但我确实确定了这一点 【参考方案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...

【讨论】:

以上是关于OpenGL恒定旋转角度的主要内容,如果未能解决你的问题,请参考以下文章

将 OpenGL 4x4 矩阵转换为旋转角度

使用 OpenGL 的视频帧旋转

OpenGL - 2D敌人不旋转面对玩家

四元数旋转opengl

在 iPhone 上使用 CADisplayLink 在 OpenGL ES 视图中进行等速旋转

我的OpenGL学习进阶之旅关于欧拉角旋转顺序旋转矩阵四元数等知识的整理