对 glPerspective 和 GL_POLYGON 的困惑

confusion about glPerspective and GL_POLYGON

我对 glPerspective 的工作原理感到困惑。我在理论上知道它的作用,但在尝试使用它时我对它感到困惑。

这是我的代码(我使用 Pygame 创建了 window):

import pygame, sys
from OpenGL.GL import *
from OpenGL.GLU import *

pygame.init()
clock = pygame.time.Clock()
display = (800,600)
screen = pygame.display.set_mode(display,pygame.DOUBLEBUF|pygame.OPENGL)

# Perspective
gluPerspective(0, (display[0]/display[1]),0.1,50.0)

# Transformations
glScalef(0.5,0.5,0.5)
glTranslatef(0.0,0.0,0.0)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

    glBegin(GL_POLYGON)
    glVertex3f(-1.0,-1.0,0.0)
    glVertex3f(1.0,-1.0,0.0)
    glVertex3f(0.0,1.0,0.0)
    glEnd()

    pygame.display.flip()
    clock.tick(120)

有两件事让我感到困惑:

  1. 只有视野为0时才能看到多边形;它消失在任何更高的值,甚至像 0.001。不应该变小吗?我通常对此感到困惑,难道 fov 为 0 意味着我们什么都看不到吗?

  2. 我已经将裁剪范围设置为0.1到50,所以在当前的例子中绘制的多边形应该不会消失,因为它太近了。我什至将所有维度的 glTranslatef 设置为 0,以确保它低于下裁剪范围。但它仍然显示。

非常感谢!

数字 0 不是 gluPerspective 视野的有效参数。这是未定义的行为。很可能根本没有设置(更改)投影矩阵。
您看不到几何体,因为它被 Viewing frustum 的近平面裁剪了,所有不在平截头体的近平面和远平面中的几何体都被裁剪了。

设置一个有效角度的透视投影。例如:

gluPerspective(90, (display[0]/display[1]), 0.1, 50.0)

在近平面和远平面之间沿负 z 轴移动几何:

glBegin(GL_POLYGON)
glVertex3f(-1.0, -1.0, -5.0)
glVertex3f(1.0, -1.0, -5.0)
glVertex3f(0.0, 1.0, -5.0)
glEnd()

请注意,在视图 space 中,z 轴指向视口之外,因此您必须沿负 z 轴移动几何图形。