【MotionBuilder】Python SDK 入門 第3回『Python関連のシステム』

2024/07/26に公開

この記事は、Python SDK 入門の第3回目の記事です。
今回は、MotionBuilderのPythonスクリプト環境と起動時の動作、およびmobupyの使用について説明します。

なぜPythonスクリプトが実行できたのか

Pythonをユーザーがインストールして環境構築を行ったわけではないのに、なぜMotionBuilderのPython EditorからPythonスクリプトが実行できたのでしょうか。sysモジュールのbase_prefix属性を使ってみます。

import sys
print(sys.base_prefix)
>>>
C:\Program Files\Autodesk\MotionBuilder 2025\bin\x64\python

実はMotionBuilderインストール時にPython実行ファイルも同時にインストールされています。


MotionBuilderフォルダー下に位置するPython

Python EditorではこのPython実行ファイルがUIから利用できるようになったもの、と捉えるとよいでしょう。また、上記のPython実行ファイルと同じパス下にはいつも最初の宣言で登場するpyfbsdkモジュール(上画像のpyfbsdk.pyd)があります。さらに、Python Editorの最初に表示されているのは、インストールされているそのPythonのバージョンです。以下のようにして確認できます。

import sys
print(sys.version)
>>>
'3.11.4 (tags/v3.11.4:d2340ef, Jun  7 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)]'


MotionBuilder起動時の動作

At start up, MotionBuilder runs Python scripts in the following order:
- Running Python Scritps

MotionBuilderは起動時に特定のパス下にあるPythonスクリプトを実行します。実行されるファイルとその順序は上記リンクを参照してください。起動時のスクリプトの実行の様子を確認するには、以下のコマンドをターミナルから実行します。

motionbuilder.exe -console -verbosePython

-consoleオプションをmodeを指定せず用いると新たな出力windowが作成され、-verbosePythonフラッグによってPythonスクリプトに関する出力をこのwindowに表示させることができます。ただし、このwindowを閉じると起動したMotionBuilderも閉じられてしまうので注意してください。

起動と同時にスクリプトを実行する

起動時に特定のパス下のスクリプトが実行されることを利用し、例えば以下を実装できます。

  • from pyfbsdk import*を予め宣言
  • ドキュメントの起動
  • UIの追加(第9回で触れます)
test_Startup.py
# -*- coding: utf-8 -*-
# 起動時にpyfbsdkモジュールのインポートとドキュメントの起動を行う

from pyfbsdk import*
print(FBModelCube)

import webbrowser
webbrowser.open("https://help.autodesk.com/view/MOBPRO/2025/ENU/?guid=MOBU_PYTHON_API_REF_index_html")

print("\ntest_Startup.py was executed.")

上記スクリプトを<user>\Documents\MB\<version>\config\PythonStartupに保存し、MotionBuilderを起動します。


起動と同時に表示されたドキュメントと出力


コンソールへの出力

これを応用すると、作成したツール等を起動時に表示・またはメニューに追加できるため、プラグインと同様の挙動をPythonで実現することができます。そのようなスクリプトを開発する上での動作チェックとしてコマンドラインからのmotionbuilder.exe -console -verbosePythonの実行が役立つのです。

補足

motionbuilder.exeという実行ファイルはC:\Program Files\Autodesk\MotionBuilder 2025\bin\x64に位置していますが、pcのpath環境変数を調べると確かにこのパスが登録されていることが確認できるはずです。また、次章で解説するmobupyもmotionbuilder.exeと同じパス下に位置するため、これもコマンドラインから使用することができます。
motoinbuilder.exeのコマンドラインでの実行についてはこちらを参照してください。


mobupyと外部パッケージの利用

この記事の最初で「MotionBuilderインストールと同時にPython実行ファイルもインストールされる」と書きましたが、これとは別にmobupyという実行ファイルもインストールされています。

MotionBuilder comes with its own external Python interpreter, mobupy.
mobupy is useful for batch processing and for accessing MotionBuilder's libraries from another application.
...
mobupy can also be used to install Python packages using the pip package management system.
- The MotionBuilder Python interpreter, mobupy

独自のPythonの外部インタプリタとのことで、pipによるパッケージのインストールが行えます。ただし、コマンド実行時は管理者権限が必要です(参考)。外部パッケージの例としてmediapipeを利用してみます。

# ターミナルにて管理者権限で実行
mobupy -m pip install mediapipe

# Python Editorで実行
from pyfbsdk import*

import cv2
import mediapipe as mp
mp_pose = mp.solutions.pose
mp_drawing = mp.solutions.drawing_utils
pose = mp_pose.Pose(static_image_mode = True, min_detection_confidence = 0.5)

img_path = "C:/Posture.png" # Tポーズをした自身の画像
img = cv2.imread(img_path)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = pose.process(img_rgb)

if results.pose_landmarks:
    for id, lm in enumerate(results.pose_landmarks.landmark):
        h, w, c = img.shape
        lx, ly = int(lm.x * w), int(lm.y * h)
        print(f"Landmark {id}: ({lx}, {ly})")
        m = FBModelMarker(f"Landmark {id}")
        # OpenCVにおいて画像下側が正であるため"-ly"にする
        m.Translation = FBVector3d(lx, -ly, 0)
        m.Show = True 
        m.Scaling = FBVector3d(5,5,5)

Tポーズをした自身の画像から、各landmarkの位置をFBModelMarkerで再現しました。

実行結果


Python Telnet Console

蛇足とは思いますが一応紹介しておきます。Python Telnet ConsoleはMotionBuilderと接続されたtelnetコンソールです。Python Editor上部のアイコンをクリックして起動します。


Python Editorとtelnet consoleのアイコン


起動されたtelnet console

モジュールのインポートを行わなくともスクリプトが実行できます。


telnet consoleでのスクリプトの実行

さらにMotionBuilderが開いた状態で、telnet <host_name> 4242をターミナル等で実行すれば同様にスクリプトの実行が可能です。

次回

今回は、Pythonに関係するMotionBuilderのシステムについて解説しました。次回は、MotionBuilderの内部(SDK)の概念について解説します。

https://zenn.dev/nadegata_memo/articles/1dcde336812ddd

それでは、今回はここまで。最後までお読みくださりありがとうございました。

Discussion