赞
踩
在Maya2020里有了offset parent matrix 属性,这样用matrix对物体做约束的时候就可以少很多节点,且结构更清晰简洁,那么下面就实现下这个功能。
首先创建两个locator,一个小球,用来模拟这个小球收到这两个locator的约束,而且是可以切换约束,即可以受locator1约束,也可以受locator2约束。
既然是用matrix来做约束,那么就再创建两个multMatrix节点,用这两个matrix节点的主要目的是做带有便宜值的matrix约束,就类似于Maya的parentConstraint的keep offset功能,首先我们要求出这两个locator和小球的分别的初始偏移值,可以用下面的代码来获得:
import maya.api.OpenMaya as OpenMaya
node = 'pSphere1'
driver = 'locator1'
offset = (
OpenMaya.MMatrix(cmds.getAttr("{}.worldMatrix[0]".format(node)))
* OpenMaya.MMatrix(cmds.getAttr("{}.matrix".format(node))).inverse()
* OpenMaya.MMatrix(cmds.getAttr("{}.worldInverseMatrix[0]".format(driver)))
)
分别获取完他们的初始值,然后需要把这个初始值复值给multMatrix的matrixIn[0]
cmds.setAttr("{}.matrixIn[0]".format(mult), list(offset), type="matrix")
然后再把locator1的初始值链接到multMatrix节点上的matrixIn[1]上面
locator2也做如此操作,也就是让locator的自身矩阵和偏移的矩阵相乘,得到新的矩阵
要想让这两个矩阵进行切换,那就需要另一个节点,blendMatrix
用下面的代码将小球的offset parent matrix值设置给blendMatrix的input matrix里
m = OpenMaya.MMatrix(cmds.getAttr("{}.offsetParentMatrix".format('pSphere1')))
blend = 'blendMatrix1'
cmds.setAttr("{}.inputMatrix".format(blend), list(m), type="matrix")
再分别将multMatrix的matrix sum属性和blendMatrix的target Matrix相连,节点图如下
做到这一步需要我们对小球也就是被约束的物体做些设置,首先给小球加个切换属性,Enum类型的,分别设置成foot,root,然后再添加两个属性
cmds.addAttr('pSphere1', ln="spaceUseRotate", at="bool", defaultValue=True, keyable=True)
cmds.addAttr('pSphere1', ln="spaceUseTranslate", at="bool", defaultValue=True, keyable=True)
然后将blendMatrix的output matrix和小球的offset Parent Matrix相连
接下来就是实现他们的属性相互切换了,用到condition节点,用小球的space属性和两个condition节点的first term相连,然后再用out color R去分别连blendMatrix的weight
condition1和2分别这样设置的
再把小球的space use rotate和blendMatrix节点的target[0]的use rotate相连,space use translate和blendMatrix节点的targe[1]的use translate相连,这两个属性主要控制locator对小球的translate生效还是rotate生效,还是两者都生效。
到此整个网络就连好了,如下图:
欲听更多此和尚念得经,可以直奔TDMonk大堂
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。