Link Unlink blend, matrix

Link Unlink blend, matrix

dg3duy
Collaborator Collaborator
481 Views
0 Replies
Message 1 of 1

Link Unlink blend, matrix

dg3duy
Collaborator
Collaborator

I am trying to make a link unlink with matrix and I find a detail, is that if I play the animation forward it works perfect, instead if I play the animation backwards the object starts to have inconsistencies visually, if I generate a playblast it looks perfect.

Someone who can tell me what is happening so that forward works correctly and backward if I manipulate the timeline begins to look different.

 

toggles.gif

import maya.cmds as cmds

def create_ui():
    # Crear una ventana para la UI
    if cmds.window("transitionWindow", exists=True):
        cmds.deleteUI("transitionWindow", window=True)

    # Definir el tamaño de la ventana para que sea más pequeña en el eje X
    window = cmds.window("transitionWindow", title="Link Blend", widthHeight=(250, 200))

    cmds.columnLayout(adjustableColumn=True)

    # Campo de selección para el objeto a animar (renombrado a "Select Object")
    anim_obj_field = cmds.textFieldButtonGrp(buttonLabel="Select Object", bc=lambda: select_object(anim_obj_field), columnAlign=[1, 'left'], width=200)

    # Campo de selección para el objeto de referencia 1 (renombrado a "Link 1")
    link1_field = cmds.textFieldButtonGrp(buttonLabel="Link 1", bc=lambda: select_object(link1_field), columnAlign=[1, 'left'], width=200)

    # Campo de selección para el objeto de referencia 2 (renombrado a "Link 2")
    link2_field = cmds.textFieldButtonGrp(buttonLabel="Link 2", bc=lambda: select_object(link2_field), columnAlign=[1, 'left'], width=200)

    # Botón para aplicar la animación (renombrado a "Apply")
    cmds.button(label="Apply", command=lambda x: apply_transition(anim_obj_field, link1_field, link2_field), width=200)

    cmds.showWindow(window)

def select_object(field):
    # Permite al usuario seleccionar un objeto en la escena
    selected = cmds.ls(selection=True)
    if selected:
        cmds.textFieldButtonGrp(field, edit=True, text=selected[0])

def apply_transition(anim_obj_field, link1_field, link2_field):
    # Obtener los objetos seleccionados desde los campos de texto
    anim_obj = cmds.textFieldButtonGrp(anim_obj_field, query=True, text=True)
    link1 = cmds.textFieldButtonGrp(link1_field, query=True, text=True)
    link2 = cmds.textFieldButtonGrp(link2_field, query=True, text=True)

    # Verificar que todos los campos estén llenos
    if not anim_obj or not link1 or not link2:
        cmds.confirmDialog(title="Error", message="Por favor, seleccione todos los objetos.", button=["OK"])
        return

    # Crear los nodos necesarios
    mult_matrix_link1 = cmds.createNode('multMatrix', name='multMatrixLink1')
    mult_matrix_link2 = cmds.createNode('multMatrix', name='multMatrixLink2')
    blend_translate = cmds.createNode('blendColors', name='blendTranslate')
    blend_rotate = cmds.createNode('blendColors', name='blendRotate')
    blend_scale = cmds.createNode('blendColors', name='blendScale')
    decompose_matrix_link1 = cmds.createNode('decomposeMatrix', name='decomposeMatrixLink1')
    decompose_matrix_link2 = cmds.createNode('decomposeMatrix', name='decomposeMatrixLink2')

    # Conectar las matrices de los objetos a los nodos multMatrix
    cmds.connectAttr(link1 + '.worldMatrix[0]', mult_matrix_link1 + '.matrixIn[0]', force=True)
    cmds.connectAttr(link2 + '.worldMatrix[0]', mult_matrix_link2 + '.matrixIn[0]', force=True)

    # Conectar las salidas de los multMatrix a los decomposeMatrix para separar translate, rotate y scale
    cmds.connectAttr(mult_matrix_link1 + '.matrixSum', decompose_matrix_link1 + '.inputMatrix', force=True)
    cmds.connectAttr(mult_matrix_link2 + '.matrixSum', decompose_matrix_link2 + '.inputMatrix', force=True)

    # Conectar las salidas de decomposeMatrix a los blendColors correspondientes para una mezcla gradual
    cmds.connectAttr(decompose_matrix_link1 + '.outputTranslate', blend_translate + '.color1', force=True)
    cmds.connectAttr(decompose_matrix_link2 + '.outputTranslate', blend_translate + '.color2', force=True)

    cmds.connectAttr(decompose_matrix_link1 + '.outputRotate', blend_rotate + '.color1', force=True)
    cmds.connectAttr(decompose_matrix_link2 + '.outputRotate', blend_rotate + '.color2', force=True)

    cmds.connectAttr(decompose_matrix_link1 + '.outputScale', blend_scale + '.color1', force=True)
    cmds.connectAttr(decompose_matrix_link2 + '.outputScale', blend_scale + '.color2', force=True)

    # Conectar las salidas de blendColors al objeto animado (objeto que se mueve)
    cmds.connectAttr(blend_translate + '.output', anim_obj + '.translate', force=True)
    cmds.connectAttr(blend_rotate + '.output', anim_obj + '.rotate', force=True)
    cmds.connectAttr(blend_scale + '.output', anim_obj + '.scale', force=True)

    # Crear un atributo en el objeto animado para controlar la mezcla (0 a 1)
    cmds.addAttr(anim_obj, longName='ParentBlend', attributeType='double', min=0, max=1, defaultValue=1)
    cmds.setAttr(anim_obj + '.ParentBlend', keyable=True)

    # Conectar el atributo ParentBlend a los nodos blendColors para controlar la mezcla gradual
    cmds.connectAttr(anim_obj + '.ParentBlend', blend_translate + '.blender', force=True)
    cmds.connectAttr(anim_obj + '.ParentBlend', blend_rotate + '.blender', force=True)
    cmds.connectAttr(anim_obj + '.ParentBlend', blend_scale + '.blender', force=True)

    # Animar el atributo ParentBlend para una transición suave de link1 a link2
    cmds.setKeyframe(anim_obj + '.ParentBlend', time=1, value=1)   # Inicio de la animación (link1)
    cmds.setKeyframe(anim_obj + '.ParentBlend', time=20, value=0)  # Fin de la animación (link2)

    cmds.confirmDialog(title="Éxito", message="Perfect!.", button=["OK"])

# Llamar a la función para crear la UI
create_ui()

 

0 Likes
482 Views
0 Replies
Replies (0)