【MAYA】IK에 극 벡터로 컨스트레인트 걸 때의 리그 위치를 구하는 계산 메모

7632 단어 파이썬maya
MAYA+python 경력 4개월 정도?의 나입니다. 리그라든지 공부중입니다.

무릎이나 팔꿈치의 조인트에 IK가 설정되어 있고, 극 벡터를 사용한 리그로 방향을 컨트롤하고 싶은 경우에, 로케이터 등의 리그를 배치하는 좋은 느낌의 장소를 구하는데 사용한 빠른 python 코드를 메모 유지합니다.
스크립트 편집기에 붙여넣기 위한 것입니다. MAYA2018 + MacOS Sierra에서 작동 확인 중입니다.

조인트가 x축 방향 혹은 z축 방향으로 향하고 있는 경우는 확실한 위치에 로케이터를 둘 수 있기 때문에 문제 없습니다만, 그렇지 않은 경우(그런 상태를 만들어도 좋은지 모른다)는 적절한 위치에 리그 을 두는 것이 어렵고, 컨스트레인트를 걸었을 때에 파트의 방향이 피쿳과 약간 바뀌어 버리는 것을 피하기 위해서 이 코드를 썼습니다.
import pymel.core as pm
import pymel.core.datatypes as dt


def temp_def(locator_name='loc', distance=1.0):
    """
    A点(起点)B点(中点)C点(終点)の3つのジョイントを選択して実行すると
    極ベクトルコンストレイントに適した位置にロケータを作成する

    :param locator_name: 作成するロケータ名
    :param ratio: ロケータを作成する距離
    :type locator_name: str
    :type ratio: float
    """
    sel = pm.selected()
    if len(sel) < 3:
        print('select 3 nodes')
        return
    vectors = []
    for n in sel:
        pm.select(n)
        t = pm.xform(translation=True, ws=True, q=True)
        vectors.append(dt.Vector(t[0], t[1], t[2]))
    A = vectors[0]
    B = vectors[1]
    C = vectors[2]
    AB = B - A
    AC = C - A
    n = (AB.x * AC.x + AB.y * AC.y + AB.z * AC.z) / (AB.x * AB.x + AB.y * AB.y + AB.z * AB.z)
    AD = n * AB
    DC = AC - AD
    X = C + distance * DC
    loc = pm.spaceLocator(n=locator_name)
    loc.translate.set([X.x, X.y, X.z])


temp_def('locatorA', 0.5)
del temp_def


스크립트를 실행하기 전에 시작점, 끝점 및 중간점을 선택합니다.


스크립트 실행하면 좋은 느낌의 위치에 로케이터가 작성됩니다.


IK 핸들과 극 벡터 구속. 잘 움직이는 것 같습니다.

AB로부터 수직으로 늘어나 C를 지나는 점을 구하는 계산을 10년만 이상으로 진지하게 했습니다. 어쩐지, 더 프로그램에 맡기고 편하게 할 수 있을 것 같은 생각이 듭니다. 설날에 무슨 일이야.



새해 복 많이 받으세요.

좋은 웹페이지 즐겨찾기