MotionBuilder Scripts - Viewer切替

2024/11/10に公開

目標

Camera Switcherを使わずに、ViewerのCameraを変更する。

使用例


リストからCameraの名前を選択して、Viewerの表示を切り替え

解説

FBApplication.SwitchViewerCamera()は現在廃止されている[1]ため、FBRendererクラスを用いる。
https://help.autodesk.com/cloudhelp/2025/JPN/MOBU-PYTHON-API-REF/class_f_b_renderer.html#a9bd45402bb2313cbd52b587a80424483

このクラスはPythonからインスタンス化できない[2]ので、FBSceneクラスのRenderer属性から得る。

from pyfbsdk import FBSystem
renderer = FBSystem().Scene.Renderer


このクラスでは、Paneという語が登場する。ペインは「画面上のウィンドウを複数に分割した個々の領域」の意[3]らしい。FBRendererにおいては、Viewer内でモデルが映っている場所を指していると思われる。

GetPaneCount() で現在の画面分割数を得る。

PaneCount = renderer.GetPaneCount()


2分割されているので「2」が返される

SetPaneCount() で画面の分割数を設定する。「Get」と付くメンバ関数には、「Set」から始まる対応したメンバ関数が大抵存在する。


Paneには、Indexという概念がある。Pane毎に情報を分けるためであろうインデックスで、GetSelectedPaneIndex() で現在アクティブ(例えばViewer上でクリックされた状態)なPaneのインデックスを得る。

ActivePaneIndex = renderer.GetSelectedPaneIndex()

このインデックスは他のメンバ関数でも登場する。

  • GetCameraInPane(index)
    指定したインデックスのPaneにおいて情報を表示しているCameraの名前を得る
  • SetSchematicViewInPane(index, bool)
    指定したインデックスのPaneにてSchematic Viewの表示・非表示を切り替える。Trueで表示、Falseで非表示
  • GetSchematicViewPaneIndex()
    Schematic Viewが表示されているPaneのインデックスを得る。表示されていない場合は-1が返される。


Activeだった右側のビューをSchematic Viewerに切り替え


FBSceneクラスのCameras属性でデフォルトのProducer Cameraを得れば、SetCameraInPane(camera, index) で指定したインデックスのPaneに指定したCameraからのビューを表示できる。

# Producer Top Cameraに切り替え
ActivePaneIndex = renderer.GetSelectedPaneIndex()
renderer.SetSchematicViewInPane(ActivePaneIndex, False)
renderer.SetCameraInPane(FBSystem().Scene.Cameras[5], ActivePaneIndex)


Activeだった右側のPaneを上からのビューに切り替え


ソースコード

https://github.com/Ndgt/Mobu_PluginBase_Python/blob/master/src/Tools/SwitchingCameras.py

脚注
  1. SwitchViewerCamera() is missing in Python API in Motionbuilder ↩︎

  2. "Client code cannot instantiate objects of this class. The FBSystem and FBScene classes provide access to the current renderer." - FBRenderer Class Reference ↩︎

  3. https://e-words.jp/w/ペイン.html ↩︎

Discussion