OpenGL z轴指向哪里?

Posted

技术标签:

【中文标题】OpenGL z轴指向哪里?【英文标题】:Where points OpenGL z-axis? 【发布时间】:2010-08-07 14:28:16 【问题描述】:

我正在尝试了解 OpenGL 坐标系。我到处看到它都被描述为右撇子,但这与我的经验不符。我试图绘制一些形状和 3-d 对象,我看到显然 z 轴指向“进入屏幕”(而 x 指向右侧,y 向上 - 这是左手坐标系的描述)。我错过了什么?

编辑: 例如:http://img576.imageshack.us/img576/9234/triangles.jpg 如果 +Z 指向查看器,为什么 z 坐标较大的绿色三角形在红色三角形后面?

初始化GL:

qglClearColor(Qt::darkGray);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc( GL_LEQUAL );    
glEnable(GL_COLOR);  

调整GL:

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0f, 50.0f, -50.0f, 50.0f, 50.0, -50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

油漆GL:

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef (-30.0, 1.0, 0.0, 0.0);
glRotatef (20.0, 0.0, 1.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_LINES);
glVertex3f(45.0, 0.0, 0.0);
glVertex3f(-45.0, 0.0, 0.0);
glVertex3f(0.0, 45.0,  0.0);
glVertex3f(0.0, -45.0,  0.0);
glVertex3f( 0.0, 0.0, 45.0);
glVertex3f( 0.0, 0.0, -45.0);
glEnd();
glBegin(GL_TRIANGLES);
//Red triangle:
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 20.0, 1.0);
glVertex3f(20.0, 0.0, 1.0);
//Green triangle:    
glColor3f(0.0, 1.0, 0.0);
glVertex3f(-15.0, 0.0, 20.0);
glVertex3f(0.0, 25.0, 20.0);
glVertex3f(15.0, 0.0, 20.0);
glEnd();

【问题讨论】:

"如果 +Z 指向查看器,为什么 z 坐标较大的绿色三角形在红色三角形后面?"您将整个场景旋转了两次。在渲染三角形之前调用模型视图矩阵的 glLoadIdentity,然后比较结果。 【参考方案1】:

好的,对我来说最突出的是 glOrtho 函数。您的近剪裁平面和远剪裁平面仅相隔 100 个单位。这似乎非常小。你真的想要那样吗?它由该函数中的最后两个参数表示。

相对于这个小截头体,你的对象也非常大。物体可能直接位于您的相机前面,它会阻止其他物体被看到。

我会放大 glOrtho 调用中的所有参数。高温


在右手系统 (OpenGL) 中,负 Z (-Z) 应指向屏幕。正 Y 应“向上”,正 X 应向右。

这似乎是你描述的,那是一个右手坐标系。

也许这会有所帮助。 http://www.geometrictools.com/Documentation/LeftHandedToRightHanded.pdf

【讨论】:

z 轴“进入屏幕”是指正 Z(Z 坐标越大,距离越远)。我不使用带有负值或类似的 glScale,所以它对我来说有点神秘。 @majaen:也许你设置的模型视图矩阵不同。 z 越大,物体离你越近。 您确定在代码中的某处,其中一个轴没有被“翻转”吗?我记得(模糊地)有一次我翻转了某些轴,甚至在左上角创建了原点以适应 Windows 中的系统。代码中的某处似乎引起了奇怪。 我编辑了我的问题,添加了一个简单的例子,也许它可以帮助找出我的哪些假设是错误的。 在我上面的帖子中查看新的措辞。【参考方案2】:

我错过了什么?

在(视口)左手系统中,x 指向右侧,y 指向上方,z 指向前方(远离观察者)。

右手x 指向右侧,y 指向上方,z 指向后方(朝向观察者)。

图片取自wikipedia。

x 是拇指,y 是食指,z 是中指。

【讨论】:

感谢您的链接,用这张图片解释起来要简单得多:)【参考方案3】:

最后2个参数glOrtho参考:

nearVal,farVal 指定到较近和较远深度剪裁平面的距离。 如果飞机在观察者的后面,这些值为负数。

您较近的剪裁平面位于观察者的前面,而较远的剪裁平面位于观察者的后面。它会翻转 Z 轴。

【讨论】:

这基本上是我在回答前 12 小时所说的话。 是的,z 轴确实被意外翻转了,但是我在找到负责该问题的确切代码行时遇到了问题【参考方案4】:

这取决于你如何绘制。

模型视图的标识和投影的常规 gluPerspective 将期望输入坐标系是右手的(正如 JustBoo 所提到的,-z 在屏幕中)。

但是,如果您加载一组不同的矩阵,则没有什么能阻止您翻转矩阵中的一个坐标,从而形成一个左手系统。 (或 not 翻转。gluPerspective/glFrustum 实际上翻转 z 坐标)。执行此操作时需要牢记一些实际的事情,例如剔除的缠绕顺序。

【讨论】:

以上是关于OpenGL z轴指向哪里?的主要内容,如果未能解决你的问题,请参考以下文章

使用OpenGL在C ++中同时围绕其(x,y&z)轴旋转对象

OpenGL:切换和反转轴

opengl 围绕固定轴旋转对象

OpenGL 相对于对象轴的旋转

OpenGL:尝试使用 VBO(顶点缓冲区对象)绘制线条,它不显示

图形学OpenGL基本光照