2016年10月20日木曜日

blender::スクリプトで後からActionにgroupを追加し、fcurveを登録する方法

現在、お仕事でBlenderのスクリプトを触っているのですが、まったくMayaのそれとは異質で四苦八苦。。(汗
同じpythonといっても、Blenderのpythonスクリプティングは、完全にオブジェクト指向なので、コマンドを動かして操作するmaya pythonとはまったくハンドリングが違う。
たかだかジョイントツリーを選択するだけで時間がかかる…!

Blender pythonでの操作方法はいくつかわかってきましたが、そのうち一つをこちらでメモを兼ねて公開します。

通常、Blender上でアニメーションを作成すると、ArmatureにActionを登録し、キーフレームを作成すると、Actionデータの中に骨ごとのグループができて、中にfcurveが登録されます。
が、例えば、FBXなどをインポートすると、(出力やインポート方法によって異なるかもですが)、この骨ごとのグループが作成されず、Armature直下にfcurveが登録されます。

これを骨ごとのグループに登録しなおすには、ActionEditor上から手作業でグループを作成…してもよいのですが、面倒。

スクリプトでやると、以下の通りです。

※あらかじめ編集したいArmatureを選択してアクティブにしておくことが前提
※アクティブにするArmatureをスクリプトで指定する方法は、またべつのはなし(笑)

#まず、新規にActionにgroupを追加する。
>>> bpy.context.object.animation_data.action.groups.new('test')
#手動操作時の、infoウインドウにログ表示される「bpy.ops.anim.channels_group(name="testGrp")
」という入力だとなんでか怒られます。おそらく、fcurveがきちんと指定できてないのかも。

#つぎに、アニメーションカーブを取得します。
>>> fcList=bpy.context.object.animation_data.action.fcurves
#カーブごとのグループアトリビュートを指定します。
>>> for fc in fcList:
...     fc.group.name='test'
>>>for fc in fcList:
...     fc.group=bpy.context.object.animation_data.action.groups['test']

※12/1修正:名前指定ではグループに入りませんでした!
※グループオブジェクトを指定する必要があるようです。

…以上!(ジェイソン風味
fcurveごとに登録したいグループを変えるのであれば、fcurveのdata_pathアトリビュートから、UI上に表示されている名前を取得できるので、if文で処理分岐するといいと考えています。

2016年10月13日木曜日

シーン内のすべてのリファレンスノードをインポートする。

メモ代わりに。

リファレンスノードを取得し、ファイルパスを取得、fileコマンドからインポート。