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 轴看起来不同的主要内容,如果未能解决你的问题,请参考以下文章