用Matrix在Maya2020里实现对offsetParentMatrix约束的切换

16 篇文章 1 订阅

在Maya2020里有了offset parent matrix 属性,这样用matrix对物体做约束的时候就可以少很多节点,且结构更清晰简洁,那么下面就实现下这个功能。

首先创建两个locator,一个小球,用来模拟这个小球收到这两个locator的约束,而且是可以切换约束,即可以受locator1约束,也可以受locator2约束。

在这里插入图片描述

既然是用matrix来做约束,那么就再创建两个multMatrix节点,用这两个matrix节点的主要目的是做带有便宜值的matrix约束,就类似于Maya的parentConstraintkeep 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")

再分别将multMatrixmatrix sum属性和blendMatrixtarget 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大堂

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值