То, что происходит, заключается в том, что когда вы используете центральный шарнир, вместо того, чтобы воздействовать на значения перевода объекта, он вместо этого компенсирует его своими шарнирами (локальный атрибут поворота поворота).Таким образом, даже если все ваши переводы равны нулю, значения из опорных точек приводят к тому, что ваш объект смещен от источника мира.
Хотя это имеет смысл, зная вышесказанное, все равно довольно раздражает то, как Maya справляется с этим.
Вот скрипт, который попытается это исправить.По сути, он берет свои сводные значения, обнуляет их и добавляет к переводу:
Майя 2018
import maya.cmds as cmds
sel = cmds.ls(sl=True)[0] # Get selection.
cmds.xform(sel, cpc=True) # Center its pivot. Comment this out if you don't want to force it to center and use the pivot as-is.
pivots = cmds.xform(sel, q=True, piv=True)[:3] # Get its pivot values.
temp_nul = cmds.createNode("transform") # Create a temporary transform.
cmds.matchTransform(temp_nul, sel) # Align the transform to our object.
try:
cmds.xform(sel, piv=[0, 0, 0]) # Zero-out object's pivot values.
cmds.move(-pivots[0], -pivots[1], -pivots[2], "{}.vtx[*]".format(sel), os=True, r=True) # Negate and move object via its old pivot values.
cmds.matchTransform(sel, temp_nul) # Align the object back to the temporary transform, to maintain its old position.
finally:
cmds.delete(temp_nul) # Delete temporary transform.
cmds.select(sel) # Restore old selection.
Майя 2016 и<</strong>
import maya.cmds as cmds
import maya.mel as mel
sel = cmds.ls(sl=True)[0] # Get selection.
mel.eval("CenterPivot;") # Center its pivot. Comment this out if you don't want to force it to center and use the pivot as-is.
pivots = cmds.xform(sel, q=True, piv=True)[:3] # Get its pivot values.
old_tm = cmds.xform(sel, q=True, ws=True, m=True) # Get its transform matrix.
temp_nul = cmds.createNode("transform") # Create a temporary transform.
cmds.xform(temp_nul, ws=True, m=old_tm) # Align it to the matrix.
cmds.xform(temp_nul, os=True, r=True, t=pivots) # Move it to include the pivot offsets.
new_tm = cmds.xform(temp_nul, q=True, ws=True, m=True) # Store it's transform matrix to align to later.
try:
cmds.xform(sel, piv=[0, 0, 0]) # Zero-out object's pivot values.
cmds.move(-pivots[0], -pivots[1], -pivots[2], "{}.vtx[*]".format(sel), os=True, r=True) # Negate and move object via its old pivot values.
cmds.xform(sel, ws=True, m=new_tm) # Align the object back to the temporary transform, to maintain its old position.
finally:
cmds.delete(temp_nul) # Delete temporary transform.
cmds.select(sel) # Restore old selection.
Выберите ваш объект, затем запустите скрипт для его запуска.Я проверил его на комбинированном объекте со случайным вращением, в то время как меня связали с объектом со случайным вращением.Кажется, что все работает нормально, без всплывающих окон.
Вы также можете добиться того же эффекта с помощью комбинации узлов, использующих узел polyMoveVertex
вместо сценариев.