3DCGプログラミングを行うには、グラフィックスデータやレンダラー(描画エンジン)、表示画面などが最低限必要となります。ここでは、それら必須基盤の準備を一括して行います。
まず、3DCGの描画内容を保持しておくデータ領域 (イメージ、バッファ、コンテキストなど)が必要です。 これらはVCSSLではまとめて「グラフィックスデータ」として扱います。 詳細は2DCGで述べた通りです。グラフィックスデータは、 GraphicsライブラリのnewGraphics関数で生成できます。
- 関数の形式 -
この関数は、空白のグラフィックスデータ領域を確保し、 それに固有のグラフィックスデータID(識別番号)を割り振って返します。
続いて、グラフィックスデータに 3DCG映像を描き込むレンダラー(描画エンジン)も生成します。 これにはnewGraphics3DRenderer関数を使用します。
- 関数の形式 -
引数は以下の通りです:
この関数は、3DCG描画機能を持つレンダラーを生成し、 それに固有のレンダラーIDを返します。 これ以降、様々な3DCGの制御関数を扱いますが、 その引数にこのレンダラーIDを指定します。
3DCGレンダラーは生成したままの状態でも使用できますが、 必要に応じて各種設定を行いましょう。 生成後によく行う設定としては、以下のようなものが挙げられます。 加えて、毎回必ず使用する基本操作についても挙げておきます。
背景色を設定するには、setGraphics3DColor 関数を使用します。
- 関数の形式 -
引数は以下の通りです:
RGBA形式とは、色の三原色である赤(Red)、緑(Green)、青(Blue)の色成分に、アルファ値(Alpha)を加えた形式です。アルファ値は色の透明度を表す数値で、0で完全透明になり、最大にすると不透明になります。
それぞれの色成分からの色の合成は、加法混色によって行われます。これは光の重ね合わせと同じ混色方式であり、絵の具の混ぜ合わせ(減法混色)では無い事にご注意ください。例として:
表示倍率を設定するには、setGraphics3DMagnification 関数を使用します。
- 関数の形式 -
引数は以下の通りです:
なお、表示倍率とカメラ距離の設定はワンセットですが、 カメラ距離の設定については、後の章で扱う座標系の操作を用います(ワールド座標系を移動させる)。
レンダラーを駆動させて、グラフィックスデータに3DCG映像を描画するには、 paintGraphics3D 関数を使用します。
- 関数の形式 -
引数は以下の通りです:
3DCGの基本的な処理は、まず全ての立体などを配置登録し、 続いて位置や角度などを調整し、そして描画を行うといった流れとなります。 この描画のタイミングで、このpaintGraphics3D関数をコールします。
これまでに述べた事項だけで、3DCGの描画は可能です。 しかし実用上は、その描画結果を何らかの形で出力する必要があります。 最も一般的なのが、表示画面に直接グラフィックスを表示する形態でしょう。
実際に800×600サイズの表示画面を生成するには、プログラム中で以下のように記述します。
// 表示画面の生成( graphicsIDは画面表示するグラフィックスデータのID )
int windowID = newWindow( 0, 0, 800, 600, " Hello 3DCG ! " );
int labelID = newImageLabel( 0, 0, 800, 600, graphicsID );
mountComponent( labelID, windowID );
NewWindow.vcssl
こういったGUIの制御に関する詳しい解説は、ここでは割愛します。 詳しくはVCSSL GUIライブラリのガイドをご参照ください。 とりあえず、上記のように即席の表示画面でも、これから扱う3DCGの内容は十分にこなせます。 より高度な表示画面を工夫するのでなければ、これだけで十分です。
グラフィックスデータは、画面に表示するだけでなく、 Graphicsライブラリの exportGraphics 関数を使用し、 BMP/PNG/JPEG形式の画像ファイルに出力する事も可能です。
- 関数の形式 -
引数は以下の通りです:
それでは実際にウィンドウを生成し、3DCGを画面に表示してみましょう。 ついでに、「Test.png」という名前のPNG形式画像ファイルにも出力してみます。 以下のようにプログラムを記述し、実行してみてください。
import Graphics;
import Graphics3D;
import GUI;
// グラフィックスデータと3DCGレンダラーの生成
int graphicsID = newGraphics( );
int rendererID = newGraphics3DRenderer( 800, 600, graphicsID );
// 表示画面の生成
int windowID = newWindow( 0, 0, 800, 600, " Hello 3DCG ! " );
int labelID = newImageLabel( 0, 0, 800, 600, graphicsID );
mountComponent( labelID, windowID );
setGraphics3DColor( rendererID, 0, 0, 0, 255 ); // 背景色を黒に設定
paintGraphics3D( rendererID ); // 3DCGを描画
// GUIの再描画
paintComponent( labelID );
paintComponent( windowID );
// 画像をファイルに出力する場合は、下の行のコメントアウトを外してください
//exportGraphics( graphicsID, "Test.png", "PNG" );
Sample.vcssl
このプログラムを実行すると、ウィンドウが立ち上がり、真っ黒な画面が表示されます。 何も表示されていないように見えるのは、 単にまだ立体を配置していないからであって、紛れも無く3D仮想空間が見えています。