Maya Python: создать равноудаленную соединительную цепь между локаторами - PullRequest
0 голосов
/ 05 марта 2020

Хорошо, поэтому я делаю автоматический риггер для позвоночника: но есть одна вещь, которую я должен сделать, прежде чем двигаться дальше, мне просто нужно сделать одну вещь: я хочу, чтобы соединительная цепь соответствовала между двумя локаторами, к сожалению, на данный момент эта задача немного выше моего умственного вознаграждения: вот сценарий, если кто-то хочет попробовать его:

    '''
import DS_hybrid_spineOmatic_V1
reload (DS_hybrid_spineOmatic_V1)
DS_hybrid_spineOmatic_V1.gui()
'''

import re
import maya.cmds as cmds
import maya.mel as mel

if cmds.window("spineWin", exists =True):
    cmds.deleteUI("spineWin", window = True)

myWindow = cmds.window("spineWin",t='DS_hybrid_spineOmatic_V1',w=200, h=500, toolbox=True)
column = cmds.columnLayout(adj=True)

'''
To DO:
    -You're going to have a series of scrips splitting into an IKFK spine and a ribon spine: this script will build the IKFK spine
'''

def gui():

    cmds.button( label="Generate Spine Proxy Locators", c = buildProxies)
    cmds.separator( w=200, h=3)
    cmds.button( label="Build Spine Joints", c = buildJointChain)
    cmds.separator( w=200, h=9)

    cmds.setParent('..')
    cmds.showWindow(myWindow)

def buildProxies(*args):
    locAmount = 2
    for i in range(locAmount):
        countLoc = i+1
        spaceLoc = cmds.spaceLocator(n = 'spineLoc_{}_PRX'.format(countLoc), p = [0,i*2.5,0])
        cmds.makeIdentity(spaceLoc, a=1, t=1)
        mel.eval('CenterPivot;')

    cmds.select(cl=True) 


def buildJointChain(*args):

    cmds.select(cl=True) #this line clears your selection

    jntAmount = 7
    for jNum in range(jntAmount):
        countJnt = jNum+1
        spaceJnt = cmds.joint(n = 'spineJnt_{}_Bound'.format(countJnt), p = [0,jNum*1,0])

В нем нет ошибок: это скорее технический вопрос Мне просто нужно, чтобы соединительная цепь была на одинаковом расстоянии между двумя локаторами

1 Ответ

1 голос
/ 05 марта 2020

Возможно, вы могли бы сделать это исключительно с помощью математики, но, поскольку у Maya уже есть собственная структура для этого, мы можем просто использовать ограничения для достижения этого эффекта.

Идея состоит в том, что мы выбираем два объекта, которые ему нужны ограничиваясь, затем мы просто корректируем оба веса ограничений, так что сначала он идеально сочетается с первым объектом, затем на полпути это будет 50% от обоих, а затем, наконец, идеально смешивается с конечным объектом. 2-й вес всегда будет в точности противоположен 1-му весу, иначе он не будет смешиваться, как ожидалось.

Вот как мы можем go сделать это:

import maya.cmds as cmds


count = 20  # Amount of joints to create.

start = "locator1"  # Change to object to start from.
end = "locator2"  # Chagne to object to end to.

steps = 1.0 / (count - 1)  # Will use count to calculate how much it should increase percentage by each iteration. Need to do -1 so the joints reach both start and end points.
perc = 0  # This will always go between a range of 0.0 - 1.0, and we'll use this in the constraint's weights.

for i in range(count):
    jnt = cmds.createNode("joint")  # Create a new joint.
    cmds.setAttr(jnt + ".displayLocalAxis", True)  # Display its orientation.

    constraint = cmds.parentConstraint(start, jnt, weight=1.0 - perc)[0]  # Apply 1st constraint, with inverse of current percentage.
    cmds.parentConstraint(end, jnt, weight=perc)  # Apply 2nd constraint, with current percentage as-is.
    cmds.delete(constraint)  # Don't need this anymore.

    perc += steps  # Increase percentage for next iteration.

Главное, чтобы perc всегда находился в диапазоне от 0,0 до 1,0, поэтому веса всегда будут хорошо сочетаться, независимо от того, насколько вы отрегулируете количество создаваемых соединений. И так как мы используем cmds.parentConstraint, он будет смешивать вращение тоже. Если вы не хотите этого, просто переключите его на cmds.pointConstraint.

Вот пример с 6 суставами между 2 локаторами (оба локатора ориентированы по-разному, поэтому мы видим, как они смешиваются вдоль цепи):

Example 1

И тот же пример с 20 соединениями:

Example 2

О, один вещь, которую я забыл, это воспитание их всех вместе. Вы можете просто добавить новые соединения в список как go, а затем добавить его к последнему соединению в списке (за исключением первого, так как родительскому объекту не к чему)

...