2007年11月29日木曜日

blender - python 同じAction一掃

Poseモードで色々動かした後、動かしていないものも全部選択して、InsertKeyして、こんな感じにActionを作ります。


すると、動いていないBoneにも、キーが設定されてます。


この余計なキー(実際にはIpoCurveのbezierPointsの点でした)を一掃するべく、スクリプト書きました。

実行!!

↓結果。





しかし、出来たものの、余計なところを消してないか?また、実用に耐えうるのかどうか、非常に怪しいです。

実行は、Blenderのテキストエディタで開いて、ALT-Pで。

!!!必ずデータをバックアップしてから使ってください!!!

http://render.jp/blender/deleteSameAction.py



import Blender
from Blender import *

scene = Blender.Scene.GetCurrent()
armatures = [ob for ob in scene.objects if ob.type == 'Armature']

# ----------------------------------
# delete same IpoCurves
#
# return list of deleted for print
# [[ipo,curve,index], [ipo,curve,index] ...]
#
# ipos : list of Ipos
# frameNums : list of frame numbers
# ----------------------------------
def deleteSameCurve(ipos, frameNums):
deleted = []
for ipo in ipos:
if (ipo == None):
continue
for curve in ipo:
pre = None
index = 0
for time in frameNums:
# nothing
if (len(curve.bezierPoints) == 0):
continue
# not existed bezierPoint at time
if ([x for x in curve.bezierPoints if x.pt[0] == time] == []):
continue

value = curve[time]
if (pre != None and pre == value):
length = len(curve.bezierPoints)
curve.delBezier(index - length)
deleted.append([ipo, curve, index])
else:
pre = value
index += 1

return deleted

# ----------------------------------
# delete same IpoCurves from Armatures
# see: deleteSameCurve(ipos, framNums)
#
# return list of deleted for print
# [[[arm1's deleted elements], [arm2's], ... ]]
#
# armatures : Object(.type == 'Armature')
# ----------------------------------
def deleteSameAction(armatures):
deleted = []
frames = []
for arm in armatures:
act = arm.getAction()
ipos = act.getAllChannelIpos().values()
frames = act.getFrameNumbers()
deleted.append(deleteSameCurve(ipos, frames))
return deleted

# ----------------------------------
# execute
# ----------------------------------
print deleteSameAction(armatures)

2 件のコメント:

tibra さんのコメント...

おおおおおお、すごい!仕事が早い!

早速やってみましたところ、Armatureが複数あると、問題なくできてるものあるし、崩れてしまっているものやエラーでできないのもありました。

素人では何の助けもできませんが、せめてってことでこれを・・。
http://timidityf.s3.zmx.jp/3dcg/temp/use-test.zip
(某動画の時のファイル)で試すとミクのボーンがあるとエラーで、ガンダムはほぼ問題なくて、ザクは崩れてしまうといった感じなので、汚くて役に立たないかとも思いますが、何かのお役にたてば幸いです。

uimac さんのコメント...

バグ情報と素敵なテストファイルさんくすです!!

ちょっと2時間ほどハマリましたがorz、無事原因が分かり、修正して、ファイルうpしときました~。うpといっても、目の前にある自分のサーバ上ですがw

原因は、getFrameNumbers()で得られる時間に、必ずしもIpoCurveのベジエのアンカーポイントがあるわけではない、ということでした。うーん、多分これで大丈夫なはず…。

また何かバグ見つけたらお願いしまっす。
ガンダム楽しス。