愚蠢的问题。使用gluPerspective时如何让我的物体不变形?

时间:2010-12-02 19:38:10

标签: visual-c++ opengl

Hy.I画了一个天空盒和里面的几个物体,除了我的物体因使用gluPerspective而变形,我需要绘制天空箱和东西(例如我有一个立方体,但它看起来像是paralelipipedic(长的一个更长的盒子))。现在我已经阅读了红皮书的第3章,但我无法弄明白。我尝试过使用glfrustrum,glortho等等但我只是想弄清楚如何制作这项工作正常。这是我的代码:

 void display(void)
  {

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity ();
/*
Set projection matrix for 100 degree FOV  
*/   
GLfloat w = (GLfloat)glutGet(GLUT_WINDOW_WIDTH),h = (GLfloat)glutGet(GLUT_WINDOW_HEIGHT);   
glMatrixMode(GL_PROJECTION);   
glLoadIdentity();   
gluPerspective(100,w/h,0.5,100);

/*  
Set modelview matrix for camera   
*/   
glMatrixMode(GL_MODELVIEW);   
glLoadIdentity();   
glRotatef(cameraPhi,1,0,0);   
glRotatef(cameraTheta,0,1,0);
/*  
No need to clear the color buffer, the skybox fills the whole screen  
Shiny objects in cube environment mode use depth buffer, so we do need to clear that one  
*/   
glClear(GL_DEPTH_BUFFER_BIT);   
/*  
Draw skybox  
*/ 
glDisable(GL_LIGHTING);
    //the way i move around space(my camera)
gluLookAt(move_camera.x,move_camera.y,move_camera.z,move_camera.x,move_camera.y,move_camera.z-100,0,1,0);

    drawSkybox2d(treeTexture);
glEnable(GL_LIGHTING);
    //theese are my objects
chair(obiecte[0]);
table(obiecte[1]);
bed(obiecte[2]);
Sleep(5);
    glutSwapBuffers();

 }

和天空盒我画得像这样:

void   drawSkybox2d(Texture treeTexture[])   
{   
/*  
Enable 2d texture mapping  
*/     
glEnable(GL_TEXTURE_2D);       
/*  
Disable the depth buffer when rendering the skybox  
*/   
glDisable(GL_DEPTH_TEST);   
glDepthMask(0);   


int dim=20,x=1,y=0;
/*  
Rear Face  
*/   
glBindTexture(GL_TEXTURE_2D,treeTexture[5].texID);   
glBegin(GL_TRIANGLE_FAN);   
glTexCoord2f(x,y);   
glVertex3f(dim,dim,dim);   
glTexCoord2f(x,x);   
glVertex3f(dim,-dim,dim);   
glTexCoord2f(y,x);   
glVertex3f(-dim,-dim,dim);   
glTexCoord2f(y,y);   
glVertex3f(-dim,dim,dim);   
glEnd();   

/*  
Front Face  
*/   
glBindTexture(GL_TEXTURE_2D,treeTexture[4].texID);   
glBegin(GL_TRIANGLE_FAN);   
glTexCoord2f(x,y);   
glVertex3f(-dim,dim,-dim);   
glTexCoord2f(x,x);   
glVertex3f(-dim,-dim,-dim);   
glTexCoord2f(y,x);   
glVertex3f(dim,-dim,-dim);   
glTexCoord2f(y,y);   
glVertex3f(dim,dim,-dim);   
glEnd();   

/*  
Right Face  
*/   
glBindTexture(GL_TEXTURE_2D,treeTexture[1].texID);   
glBegin(GL_TRIANGLE_FAN);   
glTexCoord2f(x,y);   
glVertex3f(dim,dim,-dim);   
glTexCoord2f(x,x);   
glVertex3f(dim,-dim,-dim);   
glTexCoord2f(y,x);   
glVertex3f(dim,-dim,dim);   
glTexCoord2f(y,y);   
glVertex3f(dim,dim,dim);   
glEnd();   

/*  
Left Face  
*/   
glBindTexture(GL_TEXTURE_2D,treeTexture[0].texID);   
glBegin(GL_TRIANGLE_FAN);   
glTexCoord2f(x,y);   
glVertex3f(-dim,dim,dim);   
glTexCoord2f(x,x);   
glVertex3f(-dim,-dim,dim);   
glTexCoord2f(y,x);   
glVertex3f(-dim,-dim,-dim);   
glTexCoord2f(y,y);   
glVertex3f(-dim,dim,-dim);   
glEnd();   

/*  
Top Face  
*/   
glBindTexture(GL_TEXTURE_2D,treeTexture[3].texID);   
glBegin(GL_TRIANGLE_FAN);   
glTexCoord2f(y,x);   
glVertex3f(-dim,dim,dim);   
glTexCoord2f(y,y);   
glVertex3f(-dim,dim,-dim);   
glTexCoord2f(x,y);   
glVertex3f(dim,dim,-dim);   
glTexCoord2f(x,x);   
glVertex3f(dim,dim,dim);   
glEnd();   

/*  
Bottom Face  
*/   
glBindTexture(GL_TEXTURE_2D,treeTexture[2].texID);   
glBegin(GL_TRIANGLE_FAN);   
glTexCoord2f(y,x);   
glVertex3f(-dim,-dim,-dim);   
glTexCoord2f(y,y);   
glVertex3f(-dim,-dim,dim);   
glTexCoord2f(x,y);   
glVertex3f(dim,-dim,dim);   
glTexCoord2f(x,x);   
glVertex3f(dim,-dim,-dim);   
glEnd();   

/*  
Reactive depth buffer  
*/   
glEnable(GL_DEPTH_TEST);   
glDepthMask(1);   
}

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

尝试传递45而不是100作为gluPerspective的第一个元素。你可能会因为角度太宽(=不切实际)而变形。

如果这没有用,请附上截图。