0

当 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 绘制的,而近和远在 0 和 1 之间。但是为什么没有绘制三角形?

以下代码用于在 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();
4

2 回答 2

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 );
于 2013-05-27T04:48:09.703 回答
0

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

glOrtho()只是定义为正值是指观察者前面的位置(因此它与 的行为一致glFrustum()),而负值是在观察者后面,所以实际上,平面z=-nearVal位于z=-farVal眼睛空间中。

于 2013-05-26T18:10:59.610 回答