1)公式ドキュメント
2)Python Editor
3)簡単なスクリプト例
Cubeの作成と操作
初めにモジュールをインポート
from pyfbsdk import *
Cubeを作成して表示させ、大きくする
cube = FBModelCube("Cube")
cube.Show = True
cube.Scaling = FBVector3d(10, 10, 10)
Cubeを選択
cube.Selected = True
Cubeを消す
cube.FBDelete()
位置と大きさを指定してCubeを作成する関数を実行
from pyfbsdk import *
def CreateCube(xPos, yPos, scaleFactor):
name = 'testCube_%d_%d' % (xPos, yPos)
cube = FBModelCube(name)
cube.Show = True
cube.Translation = FBVector3d(xPos, yPos, 0.0)
cube.Scaling = FBVector3d(scaleFactor, scaleFactor, scaleFactor)
return Cube
cube = CreateCube(100, 200, 50)
4)名前について
Full Name
Model::testNamespace:someCube
Long Name / Label Name
testNamespace:someCube
Group Name
Model
Namespace(s)
testNamespace
Name("Short Name")
someCube
(Python Scripting in MotionBuilder - 03 - Components and the Scene より)
5)オブジェクト等の取得
【pyfbsdk】
名前に一致するモデルやコンポーネントの検索
FBFindModelByLabelName --- return 0 or 1 FBModel
FBFindObjectByFullName --- return 0 or 1 FBComponent
from pyfbsdk import *
cube1 = FBFindModelByLabelName("Test:TestCube")
cube2 = FBFindObjectByFullName("Model::Test:TestCube")
#shortname
print(cube1.Name) #実行結果→TestCube
#longname
print(cube1.LongName) #実行結果→Test:TestCube
#Fullname
print(cube2.FullName) #実行結果→Model::Test:TestCube
"Cube"から始まる名前のコンポーネントの検索
FBFindObjectsByName --- return 0 to n FBComponent or FBModel
from pyfbsdk import *
SEARCH_INCLUDE_NAMESPACE = True
SEARCH_ALL_OBJECTS = False
foundComponents = FBComponentList()
FBFindObjectsByName("Cube*", foundComponents, SEARCH_INCLUDE_NAMESPACE, SEARCH_ALL_OBJECTS)
for comp in foundComponents:
print(comp.FullName)
▶実行結果例
Cube 1_1
Cube 2_1
Cube 3_1
Cube 4_1
Model::Cube
Geometry::Cube
Model::Cube 1
Geometry::Cube 1
Model::Cube 2
Geometry::Cube 2
選択したモデルの名前を表示
FBGetSelectedModels --- 0 to n FBModel
from pyfbsdk import *
selectedModels = FBModelList()
FBGetSelectedModels(selectedModels, None, True, True)
for model in selectedModels:
print(model.FullName)
▶実行結果例
Model::Aragor:Root
【FBSystem】
すべてのコンポーネントの表示(名前)
すべてのコンポーネントは FBSystem().Scene.Components で取得できる
from pyfbsdk import *
for comp in FBSystem().Scene.Components:
print(comp.Name)
▶実行結果例
Scene
Core
Thread Manager
Evaluation Manager
Timing Manager
Command Manager
KTimeWarpManager
Profiler
Evaluation
Transport
Timer
Audio
Video
DefaultMaterial
Producer Perspective
Producer Front
Producer Back
Producer Right
Producer Left
Producer Top
Producer Bottom
Camera Switcher
Constraints
...
すべてのコンポーネントの表示(名前、属性、クラスの中身)
from pyfbsdk import *
for comp in FBSystem().Scene.Components:
print(comp.Name)
print(type(comp))
print(dir(comp))
print("\n")
上記に加えてプロパティ一覧を表示する場合、for文内に以下を追記。
for property in comp.PropertyList:
print("Property:" + property.Name)
▶実行結果例
Property:Show
Property:Pickable
...
(※プロパティの値を取得するには、コンポーネントがそのプロパティを持っていることを確認した上でcomp.PropertyList.Find("Show").Data等。)
選択しているすべてのコンポーネントを選択解除
from pyfbsdk import *
for comp in FBSystem().Scene.Components:
comp.Selected = False
シーン上の全てのモデルを取得
"RootModel"は"Scene"を指す
from pyfbsdk import *
for model in FBSystem().Scene.RootModel.Children:
print(model.LongName)
▶実行結果例
Aragor:Root
Cube
Cube 1
Cube 2
活用例:ジョイントのリネーム("_L"→"_MoCap_L"等)
Qiita - python motionbuilder rename joints
"Position"が含まれるコンストレイントを取得
from pyfbsdk import *
import re
ptn = re.compile("Position")
for constraint in FBSystem().Scene.Constraints:
if ptn.search(constraint.Name):
print(constraint.Name)
▶実行結果例
SwordPosition
ShieldPosition
"Position"が含まれるコンストレイントの参照元、参照先を取得する
ReferenceGet(GroupIndex, ModelIndex)を使用する
from pyfbsdk import *
import re
def get_registered_models(constraint):
result = []
for grp_i in range(constraint.ReferenceGroupGetCount()): #参照元と参照先の2グループ分
for model_i in range(constraint.ReferenceGetCount(grp_i)): #参照元?Sourceの数分
result.append(constraint.ReferenceGet(grp_i, model_i))
return result
ptn = re.compile("Position")
for constraint in FBSystem().Scene.Constraints:
if ptn.search(constraint.Name):
print(constraint.Name)
for i in get_registered_models(constraint):
print (i.FullName)
print("\n")
▶実行結果例
SwordPosition
Model::Cube 1
Model::Aragor:Head
Model::TestCube
ShieldPosition
Model::Cube 2
Model::Aragor:RightHand
6)UIの作成
・モジュールを読み込み、windowを表示
from pyfbsdk import*
from pyfbsdk_additions import*
TestWindow = FBCreateUniqueTool("TestWindow")
ShowTool(TestWindow)
7)メモ
・できることを探すためにdir()を使うと便利
8)参考リンク
公式ドキュメント Python Reference GuideSearch
デジタルフロンティアのブログ(2012年の記事) モーションビルダースクリプトTips
クリーク・アンド・リバー社のブログ(2021年の記事) 【MotionBuilder】2020 Script Tips
【★分かりやすい!】Alex ForsytheさんのMotion BuilderでのPython scriptingの動画(10年前) Python Scripting in MotionBuilder - 01 - pyfbsdk and Hello, Cubes