获取指定着色器的网格的名称

2024-10-01 17:30:14 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用python获取着色器指定给的网格的名称?在

例如,lambert02--gt;AreaA_01_geo,lambert03-->;area_03_geo,lambert04-->;AreaA_04_geo

我试着用

Shader = cmds.ls(type = 'surfaceShader')
for i in Shader:
    con = mc.listConnections('%s.outColor' % i)
    name = cmds.listConnections(Shader, type="mesh")

但我无法从name变量中获取任何内容


Tags: namegt名称网格typeareageo着色器
3条回答

在尝试生成场景中现有着色器的列表以及每个着色器指定给的对象(网格、形状、变换)时,我遇到了相同的问题。在

from pymel.core import *

def getShaders():
    for shEngine in ls(type='shadingEngine'):
        print 'shading engine:', shEngine

        for connection in shEngine.listConnections():
            connectionNodeTypeList = nodeType(connection, i=True)

            if [x for x in connectionNodeTypeList if 'ependNode' in x]:
                # tests for shader nodes. they inherit the 'shadingDependNode' type
                # I am using Arnold renderer. Arnold shading nodes inherit the 'THdependNode' type
                print '\t<shader> ->', connection, '(%s)'% nodeType(connection)

            if 'dagNode' in connectionNodeTypeList:
                # tests for transform, geometry and shape node
                # any transform, mesh, shape, curves, vertices, edges, faces
                # will inherit from the 'dagNode' type
                print '\t<dagNode> ->',connection, '(%s)'% nodeType(connection)
        print ''
getShaders()

这将生成如下所示的打印示例(在测试场景上运行时):

^{pr2}$

从这里可以很容易地找到关联的网格对象,如果您是专门寻找网格的。在

编辑:

在阅读了更多的内容之后,我发现我们可以使用下面的命令来获取已指定着色器的网格对象的列表。在

sets(shadingEngine, q=True)

因此

from pymel.core import *

def getShaders():
    for shEngine in ls(type='shadingEngine'):
        print 'shading engine:', shEngine

        for connection in [x for x in shEngine.listConnections()]:
            myType = nodeType(connection,i=True)
            if ('shadingDependNode' in myType or 'THdependNode' in myType):
                # found a shader, printing it out
                print '\t<shader> ->', connection, '(%s)'% nodeType(connection)

        for connection in sets(shEngine, q=True):
            # prints out the list of members that the shader is assigned to
            print '\t<dagNode> ->',connection, '(%s)'% nodeType(connection)
        print ''
getShaders()

这个最新的方法使我们能够获得网格节点以及着色器节点。在

以下是输出示例:

shading engine: aiHeiyuVarAPantsShaderSG
    <shader> -> aiHeiyuVarAPantsShader (aiStandard)
    <dagNode> -> C_heiYuA_Mesh_lod200_v007:pants_geoShape (mesh)

shading engine: aiHeiyuVarASkinShaderMapSG
    <shader> -> aiHeiyuVarASkinShaderMap (aiStandard)
    <dagNode> -> C_heiYuA_Mesh_lod200_v007:body_geoShape (mesh)

shading engine: aiTopShaderSG
    <shader> -> aiHeiyuVarATopShader (aiStandard)
    <dagNode> -> C_heiYuA_Mesh_lod200_v007:top_geoShape (mesh)

shading engine: initialParticleSE
    <shader> -> lambert1 (lambert)
    <shader> -> particleCloud1 (particleCloud)

shading engine: initialShadingGroup
    <shader> -> lambert1 (lambert)
    <dagNode> -> C_heiYuA_Mesh_lod200_v007:upperTeeths_geoShape (mesh)
    <dagNode> -> C_heiYuA_Mesh_lod200_v007:lowerTeeths_geoShape (mesh)
    <dagNode> -> C_heiYuA_Mesh_lod200_v007:gums_geoShape (mesh)
    <dagNode> -> C_heiYuA_Mesh_lod200_v007:L_nail_geoShape (mesh)
    <dagNode> -> C_heiYuA_Mesh_lod200_v007:R_nail_geoShape (mesh)

在发布了我之前的答案后,我在玛雅偶然发现了一个意想不到的行为。在

我发现,当我尝试从“Hypershade”窗口中选择一个shadingEngine节点(着色组节点)时,会在“属性编辑器”(attribute editor)中获得着色引擎属性,如下所示: Shading Group Node selected in Hypershade Window

现在,如果单击“属性编辑器”(Attribute Editor)底部的“选择”(Select)按钮实际尝试并选择该着色器引擎节点,则会得到以下结果: Selecting the Shading Group Node with code and inside Attribute Editor selects the assigned meshes!

实际上,Maya继续为我们选择了指定的网格对象。在

所以我试着用这一行代码做同样的事情:

select('aiHeiyuVarABelts2Shader', replace=True)

实际上,Maya继续并选择了着色器指定给的那些完全相同的网格节点。在

这正是我之前答案中的测试场景。在我之前的代码中,listConnections()返回连接到shadingenengine节点的变换节点列表,使用上面的两种新方法选择shadingenengine节点,Maya实际上为我们选择了网格对象。在

因此,利用这种看似不一致的行为,我可以修改我的代码,以明确地得到你所要求的网格的列表。在

for shEngine in ls(type='shadingEngine'):
    select(shEngine, replace=True)
    print 'shading engine:', shEngine

    for connection in ls(sl=True):
        print '->', connection, '(%s)' % nodeType(connection)

    print ''

在我上一次回复中的同一个示例场景中运行此程序,我得到:

^{pr2}$

现在代码变短了,所有选定的对象都是单独的网格对象。在

若要获取连接到shadingene节点的着色器节点/曲面材质,可以使用:

listConnections(shadingEngineNode, type=['shadingDependNode', 'THdependNode'])

就我个人而言,我倾向于远离这种方法,因为我觉得它并不优雅,必须依赖select(),然后是ls(sl=True)函数来检索选定的对象。在

我是偏执狂吗?使用这种方法,我也会感到不安全,总是担心Maya是否会在将来的版本中继续支持这种行为。在

我刚刚在玛雅2014年和玛雅2016年测试过这个。代码在两个版本中的工作方式完全相同。在

底线是,它起作用了。如果您愿意,请随时使用它:)

编辑: 在进行了更多的挖掘和搜索之后,我意识到shadingEngine是objectSet的一个子类。当我们处理集合(选择集、渲染集、灯光链接集、变形器成员身份集等)时,这种“意外行为”实际上是一种标准的Maya行为。在

因此,我们可以直接使用sets(setName, q=True)来查询集合成员。与上面提到的依赖于select()命令,然后查询选择以获取集合成员的方法相比,这种方法更加合理、优雅和快速。在

下面是最后一段代码:

from pymel.core import *

for shEngine in ls(type='shadingEngine'):
    print 'shading engine:', shEngine
    for connection in sets(shEngine,q=True):
        print '\t->', connection, '(%s)' % nodeType(connection)
    print ''

着色器连接到一个或多个包含指定的着色集。所以这不是一个1:1的任务,而是一对多,然后又是一对多(当然你不经常看到)。请注意,当您只需要一个名称空间时,您使用2个名称空间。在

import maya.cmds as mc

Shader = mc.ls(type = 'surfaceShader')
for i in Shader:
    con = mc.listConnections('%s.outColor' % i)
    names = mc.listConnections(con, type="mesh")
    print i, "->", ", ".join(names)

相关问题 更多 >

    热门问题