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は描画バッファを所定の色で塗りつぶします. 塗りつぶし色の取得/設定はGRRenderのGetClearColor,SetClearColorを使います.
render->SetClearColor(Vec4f(1.0f, 0.0f, 0.0f, 1.0f)); render->ClearBuffer(); // clear back buffer in red
BeginSceneとEndSceneはシーンの描画の前後で必ず呼び出します. SwapBuffersはフロントバッファとバックバッファを切り換えることで描画内容を画面上に表示します.
GRSceneのRender関数は,カメラ(GRCamera)のRenderとワールドフレーム(GRFrame)のRenderを 順次呼び出します.まずカメラの描画によって視点と投影変換が設定され, 次にワール ドフレームの描画によってシーングラフが再帰的に描画されます.