Framework シーン

\includegraphics[width=.9\hsize ]{fig/fwscene.eps}
Fig.  : Data structure of Framework, Physics and Graphics modules

Frameworkモジュールの主な機能の1つにPhysicsシーンとGraphicsシーンの同期があります. Fig. #.#.#に3つのモジュールのSDKとシーンの関係を示します. FWSdkは任意の数のシーン(FWSceneクラス)を保持します. また,シーンは任意の数のオブジェクト(FWObjectクラス)を保持します. Fig. #.#.#に示すように, オブジェクトはPhysicsモジュールの剛体とGraphicsモジュールのトップフレームを一対一に対応づけます. ここでトップフレームとはワールドフレームの直下にあるフレームのことです. 物理シミュレーションにより計算される剛体の運動をフレームの座標変換に反映させることで, シミュレーションの様子をGraphicsモジュールの機能を利用して可視化することができるようになります.

シーン作成に関するFWSdkの関数を以下に示します.

HITrackballIf

FWSceneIf* CreateScene(const PHSceneDesc&, const GRSceneDesc&)

シーンを作成する.

int NScene()

シーンの数を取得する

FWSceneIf* GetScene(int i)

i番目のシーンを取得する.

void MergeScene(FWSceneIf* scene0, FWSceneIf* scene1)

scene1の子オブジェクトをscene0に移す.

シーンを作成するには以下のようにします.

FWSceneIf* fwScene = fwSdk->CreateScene();

FWSceneを作成すると,同時にPHSceneGRSceneも作成され,FWSceneとリンクされます. CreateSceneにディスクリプタを指定することもできます. NSceneは作成したシーンの数を返します.

シーンを取得するにはGetSceneを使います. GetSceneに指定する整数は作成された順番にシーンに与えられる通し番号です.

fwSdk->CreateScene();               // create two scenes
fwSdk->CreateScene();
FWSceneIf *fwScene0, *fwScene1;
fwScene0 = fwSdk->GetScene(0);      // get 1st scene
fwScene1 = fwSdk->GetScene(1);      // get 2nd scene

MergeSceneを使うと2つのシーンを統合して1つのシーンにできます.

fwSdk->MergeScene(fwScene0, fwScene1);

上のコードではscene1が持つFWObjectscene0に移され,同時にシーンが参照する PHSceneGRSceneに関してもそれぞれのMergeScene関数により統合が行われます.

次に,FWSceneの基本機能を以下に示します.

FWSceneIf

void SetPHScene(PHSceneIf*)

Physicsシーンの設定

PHSceneIf* GetPHScene()

Physicsシーンの取得

void SetGRScene(GRSceneIf*)

Graphicsシーンの設定

GRSceneIf* GetGRScene()

Graphicsシーンの取得

FWObjectIf* CreateFWObject()

オブジェクトの作成

int NObject()const

オブジェクトの数

FWObjectIf** GetObjects()

オブジェクト配列の取得

void Sync(bool)

同期

[Set][PH]Scene関数はシーンに割り当てられたPHSceneGRSceneを取得したり,別のシーンを割り当てたりするのに使用します.

CreateFWObject関数はFWObjectオブジェクトを作成します. このとき,新たに作成されたFWObjectにはPHSolidおよびGRFrameは割り当てられていない状態になっているので注意してください. これらも同時に作成するには,以下のコードを1セットで実行します.

FWObjectIf* fwObj = fwScene->CreateFWObject();
fwObj->SetPHSolid(fwScene->GetPHScene()->CreateSolid());
fwObj->SetGRFrame(
    fwScene->GetGRScene()->CreateVisual(GRFrameDesc())->Cast);

Sync関数はPHSceneGRSceneの同期に用います.

fwScene->Sync(true);

とすると,このシーンが参照するPHScene中の剛体の位置と向きが, 同じくこのシーンが参照するGRScene中のトップフレームの位置と向きに反映されます. このときの剛体とトップフレームとの対応関係はFWObjectにより定義されます.

逆に

fwScene->Sync(false);

とすると,同様のメカニズムで各トップフレームの位置と向きが対応する剛体に反映されます.