文章目录

  • 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名字一样但是里面数据不一样的情况。代码边学边写-_-。主要参考:

  1. API参考:http://docs.autodesk.com/3DSMAX/16/ENU/MAXScript-Help/
  2. 语法参考:<<3ds MAXScript 脚本语言>>

3ds Max导出OBJ的mtl贴图路径不正确相关推荐

  1. 3ds Max导出带贴图的obj模型

    先找一块大理石地板的贴图 接着在3ds Max中画一个最简单的立方体,要薄一点像地板 点击菜单栏中的渲染,选择精简材质编辑器 在材质编辑器面板里随便点一个球,然后按照下图所示的1和2步骤分别点击漫反射 ...

  2. 第五章:3ds max UV展开和BP贴图绘制(下)

    BodyPaint3D是一款UV 贴图绘制软件,类似于PhotoShop,但是它主要用于3D模型的贴图绘制.Cinema 4D R10 的版本中将其整合成为 Cinema 4D的核心模块.C4D包含建 ...

  3. 第五章:3ds max UV展开和BP贴图绘制(上)

    3ds max中简单的几何体模型是通过"UVW 贴图"修改器来赋予贴图.但是,对于复杂的人物角色模型,则需要"UVW 展开"这个修改器来完成UV贴图的处理.其实 ...

  4. 3DS MAX导出M3G动画

    1.用3D Studio Max或者Maya的插件h3texporter导出的文件格式是.h3t的文件..h3t的文件是一个文本文件,可以用记事本,写字板或者其他的文本编辑工具打开..h3t文件描述了 ...

  5. 3ds max导出fbx模型出现破裂

    自己做的模型在3ds max中模型动作显示正常,导出fbx后模型莫名其妙破裂了,如下图 为此找了好几种方法,都无法解决,最后瞎试 层次面板,仅影响轴,重置轴,再导出fbx格式,就解决了.具体为什么可以 ...

  6. 3ds max - 导出 fbx 后,再导入 到 unity 材质会分开的问题如何解决

    如下图,我们对 "可编辑多边形" 设置了 "多边形:材质 ID",下面是 ID 为 1 的面 下面是 ID 为 2 的面 如果这时候,我们打开材质编辑器(按快捷 ...

  7. 3ds max 2012 VRay 2.0-效果图设计与制作-VRay运动模糊设置

    腾龙视觉设计学院www.tlvi.net目前采用的是网络教学模式,邀请顶尖软件专家.依托权威出版社.携手YY教育频道打造最专业的免费网络课堂,让没有时间到实体学校学习的朋友们能够利用闲在的时间在网络上 ...

  8. 3ds max 2012 VRay 2.0-效果图设计与制作-VRay景深模糊设置

    腾龙视觉设计学院www.tlvi.net目前采用的是网络教学模式,邀请顶尖软件专家.依托权威出版社.携手YY教育频道打造最专业的免费网络课堂,让没有时间到实体学校学习的朋友们能够利用闲在的时间在网络上 ...

  9. 3ds max sdk导出插件编写的心得

    3ds max sdk导出插件编写的心得 作者:yhchinabest 来自:CG先生-3D图形插件开发网http://www.cgsir.com 写在前面 为什么要写这个心得?去年11月份的时候我写 ...

最新文章

  1. java.lang.IllegalStateException Unable to find a @SpringBootConfiguration错误解决方案(亲测)
  2. 【转】WebApi中的C#await / async,重点是什么?
  3. 长寿的十个秘诀 至少选择一个坚持实施
  4. crontab 日志_Nginx日志切割并计划任务自动上传到FTP服务器
  5. 苹果折叠iPhone终于有动作了!已送样至富士康,售价将超万元
  6. 华为全球分析师大会:HMS Core全球开发者应用集成的数量加速增长,打造全场景智慧体验...
  7. thymeleaf点击onclick事件
  8. 最大流模板(Edmonds-Karp)
  9. Python 多线程基本步骤
  10. 设置页数自增页眉/页脚——Word中page域代码的使用
  11. Android 判断是否有外网连接
  12. 苹果 2019 卖什么?新 iPhone 值不值得买?
  13. python分布式 集群_python分布式框架rq的使用
  14. 最新版本webrtc源代码在windows上的编译方法
  15. Go实战--Gorilla web toolkit使用之gorilla/sessions(iris+sessions)
  16. 宇视NVR如何使用RTSP协议添加相机
  17. DxOMARK如何测试音频质量?小编带你答疑解惑
  18. 关于VS2013/VS2019使用scanf函数等报错的解决方案
  19. python语言案例教程单元测试答案_Python单元测试框架(附例子)
  20. 联邦学习算法SCAFFOLD的PyTorch实现

热门文章

  1. win10 一键卸载自带应用
  2. 全球及中国标签印刷行业十四五发展形势与需求规模预测报告2022版
  3. Stp-(生成树协议)是用来避免链路环路产生的广播风暴
  4. AJAX都有哪些优点和缺点
  5. Source Insight 4.0 代码自动排版 2019
  6. 中国292座城市政商关系排行榜(2020)
  7. java拼图游戏设计文档_基于JAVA的拼图游戏的设计与实现(含录像)
  8. Android 通过图片资源名字获得图片资源设置在ImageView上
  9. 【重要】条形码原理39码和EAN-13码
  10. npm internal/modules/cjs/loader.js:883 throw err; ^ Error: Cannot find module ‘code-point-at‘ Requir