Immediate Mode


Immediate Mode についての解説です。

Immediate Mode とは / 基本処理 / GraphicsContext3D / 戻る / トップページ


Immediate Mode とは

Immediate Mode は 1 つの物体の表示などの 簡単な機能のみが用意されていて、 プログラマーはそれを使って複雑な処理を書いていく方法です。 描画タイミングの制御など最も融通が利きますが、 最もプログラマーに負担のかかる方法でもあります。 自分でレンダリングエンジンを書きたい人は このモードを使いましょう。
 
Immediate Mode のレンダリング方法にも 2 種類あります。 Pure Immediate-Mode Rendering と Mixed-Mode Rendering です。
 
Mixed-Mode Rendering は Immediate Mode と Retained Mode (Compiled-Retained Mode) を混合した使い方です。 描画タイミングを制御した Retained Mode と思ってくれればいいです。 詳しい解説は割愛します。
 
Pure Immediate-Mode Rendering が本当の意味での Immediate Mode です。 以下の解説では Pure Immediate-Mode Rendering について書きます。

基本処理

まず、Canvas3D オブジェクトに対して stopRenderer() メソッドを使って 画面の自動更新を停止させておきます。 次に getGraphicsContext3D() メソッドで GraphicsContext3D オブジェクトを取得します。
	Canvas3D canvas=new Canvas3D(null);
	SimpleUniverse universe=new SimpleUniverse(canvas);
	
	canvas.stopRenderer();
	universe.getViewingPlatform().setNominalViewingTransform();	// 視点を適当な位置に設定
	
	GraphicsContext3D g=canvas.getGraphicsContext3D();
SimpleUniverse については SceneGraph の解説をご覧ください。
 
Canvas3D,GraphicsContext3D オブジェクトは それまでの AWT の Canvas,Graphics オブジェクトに 対応するものと考えてください。 つまり AWT の Canvas オブジェクトへの描画と同じように GraphicsContext3D オブジェクトを使って Canvas3D オブジェクトへの描画が行えます (peer の確定問題は気にしなくてよいようです)。
 
ただし、3 次元のためにしなければならない処理も多少増えます。 ダブルバッファリング処理が標準で使われています。 基本的には次のような流れになります。
 
始めに GraphicsContext3D オブジェクトに対して clear() メソッドでバッファ画面をきれいにします。 次に setModelTransform メソッドなどで表示する物体の座標などを設定 (詳細は 後述 します)、 draw(Geometry geometry) メソッドでバッファに物体を描画する処理を 表示したいだけします。 最後に Canvas3D#swap() メソッドでバッファに描かれた絵を 画面に表示します。
	Transform3D translation=new Transform3D();
	Transform3D rotation=new Transform3D();
	
	translation.setTranslation(new Vector3d(0.0,1.0,0.0));
	rotation.rotX(Math.PI/4.0);
	
	g.clear();
	g.setModelTransform(translation);
	g.draw(new ColorCube());	// 座標 (0.0,1.0,0.0) に色付き立方体の描画
	g.setModelTransform(rotation);
	g.draw(new ColorCube());	// x 軸を中心に 45°回転した色付き立方体の描画
	canvas.swap();
ColorCube 以外の物体を表示する場合は GraphicsContext3D オブジェクトに対して setAppearance(Appearance appearance) メソッドを使い、 Appearance オブジェクトを設定する必要があります。
	Appearance appearance=new Appearance();
	
	g.clear();
	g.setAppearance(appearance);
	g.draw(new Sphere().getShape());	// 球
	canvas.swap();

戻る