如何查询关节sao(次轴世界方向)?玛雅Python

时间:2014-08-17 19:41:39

标签: python axis maya

我想查询一个关节的sao,以便将其分配给另一个关节。 在这种情况下,我设法通过oj获取LowArm的{​​{1}},我正在尝试使用.jot执行类似操作。

sao

任何帮助或建议都会很棒,谢谢!

2 个答案:

答案 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并按上述方式应用它,请在下面告诉我们!

非常感谢, 亚当