Python+OpenGL绘制3D模型(七)制作3dsmax导出插件 📅 发布时间:2026/9/18 14:30:04 👁 浏览次数: 系列文章基础PythonOpenGL绘制3D模型一Python 和 PyQt环境搭建PythonOpenGL绘制3D模型二程序框架PyQt5PythonOpenGL绘制3D模型三程序框架PyQt6PythonOpenGL绘制3D模型四绘制线段PythonOpenGL绘制3D模型五绘制三角型PythonOpenGL绘制3D模型六材质文件载入和贴图映射PythonOpenGL绘制3D模型七制作3dsmax导出插件PythonOpenGL 杂谈一高级用 DeepDraw 几何引擎开发建筑设计软件一SketchUp 替代用 DeepDraw 几何引擎开发建筑设计软件二下载DeepDraw用 DeepDraw 几何引擎开发建筑设计软件三用代码绘制线段用 DeepDraw 几何引擎开发建筑设计软件四用代码绘制面用 DeepDraw 几何引擎开发建筑设计软件五创建选择工具用 DeepDraw 几何引擎开发建筑设计软件六读取模型文件用 DeepDraw 几何引擎开发建筑设计软件七InputPoint输入捕获器用 DeepDraw 几何引擎开发建筑设计软件八画线工具未完待续…前言Sketchup作为目前设计院最为流行的设计软件(非工程制图软件深受设计师的喜爱软件小巧而功能强大有不少为之开发的插件应运而生不过呢关于底层数据结构和工作原理相关的文章少之又少本文意在填补一下这方面的空缺。文章目录系列文章前言一、介绍二、使用方法三、插件源代码系列文章预告一、介绍3dsmax支持python2.7所以同样可以用python编写插件不需要编译安装一键执行非常方便编写插件是个比较复杂的过程涉及3dsmax中模型、材质、贴图、等数据的组织结构以后专门用一个专题详细介绍有兴趣的同学可以仔细读一下插件源代码插件和程序需要交换文件数据格式这里定义一个CModel数据保存使用了python内置的pickle也是一键保存在程序里一键载入不需要专门编写读写文件的代码二、使用方法1、下载源代码保存到c:/temp/maxplus_export_sel_model.py2、打开3dsmax菜单 》Scripting 》 MAXScript Listener3、运行 python.ExecuteFile “C:/temp/maxplus_export_sel_model.py”如果看到如下输出说明已经导出成功find INode: Teapot001, 0X0000000048D3CBB0, class:Teapot ---ProcMesh()--- numVertics:530 numFaces:1024 #success模型导出到 “c:/temp/CModel.pickle”注意保证c:/temp存在否则导出失败三、插件源代码maxplus_export_sel_model.pyimportMaxPlusimportpicklefromCModelimportCModel,CMesh,CTriangle,CVector3################################# FILE DESCRIPTION# 文件描述CModelExport# 对应文章PythonOpenGL绘制3D模型七 制作3dsmax导出插件# 作者李航 Lihang# 使用方法# 1、选择要导出的模型# 2、在命令行窗口中输入# python.ExecuteFile C:/_proj/SuViewer/articles/step3/maxplus_export_sel_model.py# 3、把命令行拖入工具栏可以生成快捷方式方便下次使用# 4、测试可使用的版本3dsmax2016# ELSE..################################# 注意: 保证c:/temp目录存在否则无法导出EXPORT_PATH_FILEc:/temp/CModel.pickle############# CModelExport############classCModelExport:def__init__(self):self.list_mats[]############# export# 插件主入口############defexport(self):modelCModel()forn,obj,triObjinself.EnumSeletciontGeometry():print(find %s, class:%s%(n,obj.GetClassName()))meshtriObj.GetMesh()out_meshself.ProcMesh(n,mesh)model.list_mesh.append(out_mesh)withopen(EXPORT_PATH_FILE,wb)ashf:pickle.dump(model,hf,2)############# EnumSeletciontGeometry# 1、遍历选择的物体# 2、生成列表sel_list并返回############defEnumSeletciontGeometry(self):sel_list[]forninMaxPlus.SelectionManager.Nodes:# objectobjn.EvalWorldState().Getobj()ifobj.CanConvertToType(MaxPlus.ClassIds.TriMeshGeometry):triObjobj.ConvertToType(MaxPlus.ClassIds.TriMeshGeometry)item(n,obj,MaxPlus.TriObject._CastFrom(triObj))sel_list.append(item)#print (find %s, class:%s%(n, obj.GetClassName()) )else:print(cant conv triMesh, Type is:%s%obj.GetClassName())returnsel_list############# ProcMesh# 1、处理max中的模型# 2、转成需要的CModel数据############defProcMesh(self,node,mesh):print(---ProcMesh()---)## Color#new_meshCMesh()color1node.GetWireColor()new_mesh.color(color1.GetR(),color1.GetG(),color1.GetB())## Vertices#num_vertsmesh.GetNumVertices()print(numVertics:%d%num_verts)foriinrange(num_verts):pointmesh.GetVertex(i)nvCVector3(point.X,point.Y,point.Z)new_mesh.list_vertices.append(nv)## Triangles#num_facesmesh.GetNumFaces()print(numFaces:%d%num_faces)foriinrange(num_faces):trimesh.GetFace(i)vi1tri.GetVert(0)vi2tri.GetVert(1)vi3tri.GetVert(2)ev1Trueiftri.GetEdgeVis(0)elseFalseev2Trueiftri.GetEdgeVis(1)elseFalseev3Trueiftri.GetEdgeVis(2)elseFalsentCTriangle()nt.a(vi1,0,0)nt.b(vi2,0,0)nt.c(vi3,0,0)normmesh.FaceNormal(i)nt.matIdtri.GetMatID()nt.faceNormalCVector3(norm.X,norm.Y,norm.Z)nt.smGrouptri.GetSmGroup()nt.edgevis(ev1,ev2,ev3)new_mesh.list_tris.append(nt)returnnew_mesh############# Main# 1、创建插件导出对象CModelExport# 2、执行export############modelExportCModelExport()modelExport.export()CModel.pyclassCModel:def__init__(self):self.list_mesh[]classCMesh:def__init__(self):self.nameself.color(0,0,0)self.list_vertices[]self.list_tris[]classCTriangle:def__init__(self):self.a(0,0,0)self.b(0,0,0)self.c(0,0,0)self.faceNormalCVector3(0,0,0)self.matId0self.smGroup0self.edgevis(True,True,True)classCVector3:def__init__(self,x,y,z):self.xx self.yy self.zz系列文章预告目标是开发一个Sketchup Viewer能够显示Sketchup的.skp文件中的3D模型Corona渲染器照片级渲染效果