LoginSignup
4

More than 5 years have passed since last update.

maya Python ベイクしたアニメーションをまた修正したい。

Posted at

mayaとpythonの勉強もかねてこんなのを作ってみたというだけ・・。

まずはシンプルなIKのアニメーションを作成

1,5,10フレームめのiKHandle1にキーを設定
こんな感じのを・・・

丸っとアニメーションをベイク
するとJointなどにもこんな感じで全てのフレームにキーが打たれる

ここから 1 5 10のキーフレームだけを残して削除したい。
ようするにアニメーション変更したいけどこのままじゃ全てキー打たれちゃってるから修正が大変です。
ってことかな。
ベイクする前に別の名前で保存すればいいだけだけど・・・。

作りたいコマンド

手順
一個cubeなどを作成し、1,5,10フレームにキーを設定。
あとは最初にcubeを選択、その後ベイクしたオブジェクトを選択でコマンド実行!
理想の結果
cubeに設定されているキー以外のアニメーションが削除される

試行錯誤した結果

なんとかできた


import maya.cmds;
model = cmds.ls(selection=True)[0];
keyTimes = cmds.keyframe(model,query=True);

timeList = range(1, int(max(keyTimes)));
data = list(set(timeList) - set(keyTimes));

selectObjList = cmds.ls(selection=True);
for frameTime in data:
    for obj in selectObjList[1:]:
        cmds.cutKey(obj, time=(frameTime,frameTime), cl=1);

pythonなれないと書き方が気持ち悪いけど、短くかける!

簡単な解説

選択した最初のオブジェクトの名前をmodelに設定


model = cmds.ls(selection=True)[0];

最初に選択したオブジェクトのキーフレームを取得(全て取得しているので重複がある)


keyTimes = cmds.keyframe(model,query=True)

最大の時間までのフレーム番号リストを作成(今回の場合、1,2,3,4,5,6,7,8,9,10)


timeList = range(1, int(max(keyTimes)));

キーフレームの差分を取得(消すキーフレームのリスト)(2,3,4,7,8,9)


data = list(set(timeList) - set(keyTimes))

あとは選択されたオブジェクト(最初のをのぞく)でループをまわして、
さらに削除するキーフレームのリストでループをまわして、
cutKey! でOK


selectObjList = cmds.ls(selection=True);
for frameTime in data:
    for obj in selectObjList[1:]:
        cmds.cutKey(obj, time=(frameTime,frameTime), cl=1);

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
4