opengl可以看到奇怪的行为

opengl可以看到奇怪的行为,opengl,glulookat,Opengl,Glulookat,有人能解释一下为什么我代码中的摄像头在每次onIdle回调时都在移动吗?我没有改变任何参数,所以在我看来,它应该显示相同的所有时间。还是我自己想不出来,谢谢你的帮助 #include <iostream> #include <math.h> #include "gl/glut.h" #include <windows.h> using namespace std; void Display(void){ glMatrixMode(GL_PROJE

有人能解释一下为什么我代码中的摄像头在每次onIdle回调时都在移动吗?我没有改变任何参数,所以在我看来,它应该显示相同的所有时间。还是我自己想不出来,谢谢你的帮助

#include <iostream>
#include <math.h>
#include "gl/glut.h"
#include <windows.h>

using namespace std;

void Display(void){

    glMatrixMode(GL_PROJECTION);
    glFrustum(-0.5, 0.5, -0.5, 0.5, 0.8, 2);

    gluLookAt (0,0,1,  0,0,0,  0,1,1);

    glMatrixMode(GL_MODELVIEW);
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

    glutWireCube(0.2);

    glFlush();

}


void onIdle(void){

    Sleep(1000);
    glutPostRedisplay();

}

int main(void){

glutInitDisplayMode(GLUT_DEPTH | GLUT_RGBA);
glEnable(GL_DEPTH_TEST);
glutCreateWindow("camera");

glutDisplayFunc(Display);
glutIdleFunc(onIdle);
glutMainLoop();
return 0;
}
#包括
#包括
#包括“gl/glut.h”
#包括
使用名称空间std;
作废显示(作废){
glMatrixMode(GL_投影);
glFrustum(-0.5,0.5,-0.5,0.5,0.8,2);
gluLookAt(0,0,1,0,0,0,0,1,1);
glMatrixMode(GLU模型视图);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
立方体(0.2);
glFlush();
}
void onIdle(void){
睡眠(1000);
再发现();
}
内部主(空){
glutInitDisplayMode(GLUT_深度| GLUT_RGBA);
glEnable(GLU深度试验);
窗口(“相机”);
glutDisplayFunc(显示器);
glutIdleFunc(onIdle);
glutMainLoop();
返回0;
}

这是因为在每次渲染后或每次渲染开始时,您都不会重置矩阵


基本上,您需要调用
glLoadIdentity()
将重置当前选定的矩阵,但将矩阵的值设置为默认值(矩阵标识)。

好吧,这就是问题所在,然后还有一个事实,即他正在将投影和modelview合并到一个丑陋的矩阵中。还有一个事实,上方向向量是零。整个代码都是一团糟:)或者(可能更快)比调用
glLoadIdentity()
每个帧在查看转换调用(例如
gllookat()
)之前执行
glPushMatrix()
),然后在所有渲染完成后调用
glPopMatrix()
(也就是说,就在您调用
glFlush()
之前)。@AndonM.Coleman Err,第二个“set”gluLookAt的参数是你正在看的点,在OP的例子中是原点,而不是上向量,如果你是这么说的话。最后三个参数是上向量,除非我看的是文章的编辑版本,否则它不是零向量。@radical7:是的,你是对的。我习惯了不同的API,它的前向和上向向量在
LookAt
中反转。好消息是GLU不是OpenGL的一部分,所以我不在乎我记不起特定API函数=P的正确顺序。我仍然坚持我的主张,移动
glokat(…)
切换到
GL\u MODELVIEW
后,将修复固定功能管道中的许多问题。@radical7一个更快更好的选择是自己使用并计算所有矩阵。