意外的gluLookAt在OpenGL上绘制点的行为
问题描述:
我目前正在研究读取3D obj文件的软件的打印循环。 我已经将我的obj文件保存在变量tie
中。这个变量包含一个OpenGL列表。我的目标是通过使用键盘来移动读取对象。键盘阅读正确实施(我可以通过日志看到)。意外的gluLookAt在OpenGL上绘制点的行为
问题
当我编译下面的代码回路中,gluLookAt
exucute正确,我能够通过改变参数的值,在我的对象移动。
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
light();
gluPerspective (60.0, 250/(float)250, 0.1, 500.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eyeX,eyeY,eyeZ,eyeX+directionX,eyeY+directionY,eyeZ+directionZ,upX,upY,upZ);
glPushMatrix();
glRotated(45,0,0,1);
glTranslated(0,0,50);
glBindTexture(GL_TEXTURE_2D,texture1);
//glCallList(xwing); //ICI
glEnd();
glPopMatrix();
glColor3d(1,1,1);
glDisable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D,texture2);
GLUquadric* params = gluNewQuadric();
gluQuadricDrawStyle(params,GLU_FILL);
gluQuadricTexture(params,GL_TRUE);
gluSphere(params,100,20,20);
gluDeleteQuadric(params);
glEnable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D,texture1);
glCallList(tie); //ICI
glPointSize(5.0);
glBegin(GL_POINTS);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f,0.0f,0.0f);
glEnd();
SwapBuffers(hDC);
//} //else
Sleep(1);
但是,当我评论这4条线路:
glBegin(GL_POINTS);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f,0.0f,0.0f);
glEnd();
我的对象不动吧。仿佛gluLookAt
没有成功执行。 你有什么想法为什么会发生这种情况。我在代码中忘记了什么吗?
答
glBegin
和glEnd
划定定义一个基元或一组相似基元的顶点。您必须确保,每个glBegin
后面跟着一个glEnd
。
这意味着,如果您的Display Lists包含glBegin
,那么它也应包含glEnd
。我强烈建议这样做。另一种可能性将是glCallList后手工进行:
glCallList(tie);
glEnd();
glPushMatrix
和glPopMatrix
用于从矩阵堆栈推进矩阵和流行矩阵。如果要将模型矩阵添加到视图矩阵,则必须执行以下步骤。
- 推视图矩阵
glPushMatrix
。这会在堆栈上推送视图矩阵的副本。 - 将模型矩阵添加到当前视图矩阵(
glRotated
,glTranslated
,...) - 绘制模型。 (
glCallList
,gluSphere
,...) - 恢复原始视图矩阵(
glPopMatrix
)。
莫名其妙地适应你的代码是这样的:
// set up view matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eyeX,eyeY,eyeZ,eyeX+directionX,eyeY+directionY,eyeZ+directionZ,upX,upY,upZ);
// save view matrix
glPushMatrix();
// add model matrix
glRotated(45,0,0,1);
glTranslated(0,0,50);
// do the drawing
glColor3d(1,1,1);
glDisable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D,texture2);
GLUquadric* params = gluNewQuadric();
gluQuadricDrawStyle(params,GLU_FILL);
gluQuadricTexture(params,GL_TRUE);
gluSphere(params,100,20,20);
gluDeleteQuadric(params);
glEnable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D,texture1);
glCallList(tie);
glEnd(); // <-- maybe this could be done in "tie"
// restore the view matrix
glPopMatrix();
非常感谢。事实上,在我的列表创建函数中,我首先使用了“glEndList”,然后是“glEnd”。因此'glEnd'在我的循环中没有被调用。谢谢 –
@GuillaumeMILAN不客气。 – Rabbid76