如何在PyGlet中绘制三维模型

2024-06-16 11:24:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我能够得到一个.obj格式的3D模型,但我不知道如何在屏幕上绘制它。这是我的密码:

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>

Tags: 模型objmodel屏幕格式绘制windowresource
2条回答

我很确定pyglet是为2d设计的。.draw()函数逐像素光栅化2d图像,但3d模型甚至一个简单的立方体都需要更复杂的渲染方法。您可能需要为此项目编写更多的代码。一个简单的方法可能是光线投射,就像最初的末日游戏一样,它提供了非常简单的3d图形,可以有纹理。不幸的是,这种方法使复杂的形状变得不可能,您必须在项目中对所有模型进行编码,而不是使用诸如blender之类的外部源。将三维模型压缩为二维图像的方法有很多,但仅仅使用.draw()函数是不够的。根据您正在制作的游戏/程序的类型,您可能希望使用光线投射或其他方法,但我建议使用其他游戏引擎来创建3d游戏。Unity是一个很好的例子,也是一个不真实的引擎

GitHub上的pyglet文档中有一个简单的示例,如下所示:

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

相关问题 更多 >