用python+opengl+pygame加载obj格式三维模型(加mtl贴图),所需安装库文件pygame opengl

以下为所有代码

objloader.py

import pygame
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *def MTL(filename):contents = {}mtl = Nonefor line in open(filename, "r"):if line.startswith('#'): continuevalues = line.split()if not values: continueif values[0] == 'newmtl':mtl = contents[values[1]] = {}elif mtl is None:raise (ValueError, "mtl file doesn't start with newmtl stmt")elif values[0] == 'map_Kd':# load the texture referred to by this declarationmtl[values[0]] = values[1]print(mtl['map_Kd'])surf = pygame.image.load(mtl['map_Kd'])image = pygame.image.tostring(surf, 'RGBA', 1)ix, iy = surf.get_rect().sizetexid = mtl['texture_Kd'] = glGenTextures(1)glBindTexture(GL_TEXTURE_2D, texid)glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR)glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR)glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ix, iy, 0, GL_RGBA,GL_UNSIGNED_BYTE, image)else:mtl[values[0]] = map(float, values[1:])return contentsclass OBJ:def __init__(self, filename, swapyz=False):"""Loads a Wavefront OBJ file. """self.vertices = []self.normals = []self.texcoords = []self.faces = []material = Nonefor line in open(filename, "r"):if line.startswith('#'): continuevalues = line.split()if not values: continueif values[0] == 'v':v = map(float, values[1:4])if swapyz:v = v[0], v[2], v[1]self.vertices.append(v)elif values[0] == 'vn':v = map(float, values[1:4])if swapyz:v = v[0], v[2], v[1]self.normals.append(v)elif values[0] == 'vt':self.texcoords.append(map(float, values[1:3]))elif values[0] in ('usemtl', 'usemat'):material = values[1]elif values[0] == 'mtllib':self.mtl = MTL(values[1])elif values[0] == 'f':face = []texcoords = []norms = []for v in values[1:]:w = v.split('/')face.append(int(w[0]))if len(w) >= 2 and len(w[1]) > 0:texcoords.append(int(w[1]))else:texcoords.append(0)if len(w) >= 3 and len(w[2]) > 0:norms.append(int(w[2]))else:norms.append(0)self.faces.append((face, norms, texcoords, material))self.gl_list = glGenLists(1)glNewList(self.gl_list, GL_COMPILE)glEnable(GL_TEXTURE_2D)glFrontFace(GL_CCW)for face in self.faces:vertices, normals, texture_coords, material = facemtl = self.mtl[material]if 'texture_Kd' in mtl:# use diffuse texmapglBindTexture(GL_TEXTURE_2D, mtl['texture_Kd'])else:# just use diffuse colourglColor(*mtl['Kd'])glBegin(GL_POLYGON)for i in range(len(vertices)):if normals[i] > 0:glNormal3fv(self.normals[normals[i] - 1])if texture_coords[i] > 0:glTexCoord2fv(self.texcoords[texture_coords[i] - 1])glVertex3fv(self.vertices[vertices[i] - 1])glEnd()glDisable(GL_TEXTURE_2D)glEndList()

viewer.py

# Basic OBJ file viewer. needs objloader from:
#  http://www.pygame.org/wiki/OBJFileLoader
# LMB + move: rotate
# RMB + move: pan
# Scroll wheel: zoom in/out
import sys, pygame
from pygame.locals import *
from pygame.constants import *
from OpenGL.GL import *
from OpenGL.GLU import *# IMPORT OBJECT LOADER
from objloader import *pygame.init()
viewport = (800,600)
hx = viewport[0]/2
hy = viewport[1]/2
srf = pygame.display.set_mode(viewport, OPENGL | DOUBLEBUF)glLightfv(GL_LIGHT0, GL_POSITION,  (-40, 200, 100, 0.0))
glLightfv(GL_LIGHT0, GL_AMBIENT, (0.2, 0.2, 0.2, 1.0))
glLightfv(GL_LIGHT0, GL_DIFFUSE, (0.5, 0.5, 0.5, 1.0))
glEnable(GL_LIGHT0)
glEnable(GL_LIGHTING)
glEnable(GL_COLOR_MATERIAL)
glEnable(GL_DEPTH_TEST)
glShadeModel(GL_SMOOTH)           # most obj files expect to be smooth-shaded# LOAD OBJECT AFTER PYGAME INIT
obj = OBJ(sys.argv[1], swapyz=True)clock = pygame.time.Clock()glMatrixMode(GL_PROJECTION)
glLoadIdentity()
width, height = viewport
gluPerspective(90.0, width/float(height), 1, 100.0)
glEnable(GL_DEPTH_TEST)
glMatrixMode(GL_MODELVIEW)rx, ry = (0,0)
tx, ty = (0,0)
zpos = 5
rotate = move = False
while 1:clock.tick(30)for e in pygame.event.get():if e.type == QUIT:sys.exit()elif e.type == KEYDOWN and e.key == K_ESCAPE:sys.exit()elif e.type == MOUSEBUTTONDOWN:if e.button == 4: zpos = max(1, zpos-1)elif e.button == 5: zpos += 1elif e.button == 1: rotate = Trueelif e.button == 3: move = Trueelif e.type == MOUSEBUTTONUP:if e.button == 1: rotate = Falseelif e.button == 3: move = Falseelif e.type == MOUSEMOTION:i, j = e.relif rotate:rx += iry += jif move:tx += ity -= jglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)glLoadIdentity()# RENDER OBJECTglTranslate(tx/20., ty/20., - zpos)glRotate(ry, 1, 0, 0)glRotate(rx, 0, 1, 0)glCallList(obj.gl_list)pygame.display.flip()

