【问题标题】:Maya Python: create equidistant joint chain between locatorsMaya Python:在定位器之间创建等距的关节链
【发布时间】:2020-06-17 17:56:02
【问题描述】:

好的,所以我正在为脊柱制作一个自动装配器:但在继续之前我必须做一件事,我只需要做一件事:我希望关节链适合两个定位器之间,不幸的是,目前这个任务有点超出我的心理负担:如果有人想尝试一下,这是脚本:

    '''
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])

它没有任何错误:这更像是一个技术问题。我只需要关节链在两个定位器之间等距

【问题讨论】:

    标签: python maya autodesk


    【解决方案1】:

    您可能完全可以通过数学来做到这一点,但由于 Maya 已经有自己的框架来做到这一点,我们可以只使用约束来实现这种效果。

    我们的想法是我们选择两个它需要约束的对象,然后我们调整两个约束权重,以便首先它与第一个对象完美融合,然后中途它将是两者的 50%,然后最终完美融合到最终对象。第二个重量总是与第一个重量完全相反,否则它不会像预期的那样混合。

    我们可以这样做:

    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

    这是一个示例,其中 2 个定位器之间有 6 个关节(两个定位器的方向不同,因此我们可以看到它们如何沿链混合):

    同样的例子有 20 个关节:

    哦,我忘记的一件事是一起养育他们。您可以随时将新关节附加到列表中,然后将其作为列表中最后一个关节的父节点(第一个关节除外,因为没有任何父节点)

    【讨论】:

    • 将列表附加到父关节是什么意思?这个脚本是完美的:但现在我面临两个挑战:养育关节,然后重命名孩子
    • 在循环中,将关节附加到循环外的列表中。在下一次迭代中,将该关节作为该列表中最后一个关节的父级。这就是你制作链条的方法。重命名应该是直截了当的,因为您在循环中已经有了一个要命名的数字。
    • 我明白了,谢谢。我实际上想出了一种方法来创建自动父节点和重命名的关节,它涉及用关节命令替换您的创建节点关节线,并使用一些变量将其设置为整数命名约定。
    猜你喜欢
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多