Я устраняю проблему с моим кодом: если значение глубины любого примитива не равно нулю, оно не будет отображаться на экране.Я подозреваю, что это отсекается.
Вы должны установить матрицу проекции, чтобы решить проблему.Либо настройте матрицу ортографической проекции или матрицу перспективной проекции.
Матрица проекции описывает отображение от трехмерных точек вида на сцене до двухмерных точек в области просмотра.Он преобразуется из пространства глаза в пространство клипа, а координаты в пространстве клипа преобразуются в нормализованные координаты устройства (NDC) путем деления на компоненту w
координат клипа.НДЦ находятся в диапазоне (-1, -1, -1) - (1,1,1).Каждая геометрия, которая находится вне пространства клиппирования, обрезается.
В ортогональной проекции координаты в пространстве просмотра линейно отображаются на координаты пространства отсечения, а координаты пространства отсчета равны нормализованным координатам устройства, поскольку компонент w
равен 1 (для декартовой входной координаты),Значения слева, справа, снизу, сверху, близко и далеко определяют поле.Вся геометрия, которая находится внутри объема окна, «видна» в окне просмотра.
В перспективной проекции матрица проекции описывает отображение из трехмерных точек мира, как они видны с камеры-обскуры, в двумерные точкиокно просмотра.Координаты пространства глаза в усечении камеры (усеченная пирамида) отображаются в куб (нормализованные координаты устройства).
Чтобы установить матрицу проекции, необходимо выбрать стек матрицы проекций с помощью glMatrixMode
.
Ортографическая проекция может быть установлена с помощью glOrhto
:
w, h = 640, 480 # default pyglet window size
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho( -w/2, w/2, -h/2, h/2, -1000.0, 1000.0) # [near, far] = [-1000, 1000]
glMatrixMode(GL_MODELVIEW)
....
Перспективная проекция может быть установлена с помощью gluPerspective
:
w, h = 640, 480 # default pyglet window size
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective( 90.0, 640.0/480, 0.1, 1000.0) # fov = 90 degrees; [near, far] = [0.1, 1000]
glMatrixMode(GL_MODELVIEW)
....
Я рекомендую использовать следующие координаты, чтобы «увидеть» точки в обоих вышеупомянутых случаях:
например:
pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
('v3f', (-50.0, -20.0, -200.0, 40.0, 20.0, -250.0)))
glPointSize(20.0)