<p>在尝试生成场景中现有着色器的列表以及每个着色器指定给的对象(网格、形状、变换)时,我遇到了相同的问题。在</p>
<pre><code>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()
</code></pre>
<p>这将生成如下所示的打印示例(在测试场景上运行时):</p>
^{pr2}$
<p>从这里可以很容易地找到关联的网格对象,如果您是专门寻找网格的。在</p>
<p><strong>编辑:</strong></p>
<p>在阅读了更多的内容之后,我发现我们可以使用下面的命令来获取已指定着色器的网格对象的列表。在</p>
<p><code>sets(shadingEngine, q=True)</code></p>
<p>因此</p>
<pre><code>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()
</code></pre>
<p>这个最新的方法使我们能够获得网格节点以及着色器节点。在</p>
<p>以下是输出示例:</p>
<pre><code>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)
</code></pre>