【MAYA】IK에 극 벡터로 컨스트레인트 걸 때의 리그 위치를 구하는 계산 메모
무릎이나 팔꿈치의 조인트에 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년만 이상으로 진지하게 했습니다. 어쩐지, 더 프로그램에 맡기고 편하게 할 수 있을 것 같은 생각이 듭니다. 설날에 무슨 일이야.
새해 복 많이 받으세요.
Reference
이 문제에 관하여(【MAYA】IK에 극 벡터로 컨스트레인트 걸 때의 리그 위치를 구하는 계산 메모), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/harayoki/items/06ed4fb0f17497173d94텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)