<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Link Unlink blend, matrix in Maya Programming Forum</title>
    <link>https://forums.autodesk.com/t5/maya-programming-forum/link-unlink-blend-matrix/m-p/13151263#M143</link>
    <description>&lt;P&gt;I am trying to make a link unlink with matrix and I find a detail, is that if I &lt;STRONG&gt;play the animation forward it works perfect&lt;/STRONG&gt;, instead if I&lt;STRONG&gt; play the animation backwards the object starts to have inconsistencies visually&lt;/STRONG&gt;, if I generate a playblast it looks perfect.&lt;BR /&gt;&lt;BR /&gt;Someone who can tell me what is happening so that forward works correctly and backward if I manipulate the timeline begins to look different.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="toggles.gif" style="width: 999px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/1433974i55A452C6514EC5E4/image-size/large?v=v2&amp;amp;px=999" role="button" title="toggles.gif" alt="toggles.gif" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;LI-CODE lang="python"&gt;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()

&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 14 Nov 2024 20:53:11 GMT</pubDate>
    <dc:creator>dg3duy</dc:creator>
    <dc:date>2024-11-14T20:53:11Z</dc:date>
    <item>
      <title>Link Unlink blend, matrix</title>
      <link>https://forums.autodesk.com/t5/maya-programming-forum/link-unlink-blend-matrix/m-p/13151263#M143</link>
      <description>&lt;P&gt;I am trying to make a link unlink with matrix and I find a detail, is that if I &lt;STRONG&gt;play the animation forward it works perfect&lt;/STRONG&gt;, instead if I&lt;STRONG&gt; play the animation backwards the object starts to have inconsistencies visually&lt;/STRONG&gt;, if I generate a playblast it looks perfect.&lt;BR /&gt;&lt;BR /&gt;Someone who can tell me what is happening so that forward works correctly and backward if I manipulate the timeline begins to look different.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="toggles.gif" style="width: 999px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/1433974i55A452C6514EC5E4/image-size/large?v=v2&amp;amp;px=999" role="button" title="toggles.gif" alt="toggles.gif" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;LI-CODE lang="python"&gt;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()

&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 14 Nov 2024 20:53:11 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/maya-programming-forum/link-unlink-blend-matrix/m-p/13151263#M143</guid>
      <dc:creator>dg3duy</dc:creator>
      <dc:date>2024-11-14T20:53:11Z</dc:date>
    </item>
  </channel>
</rss>

