株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • 群集カットも安心?MotionBuilderで大量のキャラを扱う方法

群集カットも安心?MotionBuilderで大量のキャラを扱う方法

2013/11/18

Tag: ,

こんにちは、TDチームの森本です。

アニメーションチームからTDチームに変わって1年すぎました。
日々の忙しさにあっという間にすぎた気がしますが
今後もよりよいサポートができるよう頑張っていきたいです。

さて、弊社ではMotionBuilder(以後MB)でアニメーション作業を行っていますが
その利点の一つとして大量のアセットがあっても再生がはやいことにあります。
ただし、いくらMBでも数十人単位でキャラを配置すると
かなり重くて作業できなくなります。
今回はそんなカットにおいて少しでも軽く、より人数がおける方法について
紹介していきます。

今回はMBのチュートリアルキャラクターをつかっていますが
キャラによっては当然データの重さが変わりますので
配置できる数は変わってきます。
ソフトはMotionBuilder2014を使用しています。

まずは以下のようなベースの歩行モーションを用意しました。

データとしては
・使用キャラクターはMBのチュートリアルキャラクター「Mia」
・150frame
・30fps
・全フレームにキーが入っている(モーションキャプチャーを想定)
になっています。

早速このデータを複数体配置してみたときの表示FPSを比較してみました。

当たり前ですがキャラクター数を増やしていく毎にFPSが落ちていきます。
主観ではありますが体感的には24体ぐらいから作業するには辛くなってきて
48体以降はまともに作業できない状態です。

そこでなるべく軽くするためにキャラクターについているコントロールリグのアニメーションを
骨にプロットして移した後リグを削除してみます。




上記手順でコントロールリグをぬいた状態で同じように複数体配置してみたところ
配置できる体数が飛躍的にあがりました。

リグがあるときとないときで表示FPSを比べてみるとないときのほうが
十分体感できるレベルで早くなります。


ただし、このままではリグを削除してしまったためアニメーションの編集をすることが非常に困難です。
そこでリグを削除、作成するスクリプトを使って編集したいキャラクターだけリグがある状態にします。

# *- coding: utf-8 -*-

from pyfbsdk import *

# プロット用のオプション設定
oOpt = FBPlotOptions()
oOpt.ConstantKeyReducerKeepOneKey = False
oOpt.PlotAllTakes = False
oOpt.PlotOnFrame = True
oOpt.PlotPeriod = FBTime(0,0,0,1)
oOpt.PlotTranslationOnRootOnly = False
oOpt.PreciseTimeDiscontinuities = False
oOpt.RotationFilterToApply = FBRotationFilter.kFBRotationFilterUnroll
oOpt.UseConstantKeyReducer = False

# 選択しているキャラクターのリストを取得
lChrList = [ lObj for lObj in FBSystem().Scene.Characters if lObj.Selected==True ]

for lChr in lChrList:
    print "SelectedCharacter>>"+lChr.LongName
    
    # キャラクターについているリグを取得
    CurrentRig=lChr.GetCurrentControlSet()
    
    #リグがある場合とない場合で分岐
    if CurrentRig:
        # キャラクターの中でインプット状態がアクティブな場合は骨にプロット
        if lChr.ActiveInput:
            lChr.PlotAnimation(FBCharacterPlotWhere.kFBCharacterPlotOnSkeleton,oOpt)
        # リグを削除
        CurrentRig.FBDelete()
    else:
        # リグを作成して骨のアニメーションをリグにプロット
        lChr.CreateControlRig(True)
        lChr.PlotAnimation(FBCharacterPlotWhere.kFBCharacterPlotOnControlRig,oOpt) 

上記スクリプトはキャラクターを選択した状態で実行(複数選択可)すると
リグがあるものはリグアニメーションを骨構造にPlotしてリグを削除、
リグがないものはリグを作成して骨構造のアニメーションをリグにPlotします。

これによりアニメーション編集したいキャラのみリグを入れた状態にできるため
大量にキャラを配置したまま作業がしやすくなります。

ただし、上記スクリプトではMBが元々持っている標準リグを作成します。
以下のような場合は標準リグで全フレームにPlotされた状態にもどってしまうため注意が必要です。
・MBの標準リグから独自に手を加えている場合
・手付けでキーポーズにのみアニメーションキーを入れている場合

上記のような場合は標準リグに戻されると問題があるため、
その場合はリグ部分だけをSaveSelectionで外部に書き出してから
リグを削除します。
リグ構築したい時は書き出したリグを読み込んで
キャラクターとの繋がりの設定だけ再設定すれば
元の消されたくない設定を壊さずにリグ制御に戻すことが可能です。


以上のように大量のキャラクターを扱う際に
今までファイルを分けざる終えなかったファイルが
1つのファイル内で作業することが可能になるかもしれません。
ファイルを分けてしまうとファイル間でのレイアウトが取りづらくなったり
カメラが共通なものになるように常に同期する必要があったりミスがでやすくなります。
他にもStoryを使ってアニメーションをClip化したりすることも軽くするには有効な手になります。
大量に配置するキャラとなると観客等のモブキャラを使う場合が多いのでそういうキャラに関しては
極力MB上のセットアップを単純にしておけばリグを外すことも容易になると思います。

また、弊社ではさらにキャラクター自体も簡易キャラに置き換える等のアプローチを
試行錯誤しつつ現在は進めています。


大量にキャラが出てくるカットはかなり大変なので
より作業しやすいツールを作っていきたいです。
今回は以上になります。
では、また。

※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*