Как нарисовать 3D модель в PyGlet

Мне удалось получить 3D-модель в формате .obj, но я не знаю, как нарисовать ее на экране. Вот мой код:

import pyglet

model = pyglet.resource.model('untitled.obj')
window = pyglet.window.Window()

@window.event
def on_draw():
    window.clear()
    model.draw()

pyglet.app.run()

Но выдает эту ошибку:

pyglet.gl.lib.GLException: b'\xed\xe5\xe4\xee\xef\xf3\xf1\xf2\xe8\xec\xee\xe5 \xe7\xed\xe0\xf7\xe5\xed\xe8\xe5' 

Если вы сделаете следующее

model = pyglet.resource.model('untitled.obj')
print(model)

Выход:

<pyglet.model.Model object at 0x02E356E8>

person Михаил Расторгуев    schedule 04.05.2020    source источник
comment
Во-первых, я бы присоединил пакет к модель ресурсов, pyglet.resource.model('untitled.obj', batch=b), а затем выполните b.draw(). Не уверен, что это решит вашу насущную проблему.   -  person Torxed    schedule 04.05.2020


Ответы (2)


В документации по pyglet на GitHub есть простой пример:

import pyglet
from pyglet.gl import *

window = pyglet.window.Window(width=720, height=480)
window.projection = pyglet.window.Projection3D()
batch = pyglet.graphics.Batch()


@window.event
def on_draw():
    window.clear()
    batch.draw()


@window.event
def on_mouse_drag(x, y, dx, dy, buttons, modifiers):
    glRotatef(1, dx, dy, 0)


def rotate(dt):
    glRotatef(0.5, dt, dt, dt)


if __name__ == "__main__":
    glEnable(GL_MULTISAMPLE_ARB)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)

    model = pyglet.model.load("logo3d.obj", batch=batch)
    glTranslatef(0, 0, -3)
    pyglet.clock.schedule_interval(rotate, 1/60)
    pyglet.app.run()
person user14451361    schedule 14.10.2020

Я почти уверен, что pyglet просто создан для 2D-материалов. Функция .draw() растеризует 2D-изображения попиксельно, но для 3D-моделей требуются более сложные методы рендеринга, даже для простого куба. Возможно, вам придется написать намного больше кода для этого проекта. Простым способом может быть raycast, как в оригинальной игре doom, которая дает очень простую 3D-графику, которая может иметь текстуры. К сожалению, этот метод делает сложные формы невозможными, и вам придется кодировать все модели в вашем проекте, не используя внешние источники, такие как блендер. Существует множество методов сжатия 3D-модели в 2D-изображение, но функции .draw() недостаточно. в зависимости от того, какую игру / программу вы создаете, вы можете использовать raycasting или другие методы, но я бы рекомендовал использовать какой-либо другой игровой движок для создания 3D-игр. Unity — хороший пример, нереальный движок тоже.

person Rotten_soap    schedule 01.06.2020