Pygame + Opengl + Frustum ничего не отображает - PullRequest
0 голосов
/ 17 ноября 2011

Я пытаюсь настроить простой трехмерный вид с помощью pygame и opengl, используя frustum для настройки матрицы проекции.Вот мой код инициализации:

def initgl(self):
    glClearColor(0.0,0.0,0.0,0.0)
    glViewport(0,0,640,480)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(0,640,480,0,.1,1000.)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

Вот мой код дисплея:

def paintgl(self):
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    glPushMatrix()
    glColor3f(1.0,1.0,1.0)
    glBegin(GL_QUADS)
    glVertex3f(-1.0,-1.0,0.0)
    glVertex3f(1.0,-1.0,0.0)
    glVertex3f(1.0,1.0,0.0)
    glVertex3f(-1.0,1.0,0.0)
    glEnd()
    glPopMatrix()

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

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

Обратите внимание, что я изменил FOV на более правильный (ближний - 1, дальний - 10), и я вытолкнул свою геометрию до 2 на оси Z, и все еще ничего.

Исправлено:

Я не смотрел в правильном направлении.О, лол.

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Код initgl должен быть помещен в paintgl, он чище и впоследствии избавляет от многих головных болей.

Ближний самолет должен быть выбран как можно дальше, ближний самолет как можно ближе и ближе. Текущие настройки ближней и дальней плоскостей значительно снижают точность буфера глубины. Все, что находится дальше, чем 100 единиц, будет испытывать борьбу с Z-буфером (если только это не очень масштабная геометрия).


При этом: ваша геометрия находится просто за ближней плоскостью, то есть слишком близко, чтобы быть видимой. Переместите его немного в направлении -Z.


Обновление: предложение кода

def paintgl(self):
    glClearColor(0.0,0.0,0.0,0.0)
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

    glViewport(0,0,640,480)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(0,640,480,0,1.,10.)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glTranslatef(0., 0., -2.)

    glColor3f(1.0,1.0,1.0)
    glBegin(GL_QUADS)
    glVertex3f(-1.0,-1.0,0.0)
    glVertex3f(1.0,-1.0,0.0)
    glVertex3f(1.0,1.0,0.0)
    glVertex3f(-1.0,1.0,0.0)
    glEnd()
1 голос
/ 17 ноября 2011

Я никогда не использовал glFrustum (весь стек матриц устарел со времен OpenGL3.3, кстати), но, поскольку 5-й параметр кажется ближней плоскостью, ваша геометрия просто за ней!

В другихсловами, все вершины, уже находящиеся в мировом пространстве (поскольку вы не устанавливаете матрицу вида модели) и имеющие Z, равные 0,0, находятся за ближней плоскостью в 0,1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...