3ds Max导出OBJ的mtl贴图路径不正确
文章目录
- 3DSMax导出的材质mtl文件漫反射贴图路径不正确
之前流程是写了一个3DSMAX插件把游戏的场景直接导出为自己定义的格式的文件,包含了顶点数据,三角形数据,贴图数据等。现在把插件从3DMAX上分离出来,先通过3DMAX导出OBJ,然后再把OBJ导出为自定义的格式。
3DSMax导出的材质mtl文件漫反射贴图路径不正确
一开始以为是一个Standardmaterial对应漫反射的Map名字一样但是贴图路径不一样导致了OBJ导出出错。写了一个把同一个Map但是对应不同的贴图路径的Map自动重命名的MaxScript脚本,导出发现结果是一样的。
一个Multimaterial下的Standardmaterial和一个Standardmaterial名字一样,但是这二个Standardmaterial的diffusemap的文件路径不一样。从而导致了OBJ导出出错。
自动转换的代码如下:
--My Dictionary
struct dict
(public keys = #(),public values = #(),--methods:fn Count = (if keys.count == values.count then(keys.count as integer)else(print "Error: keys.count != values.count"0)),fn Add key1 value1 = (if findItem keys key1 == 0 then(append keys key1append values value1true)else(print ("key has already been added! -->" + key1)false)),fn Clear = (keys = #()values = #()true),fn Remove key = (index = findItem keys keyif index != 0 then(deleteItem keys indexdeleteItem values indextrue)else(print ("cann't find the key! -->" + key)false)),fn GetItem key = (index = findItem keys keyif index != 0 then(if keys.count == values.count then(values[index])else(print "Error: keys.count != values.count"undefined))else(print ("cann't find the key! -->" + key)undefined)),fn ContainsKey key = (index = findItem keys keyif index != 0 then(true)else(false))
) struct mtlData
(public mapName = "",public relalMap
)
openLog "D:\Users\Administrator\Desktop\3DMAX_OBJ\my_log.txt" mode:"a" outputOnly:true
texturePathToMapNameDict = dict()
mapCount = 1000fn processStandardMaterial mat =
(if (mat.diffusemap != undefined) then(diffmap = mat.diffusemapmapname = diffmap.nameif (diffmap.fileName != undefined) then(filepath = diffmap.fileName as stringif (texturePathToMapNameDict.ContainsKey filepath) then(dm = texturePathToMapNameDict.getItem filepath--print ("change " + mat.diffusemap.name + " to " + (texturePathToMapNameDict.getItem filepath).name)mat.diffusemap = copy dmupdateMTLInMedit mat.diffusemap)else(newMapName = "Map_#" + (mapCount as string)mapCount = mapCount + 1newDiffuse = mat.diffusemapnewDiffuse.name = newMapName--newDiffuse.reload()mat.diffusemap = copy newDiffusetexturePathToMapNameDict.add filepath newDiffuse )))
)fn processMultimaterial mat =
(materialList = mat.materialListfor mm in materialList do(if classof mm == Standardmaterial then(processStandardMaterial mm)else if classof mm == Multimaterial then(processMultimaterial mm))
)
--meditMaterials
--SceneMaterials
for mat in SceneMaterials do
(if classof mat == Standardmaterial then(processStandardMaterial mat)else if classof mat == Multimaterial then(processMultimaterial mat)
)standardMaterialDic = dict()
matNameCount = 1fn processRenameStandardMaterial mat =
(--print ("process std" + mat.name)if (standardMaterialDic.ContainsKey mat.name) then(diffusemap = standardMaterialDic.getItem mat.nameif ((diffusemap == undefined and mat.diffusemap == undefined) or (diffusemap != undefined and mat.diffusemap != undefined and diffusemap.name == mat.diffusemap.name)) then(--print ("same" + diffusemap.name))else(print ("change " + mat.name + " to " + (mat.name + "_" + matNameCount as string))mat.name = (mat.name + "_" + matNameCount as string)matNameCount = matNameCount + 1standardMaterialDic.add mat.name mat.diffusemap) )else(--print ("change " + mat.name)standardMaterialDic.add mat.name mat.diffusemap)
)fn processRenameMultimaterial mat =
(--print ("process mul" + mat.name)materialList = mat.materialListfor mm in materialList do(if classof mm == Standardmaterial then(processRenameStandardMaterial mm)else if classof mm == Multimaterial then(processRenameMultimaterial mm))
)for mat in SceneMaterials do
(if classof mat == Standardmaterial then(processRenameStandardMaterial mat)else if classof mat == Multimaterial then(processRenameMultimaterial mat)
)print ("转换完成!!!")
closeLog()
dict字典代码来自博客
代码很简单,就是先把map同名但是贴图路径不一致名字自动修改map名字,然后Standardmaterial名字一样但是map名字不一致自动修Standardmaterial名字,不考虑Multimaterial名字一样但是里面数据不一样的情况。代码边学边写-_-。主要参考:
- API参考:http://docs.autodesk.com/3DSMAX/16/ENU/MAXScript-Help/
- 语法参考:<<3ds MAXScript 脚本语言>>
3ds Max导出OBJ的mtl贴图路径不正确相关推荐
- 3ds Max导出带贴图的obj模型
先找一块大理石地板的贴图 接着在3ds Max中画一个最简单的立方体,要薄一点像地板 点击菜单栏中的渲染,选择精简材质编辑器 在材质编辑器面板里随便点一个球,然后按照下图所示的1和2步骤分别点击漫反射 ...
- 第五章:3ds max UV展开和BP贴图绘制(下)
BodyPaint3D是一款UV 贴图绘制软件,类似于PhotoShop,但是它主要用于3D模型的贴图绘制.Cinema 4D R10 的版本中将其整合成为 Cinema 4D的核心模块.C4D包含建 ...
- 第五章:3ds max UV展开和BP贴图绘制(上)
3ds max中简单的几何体模型是通过"UVW 贴图"修改器来赋予贴图.但是,对于复杂的人物角色模型,则需要"UVW 展开"这个修改器来完成UV贴图的处理.其实 ...
- 3DS MAX导出M3G动画
1.用3D Studio Max或者Maya的插件h3texporter导出的文件格式是.h3t的文件..h3t的文件是一个文本文件,可以用记事本,写字板或者其他的文本编辑工具打开..h3t文件描述了 ...
- 3ds max导出fbx模型出现破裂
自己做的模型在3ds max中模型动作显示正常,导出fbx后模型莫名其妙破裂了,如下图 为此找了好几种方法,都无法解决,最后瞎试 层次面板,仅影响轴,重置轴,再导出fbx格式,就解决了.具体为什么可以 ...
- 3ds max - 导出 fbx 后,再导入 到 unity 材质会分开的问题如何解决
如下图,我们对 "可编辑多边形" 设置了 "多边形:材质 ID",下面是 ID 为 1 的面 下面是 ID 为 2 的面 如果这时候,我们打开材质编辑器(按快捷 ...
- 3ds max 2012 VRay 2.0-效果图设计与制作-VRay运动模糊设置
腾龙视觉设计学院www.tlvi.net目前采用的是网络教学模式,邀请顶尖软件专家.依托权威出版社.携手YY教育频道打造最专业的免费网络课堂,让没有时间到实体学校学习的朋友们能够利用闲在的时间在网络上 ...
- 3ds max 2012 VRay 2.0-效果图设计与制作-VRay景深模糊设置
腾龙视觉设计学院www.tlvi.net目前采用的是网络教学模式,邀请顶尖软件专家.依托权威出版社.携手YY教育频道打造最专业的免费网络课堂,让没有时间到实体学校学习的朋友们能够利用闲在的时间在网络上 ...
- 3ds max sdk导出插件编写的心得
3ds max sdk导出插件编写的心得 作者:yhchinabest 来自:CG先生-3D图形插件开发网http://www.cgsir.com 写在前面 为什么要写这个心得?去年11月份的时候我写 ...
最新文章
- java.lang.IllegalStateException Unable to find a @SpringBootConfiguration错误解决方案(亲测)
- 【转】WebApi中的C#await / async,重点是什么?
- 长寿的十个秘诀 至少选择一个坚持实施
- crontab 日志_Nginx日志切割并计划任务自动上传到FTP服务器
- 苹果折叠iPhone终于有动作了!已送样至富士康,售价将超万元
- 华为全球分析师大会:HMS Core全球开发者应用集成的数量加速增长,打造全场景智慧体验...
- thymeleaf点击onclick事件
- 最大流模板(Edmonds-Karp)
- Python 多线程基本步骤
- 设置页数自增页眉/页脚——Word中page域代码的使用
- Android 判断是否有外网连接
- 苹果 2019 卖什么?新 iPhone 值不值得买?
- python分布式 集群_python分布式框架rq的使用
- 最新版本webrtc源代码在windows上的编译方法
- Go实战--Gorilla web toolkit使用之gorilla/sessions(iris+sessions)
- 宇视NVR如何使用RTSP协议添加相机
- DxOMARK如何测试音频质量?小编带你答疑解惑
- 关于VS2013/VS2019使用scanf函数等报错的解决方案
- python语言案例教程单元测试答案_Python单元测试框架(附例子)
- 联邦学习算法SCAFFOLD的PyTorch实现
热门文章
- win10 一键卸载自带应用
- 全球及中国标签印刷行业十四五发展形势与需求规模预测报告2022版
- Stp-(生成树协议)是用来避免链路环路产生的广播风暴
- AJAX都有哪些优点和缺点
- Source Insight 4.0 代码自动排版 2019
- 中国292座城市政商关系排行榜(2020)
- java拼图游戏设计文档_基于JAVA的拼图游戏的设计与实现(含录像)
- Android 通过图片资源名字获得图片资源设置在ImageView上
- 【重要】条形码原理39码和EAN-13码
- npm internal/modules/cjs/loader.js:883 throw err; ^ Error: Cannot find module ‘code-point-at‘ Requir