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

Header

Main

  • TOP
  • DF TALK
  • MotionBuilderでツールをより使ってもらうために

MotionBuilderでツールをより使ってもらうために

2012/12/25

Tag: ,

はじめまして、アシスタントTDの森本です。

6年ほどアニメーションデザイナーとして作業しつつ、
たまにちょっと役立つスクリプトを書いてましたが、
今回TDチームが発足するのに合わせてアニメーションTDに専念することになりました。
TDとしてはまだまだ知識、経験至らない部分が多々ありますが
元アニメーションデザイナーとしての経験を生かして
デザイナー視点から扱いやすいスクリプトでサポートしていければと思っています。

さて、今回のテーマですが「MotionBuilderでよりツールを使ってもらうために」です。
弊社ではアニメーション作業のメインツールとしてMotionBuilderを使用していますが、
MotionBuilderにはMAYAのScriptEditorのように履歴が残ったりする機能はありません。

そのためにちょっとしたことをスクリプトで実行したくても
履歴のコピペが出来ずにPythonでコードを書かないといけないため
普段からスクリプトに慣れていない人もいます。

そこでTD側でスクリプトをMotionBuilderのメニューに自動登録する仕組みを作っていて
新しいスクリプト追加や旧スクリプトのバージョンアップ等を
デザイナーが意識しなくてもメニューが更新されるようにしています。
よくある仕組みとは思いますが今回はそちらの紹介をしようと思います。

なお、これ以降でてくるスクリプトに関しては
MotionBuilder2013SP1にて動作を確認しています。

まずベースになっているスクリプトが
MotionBuilderのデフォルトのサンプルスクリプトにある
FBMenu.pyになります。
こちらを実行すると下記図のようにメニューに項目が追加されます。

ただし、メニューの内容がすべてFBMenu.py内に記述されてしまっているため、
同じ方式にするとメニューを追加するたびにPyファイルを配って更新してもらう必要があります。
これだとさすがにTD、デザイナー共に面倒です。
スタートアップスクリプトフォルダの設定をサーバーのフォルダで共通にすれば
同じスクリプトを参照できますが個人単位でスタートアップの設定ができなくなります。

そこでメニューの追加する設定に関しては外部に設定ファイルとして保存して
その外部ファイルをTDチーム側で調整することでスクリプト登録を変更しています。

実際単純化したもので説明しこうと思います。

まずは外部設定テキストを準備します。
test.txt
中身については
F:\Hello.py
登録したいスクリプトファイルのアドレス(複数の場合は行を変えて)
が書かれたテキストです。

例としてあげているHello.pyですが

# *- coding: utf-8 -*-
from pyfbsdk import *
FBMessageBox("スクリプト実行テスト","Hello!","閉じる")

MotionBuilder上で簡単なメッセージボックスがでるスクリプトです。

上記ファイルを適当な場所(例ではFドライブ直下)に配置した状態で
メニュー追加スクリプトの簡単なコードを以下に記します。

# *- coding: utf-8 -*-

from pyfbsdk import *
import os

# メニューを選んだときにスクリプトを実行
def eventMenu(control, event):    
    ScriptFile=ScriptDic[event.Name]
    FBApplication().ExecuteScript(ScriptFile)

# 外部設定テキストからスクリプトをメニューに追加
# 追加時に設定内容を辞書に追加
def MenuAdd(pRootMenu,pFullSetTxt,pScDic):
    
    # 設定ファイルの読み込み
    f=open(pFullSetTxt)
    oSettingTxt = f.read()
    f.close()
    lSettingList = oSettingTxt.split("\n")
    
    # メニュー登録
    insideMenu=FBGenericMenu()
    i=0
    for FullPyFile in lSettingList:
        i+=1
        FileName=os.path.basename(FullPyFile)
        insideMenu.InsertLast(FileName,i)
        pScDic[FileName]=FullPyFile
    insideMenu.OnMenuActivate.Add(eventMenu)
    
    # 親メニュー登録
    pMenuName=os.path.basename(pFullSetTxt).replace(".txt","")
    pRootMenu.InsertLast(pMenuName,100,insideMenu)

# 外部設定テキストの場所
PyListTxt=r"F:\MBPyTest\test.txt"

# ルートメニューの設定
menuMgr = FBMenuManager()
RootItem = menuMgr.InsertAfter(None, "PythonTools","AnimTools")
RootMenu = menuMgr.GetMenu("AnimTools")

# メニュー選択時に使用するスクリプトの場所を設定した辞書作成
ScriptDic={}
MenuAdd(RootMenu,PyListTxt,ScriptDic)

スクリプト上の36行目でテキストファイルの場所を指定します。

以上のスクリプトをMotionBuilder上で実行すると
メニューにAnimToolsが追加されてさらにtestのメニュー項目内に
設定テキストファイル内のスクリプトファイルが登録されています。
登録されたスクリプトのメニュを選択するとスクリプトが実行されます。

以上がベースのスクリプトになりますが
実際に使用しているスクリプトはサーバー上に設定ファイルを用意してメニューを作っているため
メニュースクリプトをMotionBuilderのスタートアップスクリプトに登録した人は
TD側で登録したスクリプトはどの人でも自動的にMotionBuilderを起動するとメニューに登録されます。
また、カテゴリ分け、個人登録機能の追加などの調整が入っています。

しかし、登録の仕組み自体はベースのスクリプトとほぼ変わりがありません。

この仕組みにより個人でスクリプトの設定をしていたときと違って
スクリプトの更新、追加の手間が省けるためスクリプト関連のエラーを減らすことができます。
(バグがある古いスクリプトを使っていた等)

ただし、問題点として選択時にそのまま実行されるため
説明を入れる隙間がなくスクリプトの使い方がわからない点があります。
例)
 ・キャラを選択して実行
 ・シーンデータがあるルールに合わせた仕様になってないと動かない

UI付のスクリプトに関してはUI上で説明がありますが、
選択後即実行されるスクリプトに関しては説明を入れる余地がないため、
それぞれのスクリプトで間違った使い方の場合はエラーウィンドウで説明するなどの処理を入れておくことが必要です。

また、よりカスタマイズして使っていきたい人向けに
下記図のようなシェルフスクリプトも作って配布しています。
(下図のようにアイコン画像も追加できますがアイコンのセンスのなさはご勘弁を)

以上です。
簡単なスクリプトの紹介にしかなっていませんが
比較的にMotionBuilderのスクリプト自体情報が少ないので
何かの参考になれば幸いです。

では、また。

Pocket

コメント

コメントはありません

コメントフォーム

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

*