这是我的一个程序,我发现显示结果会变动,这太让我震撼了,我不能理解#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的

解决方案 »

  1.   

    使用glutReshapeFunc在窗体大小发生变化时定义一个回调函数设置一下
    参看http://soft.yesky.com/261/2398261.shtml
    还有你不需要每次都在myplay()里调用gluPerspective,这会影响效率啊
      

  2.   

    窗口的大小变化会影响的坐标映射关系(注意OpenGL的窗口坐标是以左下角为原点的),如果没有对应的代码重新映射的话,当然图形会不一样了。
      

  3.   

    谢谢两位的回答,我觉得你们说的很有道理,我会再研究一下,但是我发现只要我运行程序以后以后,点一个其他的窗口再点回来,显示的图像也会变,这个时候大小没有变化啊,为什么也会这样呢,弱弱的问一下,这个跟那个什么windows消息的wm_paint有没有关系啊,
      

  4.   

    如果窗口大小不变,图像也会变化的话,看看你的程序控制上的问题: 比如,每次重绘时,某些变量的值是否变化了(某些变量没有设处值,或者浮点数计算的误差等)?查查程序的逻辑,总之,问题不可能和OpenGL直接相关。
      

  5.   


    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();