• Maya script 根据 face id 获得 material list


    Maya script 根据 face id 获得 material list

    UE4导入FBX,对于单个物体来说,材质槽的顺序是根据面id来排材质的(多个物体合并可能是另外一种方式)

    # -*- coding: utf-8 -*-
    import maya.mel as mel
    import maya.cmds as cmds
    
    import re
    
    def getMeshShadingEngines(obj):
        meshList = []
        shadeEngs = []
        if cmds.objectType(obj) == 'mesh':
            meshList.append(obj)
        else:
            meshList = cmds.listRelatives(obj, shapes= 1)
        if meshList:
            shadeEngs = cmds.listConnections(meshList, type = "shadingEngine")    
        return shadeEngs
    
    def getShadingEngineSurfaceShader(shadeEngs):
        connections = cmds.listConnections(shadeEngs, c = 1)        
        materials = [connections[i + 1] for i in range(0, len(connections), 2) if '.surfaceShader' in connections[i]]  
        return materials
    
    def getMeshMaterials(obj):
        #materials = []
        shadeEngs = getMeshShadingEngines(obj)  
        materials = getShadingEngineSurfaceShader(shadeEngs)
        materials = cmds.ls(materials, materials = True)
        
        if materials:
            materials = list(set(materials))
        else:
            materials = []
        return materials
    
    def getMaterialColorTexturePath(mat):
        textureFile = ''
        try:
            fileNode = cmds.listConnections('%s.color' % (mat), type='file')
            textureFile = cmds.getAttr("%s.fileTextureName" % fileNode[0])
        except:
            pass
        return textureFile
    
    def getFacesByMaterial(obj, mat):
        sels_pre = cmds.ls(sl = 1)
        cmds.hyperShade(objects = mat)
        objs = cmds.ls(sl = True)
        objs = [o for o in objs if obj in o]
        cmds.select(sels_pre, r = True)
        return objs
    
    def getObjectMaterialsByFaceId(obj):
        shadeEngs = getMeshShadingEngines(obj)
        shadeEngs = list(set(shadeEngs))
        len(shadeEngs)
        mat_list = []
        if len(shadeEngs) > 1:
            mat_list = [[min([int(re.search('%s.f[(.*)]' % obj, m).group(1).split(':')[0]) for m in cmds.sets(sg, q = 1) if re.search('%s.f[(.*)]' % obj, m)]), sg] for sg in shadeEngs]
            mat_list.sort( key = lambda x: x[0])
            mat_list = [item[1] for item in mat_list]
            mat_list = [getShadingEngineSurfaceShader(sg)[0] for sg in mat_list]
        elif len(shadeEngs) == 1:
            mat_list.append(getShadingEngineSurfaceShader(shadeEngs[0])[0])
        return mat_list
    未经博主允许,禁止直接转载本博客任何内容(可以在文章中添加链接,禁止原文照搬),如需直接原文转载对应文章,请在该文章中留言联系博主,谢谢!!
  • 相关阅读:
    QT+Linux+FFmpeg+C/C++实现RTSP流存储为MP4视频文件
    FFmpeg接收RTSP并将H264保存为MP4
    第一次在此定义 多重定义 multiple definition of
    无法定位程序输入点_ZdaPvj于动态链接库 Qt5Core.dl Qt5Gui.dll上
    QObject::startTimer: QTimer can only be used with threads started with QThread
    ONVIF开发编译时提示stdsoap2.o中multiple definition of 'namespaces'问题的解决
    ONVIF开发(1)生成开发框架
    VUE从入门到放弃(项目全流程)————VUE
    UI库colorui的使用————小程序
    超简单详细的搭建个人网站————静态网站
  • 原文地址:https://www.cnblogs.com/ibingshan/p/14930356.html
Copyright © 2020-2023  润新知