OpenGL 轴出现不同

OpenGL Axis Appearing Different

当我 运行 我的程序时,只查看 xyz 轴,偶尔视角似乎会改变。
通常它看起来像 this。 但有时它看起来像 this.
在第一张图片中,'foreground' 中的任何东西都小得多。而在第二张图片中,一切看起来都差不多大小。我更喜欢第二张图片,但我不知道发生了什么!
这是我的代码:

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)     // Resize And Initialize The GL Window
{
  if (height == 0)                                      // Prevent A Divide By Zero By
  {
    height = 1;                                     // Making Height Equal One
  } 

  glViewport(0, 0, width, height);                      // Reset The Current Viewport

  aspectRatio = (GLfloat)width / (GLfloat)height;
  screenHeight = (GLfloat)height;
  screenWidth = (GLfloat)width;
}

int InitGL(GLvoid)                                      // All Setup For OpenGL Goes Here
{
  glShadeModel(GL_SMOOTH);                          // Enable Smooth Shading
  glClearColor(1.0f, 1.0f, 1.0f, 0.5f);             // Black Background
  glClearDepth(1.0f);                                   // Depth Buffer Setup
  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);    // Really Nice Perspective Calculations
  return TRUE;                                      // Initialization Went OK
}

int DrawGLScene(GLvoid)                                 // Here's Where We Do All The Drawing
{
  //3D setup
  glDepthMask(GL_TRUE);
  glEnable(GL_DEPTH_TEST);                          // Enables Depth Testing
  glDepthFunc(GL_LEQUAL);                               // The Type Of Depth Testing To Do
  glMatrixMode(GL_PROJECTION);                      // Select The Projection Matrix
  glLoadIdentity();                                 // Reset The Projection Matrix

  gluPerspective(45.0f, aspectRatio, 0.1f, 500.0f);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   // Clear Screen And Depth Buffer

  //3D stuff
  glTranslatef(-8.0f*aspectRatio, 0.0f, -zoomInOut);                // Move and zoom axes
  glRotatef(rotateLeftRight, 0.0f, 1.0f, 0.0f);                 // Rotations
  glRotatef(rotateUpDown, 1.0f, 0.0f, 0.0f);
  //axes
  glLineWidth(1.0);
  glColor3f(0.0, 0.0, 1.0);
  glBegin(GL_LINES);//x axis
  glVertex3f(-20.0, 0.0, 0.0);
  glVertex3f(20.0, 0, 0);
  glEnd();
  glBegin(GL_LINES);//y axis
  glVertex3f(0.0, 20.0, 0.0);
  glVertex3f(0.0, -20.0, 0);
  glEnd();
  glBegin(GL_LINES);//z axis
  glVertex3f(0.0, 0.0, 20.0);
  glVertex3f(0.0, 0.0, -20.0);
  glEnd();

  //2D setup
  glDepthMask(GL_FALSE);
  glDisable(GL_DEPTH_TEST);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity(); 

  gluOrtho2D(0, screenWidth, 0, screenHeight); //left,right,bottom,top
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  //2D overlay goes here

  return TRUE;                                      // Keep Going
}

我做了什么来改变轴的外观?

我看不出你的代码有什么问题。

你的翻译代码有点奇怪glTranslatef(-8.0f*aspectRatio, 0.0f, -zoomInOut);

您在 X=-8,Y=0 线上,您将 Z 坐标命名为 zoomInOutWhich is not a zoom but a position. It's the same as if you where in an elevator with outside view and you look at the fountain in the middle of the square at the bottom of the building, you don't zoom, you just look closer (like that).

要进行真正的变焦,您必须更改 视野角度 gluPerspective 的第一个参数)。

您在 X、Y 和 Z 轴上绘制从 -20 到 20 的 3 条线。

在您的屏幕截图上,我们几乎可以从一端看到另一端。没有奇怪的钳位(gluPerspective 的 Z 限制很好 [0.1f,500.0f])。

您的大脑有时看不到应有的透视图这一事实并不是错误,这只是因为您正在查看只有两种颜色(没有阴影、雾...)的平面图像。

“3D”图像(来自 OpenGl & co.)只是视错觉之王,而您编写的程序只是绘制了一个糟糕的错觉。

一个差的,但是一个正确的!这是一个好的开始。