Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL恒定旋转角度_C++_Opengl_Graphics_Rotation_Glut - Fatal编程技术网

C++ OpenGL恒定旋转角度

C++ OpenGL恒定旋转角度,c++,opengl,graphics,rotation,glut,C++,Opengl,Graphics,Rotation,Glut,我最近在做一些openGL编程,它涉及基本的矩阵变换,如平移、旋转和缩放。我在做旋转时遇到了一些问题。这是我的问题 现在我使用可变旋转度和可变旋转步长来控制旋转。当旋转标志处于启用状态时 //inside paintGL function if(rotationFlag is on) rotationDegree += rotationStepSize if(rotationDegree > 360.0f) rotationDegree -= 360.

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

现在我使用可变旋转度和可变旋转步长来控制旋转。当旋转标志处于启用状态时

//inside paintGL function
if(rotationFlag is on)
     rotationDegree += rotationStepSize
     if(rotationDegree > 360.0f)
         rotationDegree -= 360.0f
奇怪的是,因为我将旋转步长定义为非常小,旋转开始时非常慢,但随着时间的增加,它变得越来越快

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

  • 360f不是glm::rotate中DEGRE参数的值范围
  • 该程序启动缓慢,导致paintGL被绘制到较少的屏幕。然后,随着程序变得稳定(或其他参数不变),mainLoopEvent的执行速度越来越快,导致paintGL的绘制量越来越大
有人知道如何解决这个问题吗?我在谷歌上搜索过使用glutget(glutime),但是在我的机器上,这个函数报告“glutget:缺少枚举句柄”,这表明我的glut文件不完整,我想是吧

那么,有人知道如何解决枚举问题,或者如何绕过这个问题来创建一个场景,让对象以恒定速度旋转吗

非常感谢

根据,定义了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\u已用时间
,而不是
GL\u已用时间

然后像这样计算deltatime:

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

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

只是打赌,但您是否使用了
glLoadIdentity
或任何其他矩阵重置方法?如果不是,那么你正在旋转已经旋转的矩阵,这意味着步长增量是速度。对不起,我在问题细节中不清楚。我正在使用新的openGL,以可编程管道为特色。每次我都会将对象平移回原点,按rotationDegree中指定的角度旋转,并将对象平移回其原始位置。所有这些都放在一个矩阵中,然后我将把这个modelToWorld矩阵传递给顶点着色器。在每一帧之前,点保持检查矩阵是否为单位(或处于定义的初始状态…@Spektre是的,但我确实确保了这一点