以上为效果图

如果出现读文件类的错误,就打开.obj文件和.mtl查看文件路径,如果还是出错没办法解决就把.py文件与所有的资源文件放在一起并且将.obj和.mtl文件中的所有文件路径改为./resouse(文件名).jpg(图片名后缀)

用python加载obj格式三维模型(加mtl贴图)相关推荐

  1. Panda3D如何加载obj格式的3D模型文件

    ​ 在上文中,讲了如何将max.obj.mb.fbx等主流格式的3D模型文件转换为egg.gltf格式,Panda3D可以加载的格式.在上文末尾,博主临时看到了一种方式,可以让Panda3d直接加载o ...

  2. openGL使用assimp加载fbx格式三维模型

    前言 前面的文章中有讲过assimp加载obj三维文档格式,如果想要加入纹理还得配合对应的mtl格式和png格式才能加入纹理,今天来说下使用assimp加载fbx格式的三维模型. 先看下运行效果 使用 ...

  3. wpf加载obj格式的3D模型图解

    网上下一个obj格式的3D模型:再下一个obj文件查看器,看一下模型,效果如下: 使用SharpDevelop,新建一个WPF工程: 加载obj模型需要WavefrontObjLoader.cs文件: ...

  4. threejs封装加载 .glb 格式模型,修改贴图

    组件 <template><div id="modelCreation"><slot></slot></div> < ...

  5. 通过超图在网页上加载obj格式3D模型

    先看此文: https://blog.csdn.net/bcbobo21cn/article/details/109140958 在桌面版加载一个obj模型出来: 按目前的理解,只要在桌面版加载了模型 ...

  6. VR 效果 前端使用 three.js 加载 Obj,drc文件(三维模型文件)

    VR 效果 前端使用 three.js 加载 Obj(三维模型文件) 前言:我对 three.js 并不熟!只是朋友有这个需求,写了几个 demo 运行,能看~.如果想深入学习,还需要多看看官方文档, ...

  7. Three.js加载.obj和.mtl文件(无法加载材质、路径错误问题)

    加载.obj模型文件 本文是Three.js电子书的14.3节 使用三维软件导出.obj模型文件的时候,会同时导出一个材质文件.mtl, .obj和.stl文件包含的信息一样都是几何体顶点相关数据,材 ...

  8. 超图桌面版加载obj 3D模型 - 2

    在 https://blog.csdn.net/bcbobo21cn/article/details/109041525 里,加载obj格式模型没有出来效果: 下面来看一下其他方法:当前用的版本是10 ...

  9. Java3D加载obj文件+mtl文件

    Java3d入门学习可以参考这位博主大神--苏若年,关于Java3D学习的文章.下面给出他部分文章的链接: 文1 创建三维几何模型:[ http://www.cnblogs.com/dennisit/ ...

  10. Three.js加载.stl格式模型

    .stl格式模型加载 本文是Three.js电子书的14.2节 基本所有的三维软件都支持导出.stl格式的三维模型文件,.stl格式的三维模型不包含材质Material信息,只包含几何体顶点数据的信息 ...

最新文章

  1. ont维修使能工具_上海OTC机器人维修保养以及调试服务了解
  2. Java 8 - Optional全解
  3. Sublime 格式化 JSON
  4. 使用Dom4j对XML文档创建与解析
  5. Java类获取Spring容器的bean
  6. MSRCR(Multi-Scale Retinex with Color Restore)
  7. 区块链开发入门如何选择编程语言?
  8. CF 1260 D 题解
  9. python发送文件_利用python传送文件
  10. 中国大学MOOC-陈越、何钦铭-数据结构-习题解答-02 线性结构
  11. ABB机器人——设置定时检测机器人状态
  12. Kotlin中对象检查判断
  13. 论一个程序员的编程修养(你品,你细品)
  14. 上海工程技术大学c语言试卷,上海工程技术大学2009_2010C语言试卷A.doc
  15. Python matplotlib绘图如何显示中文的问题【有报错没有解决】
  16. 计算机网络日志保存时间,在网络安全等级保护制度中,网络运营者应当保留网络日志不少于( )...
  17. VCC、VDD、VSS的区别
  18. DVB-S相关知识第二章-卫星接收锁频参数介绍
  19. Android音视频系列(八):了解音频格式WAV以及与PCM的转换
  20. golang泛型介绍

热门文章

  1. 北京大学深圳研究生院计算机应用技术,北京大学计算机应用技术考研经验-北大深圳研究生院考研辅导班...
  2. 可不可以拿树莓派学python_【如何利用树莓派学习Linux及Python?】-看准网
  3. cactiez服务器的系统日志,cactiEZ syslog无数据
  4. 2021年国内好用的可视化工具
  5. WMS仓储条码管理系统解决方案
  6. 实战PyQt5: 137-QChart图表之散点图
  7. 中国行政区域(县区级带坐标经纬度)
  8. 公司财务记账软件免费版下载地址
  9. 如何将几个pdf合并成一个pdf?
  10. Python实现Excel随机抽取数