我有以下代码:
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
再次保存矩阵。
这个函数不断用计时器调用,但出于某种原因
我无法弄清楚,矩阵不会保存任何东西并且总是一遍又一遍地初始化,
意味着旋转始终使用小角度(因为矩阵未保存)。
保存的矩阵未在代码中的任何其他位置使用。
有什么想法吗?
答案 0 :(得分:0)
你是否每次打勾都会调用setupCamera()?如果你是,你可能想停下来。您不需要每帧都重置投影矩阵,除非您需要,否则您也不需要重置模型视图矩阵。考虑逐渐增加角度和平移,而不是存储整个矩阵。
您可能想要采取的步骤是:
1)Init矩阵。将投影初始化为标识并使用gluPerspective。然后切换到modelview并将其初始化为identity。这应该只做一次。
2)在你的更新循环中,增加你的代表变量的角度和平移。
3)在绘制循环中,使用glPushMatrix()来推送模型视图矩阵。使用gltranslate和glrotate应用矩阵更改,然后绘制您正在绘制的任何内容。之后,glPopMatrix()才能恢复身份。
我仍然不明白你是否想要绘制一些东西并且认为你需要每帧读取和存储并恢复当前的glMatrix,或者你是否真的想要评估OpenGL对矩阵所做的事情以及真正的DO需要读出来。