<p>这是我做的。我用基本的Maya材质测试了它,但它应该适用于任何具有<code>transparency</code>属性的材质(请注意,它不适用于曲面着色器,因为透明度属性称为<code>outTransparency</code>,但可以通过更改函数来修复它,以便也可以将属性名称传递给它)。在</p>
<p>我在<a href="http://forums.cgsociety.org/showthread.php?t=842021" rel="nofollow">this topic</a>中得到了<code>getShaderFrom (obj)</code>函数,并在Python中转换了它(在MEL中)。在</p>
<p>我使它尽可能的简单和详细,但它可能是可以优化的。不管怎样,希望这能回答你的问题!在</p>
<pre><code>from maya import cmds
def getShaderFrom (obj):
'''
List all materials for the given object
'''
# List the shapes of the given object
shapes = cmds.ls (obj, objectsOnly = 1, dagObjects = 1, shapes = 1)
# List the shading engines connected to the shapes
shadingEngines = cmds.listConnections (shapes, type = "shadingEngine")
# List the materails connected to the shading engines
rawMaterials = cmds.ls ((cmds.listConnections (shadingEngines)), materials = 1)
# Remove duplicated occurences of materials
materials = []
for mat in rawMaterials:
if mat not in materials:
materials.append(mat)
return materials
def keyTransparency (startFrame, endFrame, material):
'''
Will key the transparency of
a given materials between
selected frames
'''
# Set transparency value at 1
cmds.setAttr (material + ".transparency", 1,1,1, type = "double3")
# Add a keyframe at last frame
cmds.setKeyframe (material, attribute = "transparency", time = endFrame, inTangentType = "linear", outTangentType = "linear")
# Add a keyframe at first frame
cmds.setKeyframe (material, attribute = "transparency", time = startFrame, inTangentType = "linear", outTangentType = "linear")
# Set transparency value at 0
cmds.setAttr (material + ".transparency", 0,0,0, type = "double3")
def doKeyTransparencyForMaterials (startTime, endTime):
'''
Main function
Call functions: 'getShaderFrom', 'keyTransparency'
'''
if ((not isinstance(startTime, int)) or (not isinstance(endTime, int))):
cmds.error ("You must provide start and end frame numbers (int).")
# List selected objects
selection = cmds.ls (selection = 1)
if len(selection) == 0:
cmds.error ("Nothing is selected.")
# List all materials
for obj in selection:
materials = getShaderFrom (obj)
# Key transparency
for mat in materials:
keyTransparency (startTime, endTime, mat)
print "Transparency has been successfully keyed for: " + (", ".join(materials)) + "\n",
doKeyTransparencyForMaterials (1, 10)
</code></pre>