Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyOpenGL如何导入obj文件?_Python_Opengl_Blender_Pyopengl_Wavefront - Fatal编程技术网

Python PyOpenGL如何导入obj文件?

Python PyOpenGL如何导入obj文件?,python,opengl,blender,pyopengl,wavefront,Python,Opengl,Blender,Pyopengl,Wavefront,现在我想用立方体将场景添加到我的窗口中,或者替换它 有人能告诉我如何做到这一点吗 在opengl和pygame中找不到关于如何正确使用波前的更多信息 opengl编程的新功能 所以我想我必须从我的场景中添加新的顶点,对吗 我想现在添加obj来学习如何将搅拌机模型导入游戏 谢谢当您阅读文章时,设置关键字参数collect\u faces=True。这导致为每个网格收集三角形面数据。:/br> (见附件) scene=pywavefront.Wavefront('Handgun_obj.obj',c

现在我想用立方体将场景添加到我的窗口中,或者替换它

有人能告诉我如何做到这一点吗

在opengl和pygame中找不到关于如何正确使用波前的更多信息

opengl编程的新功能

所以我想我必须从我的场景中添加新的顶点,对吗

我想现在添加obj来学习如何将搅拌机模型导入游戏


谢谢

当您阅读文章时,设置关键字参数
collect\u faces=True
。这导致为每个网格收集三角形面数据。:/br> (见附件)

scene=pywavefront.Wavefront('Handgun_obj.obj',collect_faces=True)
计算场景框。顶点包含在
场景中。顶点
。每个顶点是具有3个组件(x、y、z坐标)的元组:

scene\u box=(scene.vertices[0],scene.vertices[0])
对于场景中的顶点。顶点:
min_v=[min(场景_框[0][i],顶点[i]),用于范围(3)中的i]
max_v=[max(场景_框[1][i],顶点[i])表示范围(3)内的i]
场景框=(最小值,最大值)
计算将对象中心移动到原点的平移和将对象缩放到定义大小的比例(
scaled\u size
):

scene_trans=[-(scene_box[1][i]+scene_box[0][i])/2表示范围(3)内的i)
缩放尺寸=5
场景大小=[场景框[1][i]-场景框[0][i]用于范围(3)内的i]
最大场景大小=最大(场景大小)
场景大小=[范围(3)内i的缩放大小/最大场景大小]
每个场景都由网格组成(
scene.mesh\u list
),每个网格都有三角形面(
mesh.faces
)。每个fac是一个由3个独立元素组成的数组,它们表示顶点数组[
场景.顶点]/code>]。装箱一个函数,用于设置比例和平移,并在嵌套循环中绘制模型:

def Model():
glPushMatrix()
glScalef(*场景大小)
GLTRANSTEF(*场景_trans)
对于scene.mesh_列表中的网格:
glBegin(GLU三角形)
对于mesh.faces中的面:
对于面中的顶点_i:
glVertex3f(*场景.顶点[vertex_i])
格伦德()
GLPOP矩阵()
请参见示例():

导入pygame
导入OpenGL
从pygame.locals导入*
从OpenGL.GL导入*
从OpenGL.GLU导入*
输入波前
场景=pywavefront.Wavefront('bunny.obj',collect_faces=True)
场景\框=(场景.顶点[0],场景.顶点[0])
对于场景中的顶点。顶点:
min_v=[min(场景_框[0][i],顶点[i]),用于范围(3)中的i]
max_v=[max(场景_框[1][i],顶点[i])表示范围(3)内的i]
场景框=(最小值,最大值)
场景大小=[场景框[1][i]-场景框[0][i]用于范围(3)内的i]
最大场景大小=最大(场景大小)
缩放尺寸=5
场景大小=[范围(3)内i的缩放大小/最大场景大小]
场景_trans=[-(场景_框[1][i]+场景_框[0][i])/2,用于范围(3)中的i)
def模型():
glPushMatrix()
glScalef(*场景大小)
GLTRANSTEF(*场景_trans)
对于scene.mesh_列表中的网格:
glBegin(GLU三角形)
对于mesh.faces中的面:
对于面中的顶点_i:
glVertex3f(*场景.顶点[vertex_i])
格伦德()
GLPOP矩阵()
def main():
pygame.init()
显示=(800600)
pygame.display.set_模式(显示,DOUBLEBUF | OPENGL)
gluPerspective(45,(显示[0]/显示[1]),1500.0)
glTranslatef(0.0,0.0,-10)
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
退出
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_左:
GLTRANSTEF(-0.5,0,0)
如果event.key==pygame.K_RIGHT:
glTranslatef(0.5,0,0)
如果event.key==pygame.K_UP:
glTranslatef(0,1,0)
如果event.key==pygame.K_向下:
glTranslatef(0,-1,0)
glRotatef(1,5,1,1)
glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位)
glPolygonMode(GLU前、后、GLU线)
模型()
glPolygonMode(GLU前、后、GLU填充)
pygame.display.flip()
pygame.时间.等等(10)
main()
import pygame
import OpenGL
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import pywavefront


scene = pywavefront.Wavefront('Handgun_obj.obj')

vertices =(
    (1,-1,-1),
    (1,1,-1),
    (-1,1,-1),
    (-1,-1,-1),
    (1,-1,1),
    (1,1,1),
    (-1,-1,1),
    (-1,1,1),
    )

edges = (
    (0,1),
    (0,3),
    (0,4),
    (2,1),
    (2,3),
    (2,7),
    (6,3),
    (6,4),
    (6,7),
    (5,1),
    (5,4),
    (5,7)
    )

colors = (
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (0,1,0),
    (1,1,1),
    (0,1,1),
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (1,0,0),
    (1,1,1),
    (0,1,1),
    )

surfaces = (
    (0,1,2,3),
    (3,2,7,6),
    (6,7,5,4),
    (4,5,1,0),
    (1,5,7,2),
    (4,0,3,6)
    )



def Cube():
    glBegin(GL_QUADS)
    for surface in surfaces:
        x = 0
        for vertex in surface:
            x += 1
            glColor3fv(colors[x])
            glVertex3fv(vertices[vertex])
    glEnd()

    glBegin(GL_LINES) #tells OpenGL dass code erhalten wird der als line-drawing code benutzt wird
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

def main():
        pygame.init()
        display = (800, 600)
        pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
        gluPerspective(45, (display[0] / display[1]), 1, 500.0)
        glTranslatef(0.0, 0.0, -10)

        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    quit()

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_LEFT:
                        glTranslatef(-0.5,0,0)
                    if event.key == pygame.K_RIGHT:
                        glTranslatef(0.5,0,0)
                    if event.key == pygame.K_UP:
                        glTranslatef(0,1,0)
                    if event.key == pygame.K_DOWN:
                        glTranslatef(0,-1,0)


            glRotatef(1, 5, 1, 1)
            glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
            Cube()
            pygame.display.flip()
            pygame.time.wait(10)

main()