Как установить плоскости отсечения с помощью opengl и pyglet - PullRequest
0 голосов
/ 12 июня 2018

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

Есть ли простой питонический способ установить мои плоскости отсечения в pyglet?

Это мой код:

import pyglet
from pyglet.gl import *
import pywavefront
from camera import FirstPersonCamera


def drawloop(win,camera):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    #glClearColor(255,255,255,255)
    glLoadIdentity()
    camera.draw()

    pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
    ('v3f', (10.0, 15.0, 0.0, 30.0, 35.0, 150.0))
    )
    glPointSize(20.)
    return pyglet.event.EVENT_HANDLED


def main():
    win = pyglet.window.Window()
    win.set_exclusive_mouse(True)
    win.clear()
    camera = FirstPersonCamera(win)
    @win.event
    def on_draw(): 
        drawloop(win,camera)
    def on_update(delta_time):
        camera.update(delta_time)
    pyglet.clock.schedule(on_update)
    pyglet.app.run()

if __name__ == '__main__':
    main()

Я использую фрагмент FirstPersonCamera отсюда:

https://gist.github.com/mr-linch/f6dacd2a069887a47fbc

1 Ответ

0 голосов
/ 12 июня 2018

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

Вы должны установить матрицу проекции, чтобы решить проблему.Либо настройте матрицу ортографической проекции или матрицу перспективной проекции.

Матрица проекции описывает отображение от трехмерных точек вида на сцене до двухмерных точек в области просмотра.Он преобразуется из пространства глаза в пространство клипа, а координаты в пространстве клипа преобразуются в нормализованные координаты устройства (NDC) путем деления на компоненту w координат клипа.НДЦ находятся в диапазоне (-1, -1, -1) - (1,1,1).Каждая геометрия, которая находится вне пространства клиппирования, обрезается.

В ортогональной проекции координаты в пространстве просмотра линейно отображаются на координаты пространства отсечения, а координаты пространства отсчета равны нормализованным координатам устройства, поскольку компонент w равен 1 (для декартовой входной координаты),Значения слева, справа, снизу, сверху, близко и далеко определяют поле.Вся геометрия, которая находится внутри объема окна, «видна» в окне просмотра.

orthographic projection

В перспективной проекции матрица проекции описывает отображение из трехмерных точек мира, как они видны с камеры-обскуры, в двумерные точкиокно просмотра.Координаты пространства глаза в усечении камеры (усеченная пирамида) отображаются в куб (нормализованные координаты устройства).

perspective projection

Чтобы установить матрицу проекции, необходимо выбрать стек матрицы проекций с помощью 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)
...