Visual c++ 愚蠢的问题。如何在使用透视时使我的对象不变形?
Hy.我画了一个天空盒和里面的一些物体,除了我的物体被透视法变形,我需要画天空盒和其他东西(例如,我有一个立方体,但它看起来像平行平行的(长一个更长的盒子)).现在我已经读了红皮书的第三章,但我想不出来.我试过使用glfrustrum,glortho等,但我想不出如何使这项工作正常。这是我的代码:Visual c++ 愚蠢的问题。如何在使用透视时使我的对象不变形?,visual-c++,opengl,Visual C++,Opengl,Hy.我画了一个天空盒和里面的一些物体,除了我的物体被透视法变形,我需要画天空盒和其他东西(例如,我有一个立方体,但它看起来像平行平行的(长一个更长的盒子)).现在我已经读了红皮书的第三章,但我想不出来.我试过使用glfrustrum,glortho等,但我想不出如何使这项工作正常。这是我的代码: void display(void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity (); /*
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);
}
有人能帮我什么忙吗?试着把
45
而不是100
作为透视图的第一个元素。你可能会变形,因为你的角度太宽(=不切实际)
如果没有帮助,请附上屏幕截图。尝试将45
而不是100
作为透视图的第一个元素传递。你可能会变形,因为你的角度太宽(=不切实际)
如果没有帮助,请附上一张截图