путаница с glPerspective и GL_POLYGON - PullRequest
3 голосов
/ 25 мая 2020

Я не понимаю, как работает glPerspective. Теоретически я знаю, что он делает, но меня это смущает, когда я пытаюсь его использовать.

Вот мой код (я использовал Pygame для создания окна):

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)

Есть 2 c вещей, которые меня не устраивают:

  1. Я могу видеть многоугольник, только когда поле обзора равно 0; он исчезает при любом более высоком значении, даже примерно 0,001. Разве не должно быть меньше? Обычно меня это смущает, разве значение fov, равное 0, не означает, что мы ничего не видим?

  2. Я установил диапазон отсечения от 0,1 до 50, поэтому в текущем примере нарисованный многоугольник не должен исчезнуть, так как он находится слишком близко. Я даже установил для glTranslatef значение 0 для всех размеров, чтобы убедиться, что он ниже нижнего диапазона отсечения. Но это все равно показано.

Заранее большое спасибо!

1 Ответ

1 голос
/ 25 мая 2020

Число 0 не является допустимым параметром для поля зрения gluPerspective. Это неопределенное поведение. Скорее всего, матрица проекции вообще не установлена ​​(не изменена).
Вы не можете видеть геометрию, потому что она ограничена ближней плоскостью усеченной пирамиды всей геометрии, которая не входит в ближняя и дальняя плоскости усеченного конуса обрезаются.

Установите перспективную проекцию с допустимым углом. Например:

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()

Обратите внимание, что в пространстве обзора ось z указывает за пределы окна просмотра. , поэтому вам нужно сместить геометрию вдоль отрицательной оси Z.

...