JMPのすべての表示(詳細については、「表示ツリー」章(465ページ)を参照)と同様に、3Dシーンもディスプレイボックス(この場合は、シーンボックス)に配置する必要があります。その後で、そのシーンボックスをウィンドウに配置します。したがって、簡単な3Dシーンのスクリプトは、次のようになります。
myScene = Scene Box(300, 300); // 300 x 300ピクセルのシーンボックスを作成する
...(シーンをセットアップするコマンド)...
New Window("3Dシーン", myScene); // シーンをウィンドウに描画する
...(シーンを操作するコマンド)
図13.2 シーンの作成
scene = Scene Box( 400, 400 ); // Scene Boxを作成する
New Window( "例1", scene ); // シーンをウィンドウに配置する
scene << Perspective( 45, 3, 7 ); // カメラを定義する
scene << Translate( 0.0, 0.0, -4.5 ); // (0,0,-4.5)に移動して描画する
scene << Color( 1, 0, 0 ); // テキストのRGB色を設定する
scene << Text( center, baseline, 0.2, "Hello, World." ); // テキストを追加する
scene << Update; // シーンを更新する
最初の2行で、シーンを作成し、ウィンドウに配置します。Perspectiveコマンドは、表示角度と被写界深度を定義します。このコマンドをメッセージとしてシーンに送ると、ただちにシーンの表示リストに追加されます。「Hello World」テキストは原点(0, 0, 0)に描画されるので、Translateコマンドを表示リストに追加し、原点が視野に入るようにカメラを少し後方に移動します。Colorコマンドで色を赤に設定し、テキストを描画し、Updateコマンドでシーンをレンダリングします。これで、コマンドを含む表示リストが描画されます。
図13.3 Hello World
同様に、表示を作成するコマンドを、グローバル変数に格納されている表示リストに累積させた後で、一度にシーンに送ることができます。グローバル変数を表示リストとして定義するには、Scene Display List関数を使って表示リストを割り当てます。たとえば、グローバル変数のgreetingを表示リストとして使うには、次のコマンドを実行します。
greeting=Scene Display List();
この後で、表示コマンドをメッセージとしてgreetingに送ることができます。次の例では、表示リストを使って「Hello World」を描画します。
greeting = Scene Display List();
greeting << Color( 1, 0, 0 ); // テキストのRGB色を設定する
greeting << Text( center, baseline, 0.2, "Hello, World." ); // テキストを追加する
// ウィンドウを描画して、保存済みの表示リストを送る
scene = Scene Box( 400, 400 ); // Scene Boxを作成する
New Window( "例1", scene ); // シーンをウィンドウに配置する
scene << Perspective( 45, 3, 7 ); // カメラを定義する
scene << Translate( 0.0, 0.0, -4.5 ); // (0,0,-4.5)に移動して描画する
scene << Call List( greeting ); // 表示リストをシーンに送る
scene << Update; // シーンを更新する
どのコマンドが別個に表示リストに移されたか、どのコマンドがシーンに直接適用されたかに注意してください。カメラを操作するコマンド(PerspectiveおよびTranslate)は、シーンに適用されています。オブジェクトを定義するコマンド(ColorおよびText)は、表示リストに移されました。こうしておけば、その表示リストを何回でも呼び出して、同じオブジェクトを異なる位置に複製できます。