MotionBuilderコールバック関数のちょっといい話し

Autodesk Developer Networkの工藤 暁です。今回はAutodesk® MotionBuilder®にてTipsになる様な御質問に頂きましたので此方にて御紹介させて頂きます。

MotionBuilderにてコールバック関数を登録した際に、マニュアルで行った際にはコールバック関数が呼び出されるが、APIにて同様の操作を行うとコールバック関数が呼び出されないという現象を経験された事はないでしょうか。

例えば下記様なスクリプトにて、コールバック関数を登録し、カメラを作成します。

 

<code_begin>

from pyfbsdk import *

 

#———– カメラ作成———————————-

lExportCamera = FBCamera("ExportCamera")

 

#———– コールバック関数———————————-

def SceneChanged(scene, event):

    if event.Type == FBSceneChangeType.kFBSceneChangeDetach:

        if event.ChildComponent != None and event.ChildComponent.Is(FBCamera_TypeInfo()):

            if event.ChildComponent.Name == "ExportCamera":           

                print event.ChildComponent.Name

                print event.Type

                               

#———– コールバック関数登録———————————-

FBSystem().Scene.OnChange.Add(SceneChanged)

<code_end>

 

これを実行し、マニュアル操作にてスクリプトにて作成したカメラを削除します。削除の際にPythonのコンソールには下記の様に、このイベントに関連するオブジェクト名とイベント名が表示されます。

 

ExportCamera

kFBSceneChangeDetach

 

次に下記様なスクリプトにて、カメラを作成後にAPIにてそのカメラを削除します。

 

<code_begin>

from pyfbsdk import *

 #———– カメラ作成———————————-

lExportCamera = FBCamera("ExportCamera")

 #———– カメラ削除———————————-

for lCamera in FBSystem().Scene.Cameras:

    if lCamera.Name == "ExportCamera":

        lCamera.FBDelete()      

<code_end>

ここでマニュアル操作にてコールバック関数にて表示された、イベントに関連するオブジェクト名とイベント名が表示される事を期待するのですが、実際は表示されません。

ではAPIにて削除するとシステムはどの様な動作をするのでしょうか。

初めにSDKオブジェクトにバインドされたシステムオブジェクトをデタッチしてからコールバック関数が呼び出されます、この時未だSDKオブジェクトは削除されていません。

よって、下記の様にコールバック関数を修正すると、呼び出された事を確認できますが、オブジェクト名はデタッチの影響により表示されません。

<code_begin>

def SceneChanged(scene, event):

    if event.Type == FBSceneChangeType.kFBSceneChangeDetach:

        if event.ChildComponent != None and event.ChildComponent.Is(FBCamera_TypeInfo()):

            print event.ChildComponent.Name

            print event.Type

<code_end>

Capture2

何かのお役に立てば幸いです。


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading