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);