OpenGL 轴看起来不同

Posted

技术标签:

【中文标题】OpenGL 轴看起来不同【英文标题】:OpenGL Axis Appearing Different 【发布时间】:2015-09-10 11:32:14 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

您位于 X=-8, Y=0 线上,并将 Z 坐标命名为 zoomInOut。 Which is not a zoom but a position。这就像你在电梯里看到外面的景色,你看着大楼底部广场中间的喷泉,你不放大,你只是仔细看(like that)。

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

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

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

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

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

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

【讨论】:

以上是关于OpenGL 轴看起来不同的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL在给定方向上的旋转

opengl 围绕固定轴旋转对象

围绕世界轴OpenGL旋转对象

OpenGL - 围绕 Y 轴旋转“曲线”

opengl - 比我设置的更小的帧缓冲纹理?

OpenGL中的轨迹球旋转