0

我有以下代码:

    void setupCamera() {

    // Clear the screen buffer
    glClear(GL_COLOR_BUFFER_BIT);

    // reset the projection matrix //
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // and set the perspective with the current field of view,
    // and the current height and width
    gluPerspective(fov, ratio, objDepth - objRadius * 2,
            objDepth + objRadius * 2);
    glViewport(0, 0, WINDOW_SIZE, WINDOW_SIZE);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    if(first){
        glMultMatrixf(rotMatrix);

    }
    first = true;

    //translate everything to be in objDepth//
    glTranslatef(initX * 0.01, initY * 0.01, (-1) * objDepth);

    glRotatef(200 * angle, rotationVector[0], rotationVector[1],
            rotationVector[2]);

    glutWireTeapot(1.5);


    glGetFloatv (GL_MODELVIEW_MATRIX, rotMatrix);


    }

旋转向量保持旋转轴,

translate 用于将所有内容移动到正确的位置。

问题是,我正在使用glMultMatrixf以使用保存的最后一个矩阵,

旋转然后平移,然后用 . 再次保存矩阵glGetFloatv

这个函数经常用定时器调用,但出于某种原因

我想不通,矩阵不会保存任何东西并且总是一遍又一遍地初始化,

意味着旋转总是以小角度使用(因为不保存矩阵)。

保存的矩阵未在代码中的其他任何地方使用。

有任何想法吗?

4

1 回答 1

0

您是否每次都调用 setupCamera() ?如果你是,你可能想停下来。您不需要每帧都重置投影矩阵,除非您需要,否则您也不需要重置模型视图矩阵。考虑自行增加角度和平移,而不是存储整个矩阵。

您可能要采取的步骤是:

1)初始化矩阵。将投影初始化为身份并使用 gluPerspective。然后切换到模型视图并将其初始化为身份。这真的应该只做一次。

2)在你的更新循环中,增加你的角度和平移他们的代表变量。

3) 在你的绘图循环中,使用 glPushMatrix() 来推送模型视图矩阵。使用 gltranslate 和 glrotate 应用您的矩阵更改,然后绘制您正在绘制的任何内容。之后,glPopMatrix() 以返回身份。

我仍然不太明白您是否正在尝试绘制某些东西并认为您需要每帧读取、存储和恢复当前的 glMatrix,或者您是否真的在尝试评估 OpenGL 对矩阵的作用并且确实需要阅读出来。

于 2012-11-25T00:25:39.637 回答