我想查询一个关节的sao
,以便将其分配给另一个关节。
在这种情况下,我设法通过oj
获取LowArm
的{{1}},我正在尝试使用.jot
执行类似操作。
sao
任何帮助或建议都会很棒,谢谢!
答案 0 :(得分:1)
我不认为关节具有'sao'属性:标记是允许您在对齐关节时指定辅助轴,因为单个方向不能为maya提供足够的信息来布置关节:like一个目标约束,你需要告诉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 argmument存储在自定义属性中,以便以后检索,如果您知道再次需要它。
答案 1 :(得分:0)
我已经找到了获得我想要的结果的方法,那就是创建一个shadingNode,它具有一个以用于特定关节的orient关节命令命名的Enum,在本例中是肩膀。
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是从方向联合菜单中选择的向上或向下。 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)
将所有元素组合在一起,根据用户随机选择的方式为新创建的关节提供上/下矢量。
现在剩下的就是删除流程结束时的节点。 如果有人想出另一种方法来获得已有关节的upvector并按上述方式应用它,请在下面告诉我们!
非常感谢, 亚当