Springhead Users Manual

8.3 シーン

シーンの作成

Graphicsモジュールのシーンは,コンピュータグラフィクスにおけるいわゆるシーングラフと同等のものです. シーンクラスはGRSceneです. シーンを作成するには次のようにします.


     GRSceneIf* grScene = grSdk->CreateScene();

GRSceneはディスクリプタによる設定項目を持ちません. また,Fig. 8.1に示すようにGRSdkオブジェクトは任意の数のシーンを保持できます.

シーン作成に関するGRSdkの関数は以下の通りです.

GRSdkIf

GRSceneIf*

CreateScene()

シーンを作成

GRSceneIf*

GetScene(size_t)

シーンを取得

size_t

NScene()

シーンの数

void

MergeScene(GRSceneIf*, GRSceneIf*)

シーンの統合

Fig. 8.1: Graphics data structure

シーンの機能

シーンを作成したら,次はそのコンテンツであるフレームやメッシュ,カメラやライトなどを作成してシーンに加えていきます. この方法としては完全に手動でシーンを構築する他にもFileIOモジュールを使用してファイルからシーンをロードする方法もあります. 以下 にGRSceneの関数を示します.

GRSceneIf

GRFrameIf*

GetWorld()

ワールドフレームの取得

GRCameraIf*

GetCamera()

カメラの取得

void

SetCamera(const GRCameraDesc&)

カメラの設定

GRVisualIf*

CreateVisual(const GRVisualDesc&, GRFrameIf*)

描画アイテムの作成

void

Render(GRRenderIf*)

描画

Fig. 8.1に示すように,1つのシーンはただ1つのワールドフレームを持ち,それを基点として 任意の数の描画アイテムがツリー状に連なります. ワールドフレームはGetWorldで取得します.

特殊な描画アイテムにカメラがあります. カメラはワールドフレーム以下のツリーとは別に,GRSceneが保持します(Fig. 8.1). カメラの設定はSetCameraで行います. カメラを取得す るにはGetCameraを使います. また,カメラはシーングラフ中の1つのフレームを参照し,これを視点の設定に用います. イメージとしてはカメラが参照先のフレームに取り付けられていると考える方が自然でしょう. 参照先のフレームの移動に応じてカメラ もシーン中を移動することになります.

シーンの描画

描画処理はプログラムの描画ハンドラで行います.GLUTを使う場合はglutDisplayFuncで登録したコールバック関数がこれにあたり, またFrameworkモジュールのFWAppを使う場合はDisplay仮想関数がこれにあたります. 以 下が典型的な描画処理です.


     render->ClearBuffer();      // clear back buffer
     render->BeginScene();       // begin rendering


     grScene->Render(render);    // render scene


     render->EndScene();         // end rendering
     render->SwapBuffers();      // swap buffers

ClearBufferは描画バッファを所定の色で塗りつぶします. 塗りつぶし色の取得/設定はGRRenderGetClearColor,SetClearColorを使います.


     render->SetClearColor(Vec4f(1.0f, 0.0f, 0.0f, 1.0f));
     render->ClearBuffer();                 // clear back buffer in red

BeginSceneEndSceneはシーンの描画の前後で必ず呼び出します. SwapBuffersはフロントバッファとバックバッファを切り換えることで描画内容を画面上に表示します.

GRSceneRender関数は,カメラ(GRCamera)のRenderとワールドフレーム(GRFrame)のRenderを 順次呼び出します.まずカメラの描画によって視点と投影変換が設定され, 次にワール ドフレームの描画によってシーングラフが再帰的に描画されます.