LoginSignup
8
6

More than 5 years have passed since last update.

【MAYA】IKに極ベクトルでコンストレイントかける際のリグ位置を求める計算メモ

Last updated at Posted at 2018-01-01

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

 2018-01-01 18.00.48.png
スクリプト実行の前に、始点・終点・中点の順に選択します。

 2018-01-01 18.05.19.png
スクリプト実行するといい感じの位置にロケータが作成されます。

 2018-01-01 18.06.08.png
IKハンドルと極ベクトルコンストレイントさせます。うまく動いているようです。

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

あけおめ、ことよろ。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6