Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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加载和显示带有.mtl纹理的.obj文件_Python_Python 3.x_Opengl_3d_Pygame - Fatal编程技术网

Python 如何使用pyopengl加载和显示带有.mtl纹理的.obj文件

Python 如何使用pyopengl加载和显示带有.mtl纹理的.obj文件,python,python-3.x,opengl,3d,pygame,Python,Python 3.x,Opengl,3d,Pygame,我正在尝试加载和显示一个obj文件(model.obj),但是,我似乎找不到一种使用PyopenGL显示其纹理(来自.mtl文件)的方法。 我知道如何加载模型,但纹理不起作用 以下是我目前的代码: main.py: 导入pygame 从pygame.locals导入* 从OpenGL.GL导入* 从OpenGL.GLU导入* 输入波前 输入数学 导入时间 pygame.init() 显示=(400300) screen=pygame.display.set_模式(显示,DOUBLEBUF | O

我正在尝试加载和显示一个obj文件(model.obj),但是,我似乎找不到一种使用PyopenGL显示其纹理(来自.mtl文件)的方法。 我知道如何加载模型,但纹理不起作用

以下是我目前的代码:

main.py:

导入pygame
从pygame.locals导入*
从OpenGL.GL导入*
从OpenGL.GLU导入*
输入波前
输入数学
导入时间
pygame.init()
显示=(400300)
screen=pygame.display.set_模式(显示,DOUBLEBUF | OPENGL)
glEnable(GL_深度_测试)
glEnable(德国劳埃德大学照明)
glShadeModel(GLU平滑)
glEnable(德国劳埃德船级社颜色材料)
glColorMaterial(GL_前部和后部、GL_环境和_漫反射)
glEnable(Glu LIGHT0)
glLightfv(GL_LIGHT0,GL_环境光[0.5,0.5,0.5,1])
glLightfv(GL_LIGHT0,GL_漫反射,[1.0,1.0,1.0,1])
球面=二次曲面()
glMatrixMode(GL_投影)
透视图(45,(显示[0]/显示[1]),0.1,50.0)
glMatrixMode(GLU模型视图)
gluLookAt(0,-8,0,0,0,0,0,0,1)
viewMatrix=glGetFloatv(GL\U模型视图\U矩阵)
glLoadIdentity()
def loadOBJ(型号):
场景=波前。波前(模型,收集面=真)
场景\框=(场景.顶点[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)
glPushMatrix()
glScalef(*场景大小)
GLTRANSTEF(*场景_trans)
对于scene.mesh_列表中的网格:
glBegin(GLU三角形)
对于mesh.faces中的面:
对于面中的顶点_i:
glVertex3f(*场景.顶点[vertex_i])
格伦德()
GLPOP矩阵()
#初始化鼠标移动并使鼠标在屏幕上居中
displayCenter=[screen.get_size()[i]//2用于范围(2)内的i]
mouseMove=[0,0]
pygame.mouse.set_pos(显示中心)
camX=0
camY=0
camZ=0
平移=(0,0,0)
上下角度=0.0
暂停=错误
运行=真
运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_转义或event.key==pygame.K_返回:
运行=错误
如果event.key==pygame.K\u暂停或event.key==pygame.K\p:
暂停=未暂停
pygame.mouse.set_pos(显示中心)
如果未暂停:
如果event.type==pygame.MOUSEMOTION:
mouseMove=[event.pos[i]-displayCenter[i]表示范围内的i(2)]
pygame.mouse.set_pos(显示中心)
如果未暂停:
#拿到钥匙
keypress=pygame.key.get_press()
#mouseMove=pygame.mouse.get_rel()
#初始模型视图矩阵
glLoadIdentity()
#应用上下查找
上下角度+=鼠标移动[1]*0.1
glRotatef(上下角度,1.0,0.0,0.0)
#初始化视图矩阵
glPushMatrix()
glLoadIdentity()
#应用移动
如果按键[pygame.K_w]:
#glTranslatef(0,0,0.1)
camY+=0.1
如果按键[pygame.K_s]:
#glTranslatef(0,0,-0.1)
凯美+=-0.1
如果按键[pygame.K_d]:
#glTranslatef(-0.1,0,0)
camX+=0.1
如果按键[pygame.K_a]:
#glTranslatef(0.1,0,0)
camX+=-0.1
如果按键[pygame.K_q]:
#glTranslatef(0,-0.1,0)
camZ+=-0.1
如果(按键[pygame.K_e]):
#glTranslatef(0,0.1,0)
camZ+=0.1
#打印(“X=“+str(camX))
#打印(“Y=“+str(凸轮轴))
#打印(“Z=“+str(camZ))
#应用左右旋转
glRotatef(鼠标移动[0]*0.1,0.0,1.0,0.0)
#将当前矩阵乘以新的视图矩阵,并存储最终的vie矩阵
glMultMatrixf(视图矩阵)
viewMatrix=glGetFloatv(GL\U模型视图\U矩阵)
#应用视图矩阵
GLPOP矩阵()
glMultMatrixf(视图矩阵)
glLightfv(GL_LIGHT0,GL_位置,[1,-1,1,0])
glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位)
glPushMatrix()
glColor4f(0.5,0.5,0.5,1)
glBegin(GLU四边形)
glVertex3f(-10,-10,-2)
glVertex3f(10,-10,-2)
glVertex3f(10,10,-2)
glVertex3f(-10,10,-2)
格伦德()
#GLTRANSTEF(凸轮轴、凸轮轴、凸轮轴)
glColor4f(0.5,0.2,0.2,1)
gluSphere(球体,1.0,32,16)
GLTRANSTEF(凸轮轴+0.2,凸轮轴+0.3,凸轮轴)
glColor4f(0.2,0.2,0.5,1)
loadOBJ(“./model.obj”)
GLPOP矩阵()
pygame.display.flip()
pygame.时间.等等(10)
pygame.quit()
我在网上尝试了很多教程,但是,很多教程不适用于Python3,或者不适合我的需要