Message 1 of 1
Link Unlink blend, matrix
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
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.
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()