如何查询关节的sao(次轴世界方向)?Maya Python
我想查询一个关节的 sao
,这样我就可以把它分配给另一个关节。在这个情况下,我已经通过 .jot
获取到了 LowArm
的 oj
,现在我想用类似的方法来获取 sao
。
mc.joint ('L_Hand_JNT', e=1, oj=mc.getAttr ('L_LowArm_JNT.jot'), sao='yup', zso=1)
如果有人能提供帮助或建议,那就太好了,谢谢!
2 个回答
我觉得关节没有一个叫'sao'的属性。这个标志的作用是让你在对齐关节时指定一个辅助轴,因为单一的方向信息不足以让Maya正确放置关节。就像一个目标约束,你需要告诉Maya如何为给定的目标找到解决方案,因为有无数种有效的解决方法。
不过,你可以通过解析关节的世界空间矩阵或者使用定位器来获取每个关节的“轴”。
如果你使用下面的代码提取关节的世界矩阵:
worldMat = cmds.xform(q=True, m=True, ws=True)
那么关节的X轴会指向世界向量worldMat[0:3]
,局部的Y轴是worldMat[4:7]
,局部的Z轴是worldMat[8:11]
。
如果你想用图形方式来做,可以创建一个定位器,把它父级设置为关节,并沿着你要检查的轴移动1个单位,然后获取它的世界位置,这样就能得到关节的世界位置。
我觉得你不能恢复传递给sao标志的原始参数——虽然关节可能仍然指向那个方向,但也可能不是。
当然,如果你知道将来还会需要这个参数,可以把原始的sao参数存储在一个自定义属性中,以便后续取用。
我找到了一种方法,可以得到我想要的结果,那就是创建一个叫做 shadingNode 的东西,这个东西里面有一个枚举(Enum),它的名字是根据特定关节使用的 orient joint 命令来命名的,这里我们以肩膀为例。
if mc.objExists ('L_ShoulderOrient_NODE'): mc.delete ('L_ShoulderOrient_NODE')
mc.shadingNode ('transform', au=1, n='L_ShoulderOrient_NODE')
mc.addAttr ('L_ShoulderOrient_NODE', ln='jointOrient', at='enum', en='yup', k=1)
上面的内容是在创建关节的阶段添加的,之后我使用了下面的脚本:
if mc.ls ('L_Shoulder_JNT', sl=1):
if mc.objExists ('L_ShoulderOrient_NODE.jointOrient'): mc.deleteAttr ('L_ShoulderOrient_NODE.jointOrient')
mc.addAttr ('L_ShoulderOrient_NODE', ln='jointOrient', at='enum', en=WOB3 + WOB4, k=1)
WOB3 是根据主要和次要方向选择的上下方向,WOB4 是从 orient joint 菜单中选择的上下方向。mc.ls ('L_Shoulder_JNT', sl=1) 这段代码确保只有在选择并更改了这个特定关节时,这个脚本才会生效。
然后我能够运行这个脚本:
JOX = mc.attributeQuery( 'jointOrient', n='L_ShoulderOrient_NODE', le=1 )
mc.joint ('L_Hand_JNT', e=1, oj=mc.getAttr ('L_LowArm_JNT.jot'), sao=JOX[0], zso=1)
这个脚本把所有的元素结合在一起,为新创建的关节提供了一个上下向量,这个向量是用户随机选择的。
现在只剩下在过程结束时删除这个节点。如果有人想到其他方法来获取已有关节的上向量并像上面那样应用,请在下面告诉我!
非常感谢,
亚当