2015-09-23 6 views
0

У меня есть обходное решение для подключения прозрачности Metrial к панели ключевых кадров в Maya. Я создаю новый материал «s» для ключевого кадра, полученного на ключевой кадр 10, установите прозрачность на 0 и снова нажмите «s».Подключить прозрачность к анимации ключевого кадра Maya MelPython

Таким образом, вы можете угаснуть прозрачность между 1 и 10 ключевыми кадрами.

Я хочу записать это в python, и я понятия не имею, как это сделать.

ответ

0

вот что я сделал. Я тестировал его с базовыми материалами майя, но он должен работать для любого материала, у которого есть атрибут transparency (обратите внимание, что он не будет работать для поверхностных шейдеров, поскольку атрибут прозрачности называется outTransparency, но вы можете исправить его, изменив функцию, чтобы вы также может передать ему имя атрибута).

Я получил функцию getShaderFrom (obj) в this topic и только что преобразовал ее в Python (она находится в MEL).

Я сделал это как можно более простым и подробным, но его можно было бы оптимизировать. В любом случае, надеюсь, это ответит на ваш вопрос!

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) 
0

Это то, что я и сделал.

import maya.cmds as cmds 

######### Delete all existing Shader ############## 
cmds.delete (cmds.ls(type='shadingDependNode')) 
cmds.delete (cmds.ls(type='shadingEngine')) 
######### Delete all existing Shader ############## 

######### Delete all Keyframes between 0 and 20 ############## 
cmds.setKeyframe('lambert1', t='1', at='transparency' ) 
cmds.cutKey (t=(0,20)) 
######### Delete all Keyframes ############## 

#create Blau shader 
Blau = cmds.shadingNode('phong', asShader=True, n='Blau',) 
cmds.setAttr(Blau + '.color', 0.163,0.284,0.5) 


#create KeyFrame Transparency ###Blau#### 
cmds.setKeyframe('Blau', t='1', at='transparency' ) 
cmds.setAttr ('Blau.transparency', 1,1,1, type = "double3") 
cmds.setKeyframe('Blau', t='15', at='transparency') 

######### update Time to 2 and back to 0 ############## 
cmds.currentTime (2, update=True) 
cmds.currentTime (0, update=True) 
######### update Time to 2 and back to 0 ############## 

setKeyFrame для lambert1 линии просто, чтобы скрипт работает, если ключ не существует раньше.

Я настраиваю текущее время, потому что ваш материал отображается прозрачным, если вы примените его в первый раз.

PS: Blau is Blue на немецком языке