3ds Max导出OBJ的mtl贴图路径不正确
生活随笔
收集整理的這篇文章主要介紹了
3ds Max导出OBJ的mtl贴图路径不正确
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 3DSMax導(dǎo)出的材質(zhì)mtl文件漫反射貼圖路徑不正確
之前流程是寫了一個3DSMAX插件把游戲的場景直接導(dǎo)出為自己定義的格式的文件,包含了頂點數(shù)據(jù),三角形數(shù)據(jù),貼圖數(shù)據(jù)等?,F(xiàn)在把插件從3DMAX上分離出來,先通過3DMAX導(dǎo)出OBJ,然后再把OBJ導(dǎo)出為自定義的格式。
3DSMax導(dǎo)出的材質(zhì)mtl文件漫反射貼圖路徑不正確
一開始以為是一個Standardmaterial對應(yīng)漫反射的Map名字一樣但是貼圖路徑不一樣導(dǎo)致了OBJ導(dǎo)出出錯。寫了一個把同一個Map但是對應(yīng)不同的貼圖路徑的Map自動重命名的MaxScript腳本,導(dǎo)出發(fā)現(xiàn)結(jié)果是一樣的。
一個Multimaterial下的Standardmaterial和一個Standardmaterial名字一樣,但是這二個Standardmaterial的diffusemap的文件路徑不一樣。從而導(dǎo)致了OBJ導(dǎo)出出錯。
自動轉(zhuǎn)換的代碼如下:
--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 ("轉(zhuǎn)換完成!!!") closeLog()dict字典代碼來自博客
代碼很簡單,就是先把map同名但是貼圖路徑不一致名字自動修改map名字,然后Standardmaterial名字一樣但是map名字不一致自動修Standardmaterial名字,不考慮Multimaterial名字一樣但是里面數(shù)據(jù)不一樣的情況。代碼邊學(xué)邊寫-_-。主要參考:
總結(jié)
以上是生活随笔為你收集整理的3ds Max导出OBJ的mtl贴图路径不正确的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。