OpenGL透视投影

OpenGL透视投影,opengl,Opengl,我有以下代码: #include <GL/glut.h> #include <stdio.h> #include <math.h> void display(void); void reshape(int, int); void keyboard_input(unsigned char key, int x, int y); int d =0; float angle = 0; float x = 2; bool add_flag = false,flag =

我有以下代码:

#include <GL/glut.h>
#include <stdio.h>
#include <math.h>
void display(void);
void reshape(int, int);
void keyboard_input(unsigned char key, int x, int y);
int d =0;
float angle = 0;
float x = 2;
bool add_flag = false,flag =true,flag1 = false,flag2 = false;
int main(int argc, char** argv)
{
glutInit(&argc, argv);

glutInitWindowSize(512, 512);

glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);

glutCreateWindow("Lab 6");

glutDisplayFunc(display);

glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard_input);

glClearColor(0,0,0,1);

glutIdleFunc(display);

glutMainLoop();

return 0;
}
void drawSnowMan() {

glRotatef(angle,0,1,0);
 glColor3f(1.0f, 1.0f, 1.0f);

// Draw Body 
 glTranslatef(0.0f ,0.75f, 0.0f);
 glutSolidSphere(0.75f,20,20);


// Draw Head
 glTranslatef(0.0f, 1.0f, 0.0f);
 glutSolidSphere(0.25f,20,20);

// Draw Eyes
 glPushMatrix();
 glColor3f(0.0f,0.0f,0.0f);
 glTranslatef(0.05f, 0.10f, 0.18f);
 glutSolidSphere(0.05f,10,10);
 glTranslatef(-0.1f, 0.0f, 0.0f);
 glutSolidSphere(0.05f,10,10);
 glPopMatrix();

// Draw Nose
 //
 glColor3f(1.0f, 0.5f , 0.5f);
 glRotatef(0.0f,1.0f, 0.0f, 0.0f);
 glTranslatef(0, 0.0f, 0.25f);
 glutSolidCone(0.04f,0.2f,10,2);
}

void drawSnow()
{   
{
    glRotatef(angle,0,1,0);
    glColor3f(1.0, 1 , 1);
    glutSolidSphere(0.05f,10,10);

}
}

void display()
{
if(flag1 == true)
{
    angle = angle + 2;
    flag1=false;
}
else if(flag2 == true)
{
    angle = angle - 2;
    flag2 = false;
}
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

for(float i = -2; i <= 2 ; i=i+0.5)
{
    if(d%3==0)
glTranslatef(0,i,0);
glTranslatef(i,x,0.0);
drawSnow();
if(x >= 2)
{
    x = 2;
    add_flag = true;
}
else if(x <= -2)
{
    x = 2;
    add_flag = false;
}

if(add_flag == false)
    x = x + 0.0002;
else if(add_flag == true )
    x = x - 0.0002;
d++;
glLoadIdentity();
}
glTranslatef(0.0f, -1.0f, 0.0f);
drawSnowMan();
glLoadIdentity();
glRotatef(angle,0,1,0);
glTranslatef(0.0f, -1, 1.5f);

glColor3f(0, 1,1);
glRotatef(90,-1,0,0);
 glutSolidCone(0.08f,0.5f,10,2);
 glTranslatef(0.1, 0, 0);
  glutSolidCone(0.08f,0.2f,10,2);
 glTranslatef(-0.2, 0, 0);
  glutSolidCone(0.08f,0.2f,10,2);
  glTranslatef(-0.1, 0, 0);
  glutSolidCone(0.08f,0.5f,10,2);
  glRotatef(-90,-1,0,0);
glLoadIdentity();
glRotatef(angle,0,1,0);
  glTranslatef(1.0f, -1, -3.5f);

glColor3f(0, 1,1);
glRotatef(90,-1,0,0);
 glutSolidCone(0.08f,0.5f,10,2);
 glTranslatef(0.1, 0, 0);
  glutSolidCone(0.08f,0.2f,10,2);
 glTranslatef(-0.2, 0, 0);
  glutSolidCone(0.08f,0.2f,10,2);
  glTranslatef(-0.1, 0, 0);
  glutSolidCone(0.08f,0.5f,10,2);
  glRotatef(-90,-1,0,0);
glLoadIdentity();
    glutSwapBuffers();

}
void reshape(int width, int height)
{
 //glEnable(GL_DEPTH_TEST);
glViewport(0,0,width,height);

/* switch to the projection matrix */
glMatrixMode(GL_PROJECTION);

/* clear the projection matrix */
glLoadIdentity();
  gluPerspective(45,1,0,20);
  glTranslatef(0,0,-5);
/* at centre but resizing won't disturb drawing */



/* switch back to the model view matrix */
glMatrixMode(GL_MODELVIEW);
}

void keyboard_input(unsigned char key, int x, int y)
{
switch(key)
{
case '2':
    flag1 = true;
    break;
case '1' :
    flag2 = true;
    break;

}
}
#包括
#包括
#包括
作废显示(作废);
空洞重塑(int,int);
无效键盘输入(无符号字符键,整数x,整数y);
int d=0;
浮动角度=0;
浮动x=2;
bool add_flag=false,flag=true,flag1=false,flag2=false;
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitWindowSize(512、512);
glutInitDisplayMode(GLUT_RGBA | GLUT_深度| GLUT_双精度);
实验6;
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
glutKeyboardFunc(键盘输入);
glClearColor(0,0,0,1);
glutIdleFunc(显示);
glutMainLoop();
返回0;
}
雪人{
glRotatef(角度,0,1,0);
GL3F(1.0f,1.0f,1.0f);
//牵引机构
glTranslatef(0.0f,0.75f,0.0f);
固体球(0.75f,20,20);
//牵引头
glTranslatef(0.0f,1.0f,0.0f);
固体球(0.25f,20,20);
//吸引眼球
glPushMatrix();
GL3F(0.0f,0.0f,0.0f);
glTranslatef(0.05f,0.10f,0.18f);
固体球(0.05f,10,10);
GLTRANSTEF(-0.1f、0.0f、0.0f);
固体球(0.05f,10,10);
glPopMatrix();
//抽鼻子
//
GL3F(1.0f,0.5f,0.5f);
glRotatef(0.0f,1.0f,0.0f,0.0f);
glTranslatef(0,0.0f,0.25f);
固体锥(0.04f,0.2f,10,2);
}
void drawSnow()
{   
{
glRotatef(角度,0,1,0);
GL3F(1.0,1,1);
固体球(0.05f,10,10);
}
}
无效显示()
{
如果(flag1==true)
{
角度=角度+2;
flag1=假;
}
else if(flag2==true)
{
角度=角度-2;
flag2=假;
}
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
对于(浮点i=-2;i=2)
{
x=2;
add_flag=true;
}

else if(x你的问题可能在于
glu透视图
调用。你不应该将近平面设置为零,因为它会导致奇怪的矩阵(当你考虑类似的
glFrustum
调用时,这一点更为明显)。尝试将近平面更改为1甚至0.01,看看它是否看起来更好

有关发生这种情况的原因的线索,请参见:

备注:
深度缓冲区精度受为zNear和zFar指定的值影响。zFar与zNear的比率越大,深度缓冲区在区分彼此相邻的曲面时的效果就越差。如果

r=zFar/zNear

深度缓冲区精度的大约log2(r)位丢失。因为当zNear接近0时r接近无穷大,所以zNear永远不能设置为0


这是学校还是大学的作业?我还要在init中添加一个值depth clear:
glClearDepth(std::numeric_limits::max());