3ds Max导出OBJ的mtl贴图路径不正确 您所在的位置:网站首页 3dmax导出obj没有光源 3ds Max导出OBJ的mtl贴图路径不正确

3ds Max导出OBJ的mtl贴图路径不正确

2024-07-04 18:36| 来源: 网络整理| 查看: 265

文章目录 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 key1 append values value1 true ) else ( print ("key has already been added! -->" + key1) false ) ), fn Clear = ( keys = #() values = #() true ), fn Remove key = ( index = findItem keys key if index != 0 then ( deleteItem keys index deleteItem values index true ) else ( print ("cann't find the key! -->" + key) false ) ), fn GetItem key = ( index = findItem keys key if 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 key if 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 = 1000 fn processStandardMaterial mat = ( if (mat.diffusemap != undefined) then ( diffmap = mat.diffusemap mapname = diffmap.name if (diffmap.fileName != undefined) then ( filepath = diffmap.fileName as string if (texturePathToMapNameDict.ContainsKey filepath) then ( dm = texturePathToMapNameDict.getItem filepath --print ("change " + mat.diffusemap.name + " to " + (texturePathToMapNameDict.getItem filepath).name) mat.diffusemap = copy dm updateMTLInMedit mat.diffusemap ) else ( newMapName = "Map_#" + (mapCount as string) mapCount = mapCount + 1 newDiffuse = mat.diffusemap newDiffuse.name = newMapName --newDiffuse.reload() mat.diffusemap = copy newDiffuse texturePathToMapNameDict.add filepath newDiffuse ) ) ) ) fn processMultimaterial mat = ( materialList = mat.materialList for 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 = 1 fn processRenameStandardMaterial mat = ( --print ("process std" + mat.name) if (standardMaterialDic.ContainsKey mat.name) then ( diffusemap = standardMaterialDic.getItem mat.name if ((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 + 1 standardMaterialDic.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.materialList for 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/语法参考:


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有