my funeral week

少しでも日々の生活に変化を。

MayaScripts_AlignKeyTangents : ループアニメーション作成補助ツール

ここしばらくはSoftimageについて記事を書いていましたが・・・Mayaに戻ります。

今日はMayaのアニメーション作業時・・・なかでもループアニメーションを作成しているときの煩わしい「ループの前後端の値を合わせる」作業を解消するものをこさえましたので、ご報告です。



AlignKeyTangents

多くの場合、下図のようにループアニメーションの 最初と最後のキーフレームは全く同じ値 にするかと思います。

f:id:garysfirearms108:20190127220358j:plain:w400


私は今までの経験上、そのような仕様で作業することが多かったです。 最終的なアニメーションの繋がりを確認する為にも、その方が都合がよいのでしょう。

ただ、面倒なのが 同じポーズをいちいち前後に正しく配置すること!
キーフレームを丸々掴んでコピーしてから、カーソルを反対の端のフレームにペーストみたいなことをしていました。今までは!

これからは違います。
これを使えば一気にその作業が楽になります。


なにができる?

  • アニメーションカーブ上の端のキーを反対側の端のキーにペーストできる
    • コピーペーストされるのは、キーの値とキースロープの角度 です
  • 前方のキーを選択して実行すれば後方のキーへ、後方を選択していれば前方にペーストします。

f:id:garysfirearms108:20190127220419j:plain:w500


ダウンロード

ファイルにするのが面倒だったので、各々以下のソースコードをコピペして使ってくだしあ。

適当なショートカットに登録して、素早く実行できるようにしておくと良いです。
そもそもこのスクリプトは、ループの前後のポーズを編集しながら、逐次実行する想定です。

# coding:utf-8

import pymel.core as pm

def main():
    
    # Get anim curve names
    selection = pm.keyframe(q = 1, sl = 1, n = 1)
    
    for animCurve in [pm.nodetypes.AnimCurve(i) for i in selection]:
        
        # Get about key index
        selectedTime = pm.keyframe(animCurve, q = 1, sl = 1, tc = 1)[0]
        timeRange = pm.keyframe(animCurve, q = 1, tc = 1)
        
        # Get keyTangent values
        keyValue = pm.keyframe(animCurve, q = 1, t = selectedTime, vc = 1)[0]
        angleIn = pm.keyTangent(animCurve, q = 1, t = selectedTime, ia = 1)[0]
        angleOut = pm.keyTangent(animCurve, q = 1, t = selectedTime, oa = 1)[0]
        
        # Decide key index
        keyIndex = -1 * (len(timeRange)/2 >= timeRange.index(selectedTime))

        # Align keyTangent slope angle
        pm.keyframe(animCurve, t = timeRange[keyIndex], vc = keyValue)
        pm.keyTangent(animCurve, t = timeRange[keyIndex], ia = angleIn)
        pm.keyTangent(animCurve, t = timeRange[keyIndex], ia = angleOut)


使い方

  1. コピーしたいキーを選択する。
  2. スクリプトを実行する。
  3. 以上!


ソースを見れば分かると思いますが、大変簡素なコードになっております。
でも、個人的にはこれでループアニメーションの作成が15%は楽になりました。多分そんな気がします。


今回は短いですが、この辺で。