这是我的一个程序,我发现显示结果会变动,这太让我震撼了,我不能理解#include <GL/glut.h>GLfloat width=0.5;//给出一个顶点即可画出向坐标负方向延伸的立方体void lifangti(GLfloat x,GLfloat y,GLfloat z)
{
glBegin(GL_POLYGON);//up
glColor3f(1,1,1);
glVertex3f(x,y,z);glVertex3f(x,y,z-width);
glVertex3f(x+width,y,z-width);glVertex3f(x+width,y,z);
glEnd();
glBegin(GL_POLYGON);//front
glColor3f(1,0,0);
glVertex3f(x,y,z);glVertex3f(x+width,y,z);
glVertex3f(x+width,y-width,z);glVertex3f(x,y-width,z);
glEnd();
glBegin(GL_POLYGON);//left
glColor3f(0,1,0);
glVertex3f(x,y,z);glVertex3f(x,y-width,z);
glVertex3f(x,y-width,z-width);glVertex3f(x,y,z-width);
glEnd();
glBegin(GL_POLYGON);//right
glColor3f(0,0,1);
glVertex3f(x+width,y,z);glVertex3f(x+width,y,z-width);
glVertex3f(x+width,y-width,z-width);glVertex3f(x+width,y-width,z);
glEnd();
glBegin(GL_POLYGON);//behind
glColor3f(1,1,0);
glVertex3f(x,y,z-width);glVertex3f(x,y-width,z-width);
glVertex3f(x+width,y-width,z-width);glVertex3f(x+width,y,z-width);
glEnd();
glBegin(GL_POLYGON);//down
glColor3f(0,1,1);
glVertex3f(x,y-width,z);glVertex3f(x+width,y-width,z);
glVertex3f(x+width,y-width,z-width);glVertex3f(x,y-width,z-width);
glEnd();
}static const GLfloat list[][3] = {
-0.75f, 0.75f, -0.25f,
-0.25f, 0.75f, -0.25f,
0.25f, 0.75f, -0.25f,
-0.75f, 0.75f, 0.25f,
-0.25f, 0.75f, 0.25f,
0.25f, 0.75f, 0.25f,
-0.75f, 0.75f, 0.75f,
-0.25f, 0.75f, 0.75f,
0.25f, 0.75f, 0.75f
};
void myplay()
{ int i=0,j=0;
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(80, 1, 0.1,-20 );
glTranslatef(0,0,-3);
glRotatef(30,0,1,0);
glRotatef(30,1,0,0);
for(i=0;i<8;i++)
{
glColor3f(i%2,1.0,0.0);
lifangti(list[i][0],list[i][1],list[i][2]);
} glMatrixMode(GL_MODELVIEW); //*****
glLoadIdentity(); //******
glRotatef(45,0,1,0); lifangti(list[8][0],list[8][1],list[8][2]);
glFlush();}int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("第一个OpenGL程序");
glutDisplayFunc(&myplay);
glutMainLoop();
return 0;
}运行此程序后,把窗口最大化,或者有时候移动一下,他都会变 ,
原结果是8个方块会拼在一起,另一个块偏了一点,变动后,9个块会正好拼成一起。
但是,如果把我注释有星号的两行去掉的话,就不会有这种情况了
我是在试验想做一个魔方的时候发现这个情况的,实在不能理解,请各位指教
我用的是visual c++ 6.0 我的opengl的版本好像是1.1的
{
glBegin(GL_POLYGON);//up
glColor3f(1,1,1);
glVertex3f(x,y,z);glVertex3f(x,y,z-width);
glVertex3f(x+width,y,z-width);glVertex3f(x+width,y,z);
glEnd();
glBegin(GL_POLYGON);//front
glColor3f(1,0,0);
glVertex3f(x,y,z);glVertex3f(x+width,y,z);
glVertex3f(x+width,y-width,z);glVertex3f(x,y-width,z);
glEnd();
glBegin(GL_POLYGON);//left
glColor3f(0,1,0);
glVertex3f(x,y,z);glVertex3f(x,y-width,z);
glVertex3f(x,y-width,z-width);glVertex3f(x,y,z-width);
glEnd();
glBegin(GL_POLYGON);//right
glColor3f(0,0,1);
glVertex3f(x+width,y,z);glVertex3f(x+width,y,z-width);
glVertex3f(x+width,y-width,z-width);glVertex3f(x+width,y-width,z);
glEnd();
glBegin(GL_POLYGON);//behind
glColor3f(1,1,0);
glVertex3f(x,y,z-width);glVertex3f(x,y-width,z-width);
glVertex3f(x+width,y-width,z-width);glVertex3f(x+width,y,z-width);
glEnd();
glBegin(GL_POLYGON);//down
glColor3f(0,1,1);
glVertex3f(x,y-width,z);glVertex3f(x+width,y-width,z);
glVertex3f(x+width,y-width,z-width);glVertex3f(x,y-width,z-width);
glEnd();
}static const GLfloat list[][3] = {
-0.75f, 0.75f, -0.25f,
-0.25f, 0.75f, -0.25f,
0.25f, 0.75f, -0.25f,
-0.75f, 0.75f, 0.25f,
-0.25f, 0.75f, 0.25f,
0.25f, 0.75f, 0.25f,
-0.75f, 0.75f, 0.75f,
-0.25f, 0.75f, 0.75f,
0.25f, 0.75f, 0.75f
};
void myplay()
{ int i=0,j=0;
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(80, 1, 0.1,-20 );
glTranslatef(0,0,-3);
glRotatef(30,0,1,0);
glRotatef(30,1,0,0);
for(i=0;i<8;i++)
{
glColor3f(i%2,1.0,0.0);
lifangti(list[i][0],list[i][1],list[i][2]);
} glMatrixMode(GL_MODELVIEW); //*****
glLoadIdentity(); //******
glRotatef(45,0,1,0); lifangti(list[8][0],list[8][1],list[8][2]);
glFlush();}int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("第一个OpenGL程序");
glutDisplayFunc(&myplay);
glutMainLoop();
return 0;
}运行此程序后,把窗口最大化,或者有时候移动一下,他都会变 ,
原结果是8个方块会拼在一起,另一个块偏了一点,变动后,9个块会正好拼成一起。
但是,如果把我注释有星号的两行去掉的话,就不会有这种情况了
我是在试验想做一个魔方的时候发现这个情况的,实在不能理解,请各位指教
我用的是visual c++ 6.0 我的opengl的版本好像是1.1的
参看http://soft.yesky.com/261/2398261.shtml
还有你不需要每次都在myplay()里调用gluPerspective,这会影响效率啊
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); gluPerspective(80, 1, 0.1,-20 );
glTranslatef(0,0,-3);
glRotatef(30,0,1,0);
glRotatef(30,1,0,0);
for(i=0;i <8;i++)
{
glColor3f(i%2,1.0,0.0);
lifangti(list[i][0],list[i][1],list[i][2]);
}glMatrixMode(GL_MODELVIEW); //*****
glLoadIdentity(); //******
glRotatef(45,0,1,0);lifangti(list[8][0],list[8][1],list[8][2]);
glFlush();
能不能改成这个, 我没有试过,不保证正确glMatrixMode(GL_PROJECTION);
glLoadIdentity(); gluPerspective(80, 1, 0.1,-20 );glMatrixMode(GL_MODELVIEW); //*****
glLoadIdentity(); //******
glRotatef(30,0,1,0);
glRotatef(30,1,0,0);
glTranslatef(0,0,-3);
for(i=0;i <8;i++)
{
glColor3f(i%2,1.0,0.0);
lifangti(list[i][0],list[i][1],list[i][2]);
}
glRotatef(45,0,1,0);lifangti(list[8][0],list[8][1],list[8][2]);
glFlush();