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を作成すると,同時にPHSceneとGRSceneも作成され,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が持つFWObjectがscene0に移され,同時にシーンが参照する PHSceneとGRSceneに関してもそれぞれの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関数はシーンに割り当てられたPHSceneやGRSceneを取得したり,別のシーンを割り当てたりするのに使用します.
CreateFWObject関数はFWObjectオブジェクトを作成します. このとき,新たに作成されたFWObjectにはPHSolidおよびGRFrameは割り当てられていない状態になっているので注意してください. これらも同時に作成するには,以下のコードを1セットで実行します.
FWObjectIf* fwObj = fwScene->CreateFWObject(); fwObj->SetPHSolid(fwScene->GetPHScene()->CreateSolid()); fwObj->SetGRFrame( fwScene->GetGRScene()->CreateVisual(GRFrameDesc())->Cast);
Sync関数はPHSceneとGRSceneの同期に用います.
fwScene->Sync(true);
とすると,このシーンが参照するPHScene中の剛体の位置と向きが, 同じくこのシーンが参照するGRScene中のトップフレームの位置と向きに反映されます. このときの剛体とトップフレームとの対応関係はFWObjectにより定義されます.
逆に
fwScene->Sync(false);
とすると,同様のメカニズムで各トップフレームの位置と向きが対応する剛体に反映されます.