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



ABから垂直に伸びてCを通る点を求める計算を10年ぶり以上で真面目にやりました。なんか、もっとプログラムに任せて楽にできそうな気がします。お正月に何やってんだ。

あけおめ、ことよろ。