glOrtho不显示三角形

时间:2013-05-26 17:55:45

标签: windows opengl graphics projection

当glOrtho z介于0和1之间时,不会绘制

三角形。

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -1,1,-1,1,-1,1 );

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
// Draw a triagnle in z 0.5
glBegin( GL_TRIANGLES );
glColor3f( 1, 0, 0 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( 0.0, 0.5, 0.5 );
glEnd();

显示红色三角形。对我来说很好。

但是当我将近剪裁平面更改为0时,它什么也没显示。 三角形用z 0.5绘制,而near和far在0和1之间。 但Triangle并不是为什么?

以下代码用于显示z 0.5

中的三角形
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -1,1,-1,1,0,1 );


glMatrixMode( GL_MODELVIEW );
glLoadIdentity();


// Draw a triagnle in z 0.5 This triangle is not displayed.
glBegin( GL_TRIANGLES );
glColor3f( 1, 0, 0 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( 0.0, 0.5, 0.5 );
glEnd();

2 个答案:

答案 0 :(得分:1)

请注意,您的三角形正在相机后面绘制。 正Z方向向后,朝向屏幕,负Z方向向前,朝向远平面。但是,在glOrtho中,近处和远处的平面仅在相机前面距离,而不是实际的Z坐标。

在您的第一个示例中,近平面为-1,远平面为1,因此平截头体在摄像机前方(后方1个单位)到摄像机前方1个单位的范围为-1个单位。 (从前面的1个后面到1个)因此,绘制了相机背后的物体。

在你的第二个例子中,近平面在相机前面是0个单位,而远平面在相机前面是1个单位(从原点到前面的1个),所以你的没有画出相机后面的物体。

要修复它,您应该更改要在相机前面绘制的三角形,方法是将其绘制在-0.5 z

// Setup ortho projection from the origin.
glOrtho( -1,1,-1,1,0,1 );

...

// Draw a triangle in front of the camera, at -0.5 z
glVertex3f( -0.5, -0.5, -0.5 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.0, 0.5, -0.5 );

如果您希望使用正Z值表示前向,还有其他方法,例如反转Z轴

// Setup ortho projection from the origin, with the Z axis reversed.
// (the far plane is behind the near plane.)
glOrtho( -1,1,-1,1,0,-1 );

...

// Draw a triangle at 0.5 z
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( 0.0, 0.5, 0.5 );

答案 1 :(得分:0)

nearValfarVal指定剪裁平面的z值,但指定与相机的距离。在固定功能OpenGL中,眼睛空间定义为相机在原点,看 -z 方向。

glOrtho()刚刚被定义为正值表示观众面前的位置(因此它与glFrustum()的行为一致),负面的vaules在观众的后面,所以实际上,这些飞机在眼睛空间中位于z=-nearValz=-farVal