Использование python для размещения локатора для вектора полюса в Maya - PullRequest
0 голосов
/ 29 июня 2019

Я следую учебному пособию (https://vimeo.com/240328348), которое включает создание локатора и размещение его в правильном месте для вектора полюсов. По какой-то причине, когда я запускаю свой скрипт, он последовательно размещает локатор прямо на средний сустав вместо перемещения на заданную длину позади сустава.

любая помощь будет принята с благодарностью.

    import maya.cmds as cmds
import maya.OpenMaya as om

def create_loc(pos):
    loc = cmds.spaceLocator()
    cmds.move(pos.x, pos.y, pos.z, loc)

def get_pole_vec_pos(root_pos,rot_pos, mid_pos, low_pos, end_pos):
    root_joint_vec = om.MVector(root_pos[0], root_pos[1], root_pos[2])
    rot_joint_vec = om.MVector(rot_pos[0], rot_pos[1], rot_pos[2])
    mid_joint_vec = om.MVector(mid_pos[0], mid_pos[1], mid_pos[2])
    low_joint_vec = om.MVector(low_pos[0], low_pos[1], low_pos[2])
    end_joint_vec = om.MVector(end_pos[0], end_pos[1], end_pos[2])


    line = (end_joint_vec - root_joint_vec)
    point = (mid_joint_vec - root_joint_vec)

    scale_value = (line * point)/(line * line)
    proj_vec = line * scale_value + root_joint_vec

    root_to_mid_len = (mid_joint_vec - rot_joint_vec - root_joint_vec).length()
    mid_to_end_len = (end_joint_vec - low_joint_vec - mid_joint_vec).length()
    total_length = (root_to_mid_len + mid_to_end_len)

    pole_vec_pos = (mid_joint_vec - proj_vec).normal() * 5 + mid_joint_vec

    return pole_vec_pos

def get_ikh_pole_vec_pos(ik_handle):

    ik_joint_list = cmds.ikHandle(ik_handle, q=True, jointList=True)
    ik_joint_list.append(cmds.listRelatives(ik_joint_list[1],children=True, type='joint')[0])

    root_joint_pos = cmds.xform(ik_joint_list[0], q=True, ws=True, t=True)
    rot_joint_pos = cmds.xform(ik_joint_list[1], q=True, ws=True, t=True)
    mid_joint_pos = cmds.xform(ik_joint_list[2], q=True, ws=True, t=True)
    low_joint_pos = cmds.xform(ik_joint_list[3], q=True, ws=True, t=True)
    end_joint_pos = cmds.xform(ik_joint_list[4], q=True, ws=True, t=True)
    pole_vec_pos = get_pole_vec_pos(root_joint_pos,rot_joint_pos, mid_joint_pos, low_joint_pos, end_joint_pos)
    return pole_vec_pos

pole_vec_pos = get_ikh_pole_vec_pos('ikHandle1')
create_loc(pole_vec_pos)
...