立体モデルの配置
< 前へ [ トップへ ] 次へ >


 起動したばかりの3D仮想空間には、まだ何もありません。今回は、3D仮想空間上に立体モデルを配置してみましょう。
 RINEARN-X 3Dでは、立体の配置はパズル感覚で非常に簡単に行えます。そしてこの操作をマスターするだけで、3D解説図の作成や結晶構造の可視化など、一般的な用途のかなりの部分を実現できるようになるでしょう。


 立体モデルの配置は add メソッドを用いる

 RINEARN-X 3Dでは、立体モデルは Model3DEG クラス及びそのサブクラスで定義されています。立体モデルを仮想空間上に配置するには、Realtime3DFrameクラスの add メソッドを使用します。

add( Model3DEG 配置する立体モデル )

 実際に立体モデルを配置してみましょう。RINEARN-X 3Dでは、球や立方体などの基本的な形状の立体モデルはあらかじめ用意されています。とりあえず何も無い空間では、まず方向や距離の感覚を掴まないといけません。そこでまずは座標軸モデルを配置してみましょう。 これもあらかじめ用意されています。


import rxvesapi.system3d.geometry.*;
import rxvesapi.system3d.renderer.*;
import rxvesapi.system3d.model.*;


public class Test{

  public static void main(String[] args){

    /*3D仮想空間を起動*/
    Realtime3DFrame frame = new Realtime3DFrame();

    /*座標軸モデル*/
    AxisModel3DEG axis = new AxisModel3DEG();

    /*仮想空間に座標軸モデルを配置*/
    frame.add( axis );

  }
}

▼実行結果


 ここで使用した AxisModel3DEG クラスは座標軸の形状をした立体モデルで、デフォルトでは原点から矢印頭部の付け根までの長さが 3 になっています。もちろんこの長さは設定可能で、ユーザーに方向感覚や距離感覚の指標を与えてくれる極めて重要なモデルです。RINEARN 3Dでの開発作業は大抵最初にこのモデルを配置する事からはじまります。


 いろいろな立体モデル

 ここで配置した座標軸モデルの他に、RINEARN-X 3Dでは以下に示したような立体モデルがあらかじめ用意されています。

形状 クラス
箱型 BoxModel3DEG
SphereModel3DEG
底付き円錐 ConeModel3DEG
底無し円錐 ShadeModel3DEG
底付き円筒 CylinderModel3DEG
底なし円筒 TubeModel3DEG
矢印 ArrowModel3DEG
座標軸 AxisModel3DEG
円盤 DiskModel3DEG
折れ線 PolylineModel3DEG
精密直線 SuperLineModel3DEG
精密四角形 SuperQuadrangleModel3DEG

 これらの立体モデルは全て Model3DEG クラスを継承して作成されています。もちろん自分で Model3D クラスを継承し、任意の形状の立体モデルを開発する事もできます。


 円筒を配置する

 立体モデルの基本的な使用方法を掴むために、例として円筒モデル CylinderModel3DEG を配置し、好みの形に変形させてみましょう。このモデルの詳しい使い方については 仕様書 を参照してください。

・まずはそのまま配置
 まずはそのまま配置してみます。色の設定に Color クラスを使用するので、java.awt.Color も import しておきましょう。


import rxvesapi.system3d.geometry.*;
import rxvesapi.system3d.renderer.*;
import rxvesapi.system3d.model.*;

import java.awt.Color;


public class Test{

  public static void main(String[] args){

    /*3D仮想空間*/
    Realtime3DFrame frame = new Realtime3DFrame();

    /*座標軸モデル*/
    AxisModel3DEG axis = new AxisModel3DEG();

    /*半径1で高さ2の直円筒モデル*/
    CylinderModel3DEG cylinder
      = new CylinderModel3DEG( 1.0, 2.0, Color.blue );

    /*配置*/
    frame.add( axis );
    frame.add( cylinder );

  }
}


▼実行結果

 このように円筒が配置されます。コンストラクタの機能を用いずに以下のように記述する事も可能です:


/*半径1で高さ2の直円筒モデル*/
CylinderModel3DEG cylinder = new CylinderModel3DEG();
cylinder.setRadius( 1.0 ); /*半径設定*/
cylinder.setHeight( 2.0 ); /*高さ設定*/
cylinder.setColor( Color.blue ); /*色設定*/


・変形させる
 RINEARN-X 3Dに標準収録されているほとんどの立体モデルは、形状を複雑に変形させる機能が用意されています。例として歪んだ円筒を配置してみましょう。


import rxvesapi.system3d.geometry.*;
import rxvesapi.system3d.renderer.*;
import rxvesapi.system3d.model.*;

import java.awt.Color;


public class Test{

  public static void main(String[] args){

    /*3D仮想空間*/
    Realtime3DFrame frame = new Realtime3DFrame();

    /*座標軸モデル*/
    AxisModel3DEG axis = new AxisModel3DEG();

    /*歪んだ円筒モデル*/
    CylinderModel3DEG cylinder
      = new CylinderModel3DEG();

    /*上面楕円半径*/
    cylinder.setUpperRadius( 1.0, 0.5 );

    /*底面楕円半径*/
    cylinder.setLowerRadius( 0.3, 2.0 );

    /*上面中心座標*/
    cylinder.setUpperCenter( 1.0, 1.0, 2.0 );

    /*色設定*/
    cylinder.setColor( Color.blue );

    /*配置*/
    frame.add( axis );
    frame.add( cylinder );

  }
}

▼実行結果

 このように歪んだ円筒が配置されます。



 立体モデルとポリゴン数

・ポリゴン数とは
 上の例で作成した歪んだ円筒モデルを様々な角度から眺めてみると、きっとおかしな事が起こるでしょう。例えば所々欠けた部位があったり、幾何学的に奇妙な形状になっている部位があると思います。この原因と対処方法を説明するには、まずポリゴン数の概念について理解する必要があります。
 まず上の例のプログラムをもう一度実行し、スペースキーを二回叩いてください。もしくはソースコードの内、Realtime3DFrameの生成部分を次のように書き換えてください。


/*3D仮想空間*/
Realtime3DFrame frame = new Realtime3DFrame();
frame.setShadingMode( frame.WIRE_FRAME_MODE );

▼実行結果

 このように、画面が全て線のみで描画されるようになりましたね。ここで使用したRealtime3DFrameクラスの setShadingMode メソッドは描画モードを設定するオプションで、WIRE_FRAME_MODE は画面を全て線で描画するモードです。プログラム実行中にスペースキーを二回叩くと描画モードが WIRE_FRAME_MODE に設定変更され、もう二回叩くと元に戻ります。
 上の図を見ると、円筒形状は多数の四角形や三角形の組み合わせで構成されている事がわかるでしょう。これはRINEARN 3Dに限った事では無く、リアルタイム3D技術の世界で広く一般的に用いられている手法です。このように立体を構成する四角形や三角形は一般にポリゴンと呼ばれ、一つの立体を構成するのに使用されるポリゴンの数はポリゴン数と呼ばれます。
 さて、先ほどの例で発生した奇妙な不具合は、実は歪んだ円筒のポリゴン数が少な過ぎる為に発生したものなのです。一般に複雑な形状ほどポリゴン数を増やす必要があります。しかしRINEARN 3Dに標準搭載されている立体モデルはシステム負荷を低く抑えるために、デフォルトでは必要最低限のポリゴン数で面を構築するように設計されています。つまり綺麗な円筒と同じポリゴン数でこのような歪んだ立体を表現するには無理があったのです。

・ポリゴン数を指定するには
 立体モデルを構成するポリゴン数は、コンストラクタの引数部分で指定する事ができます。例えば円筒モデルの場合なら、


/*円筒モデル*/
CylinderModel3DEG cylinder
= new CylinderModel3DEG( 20, 10 );

一つ目の引数で円の周囲方向のポリゴン数を、二つ目の引数で高さ方向のポリゴン数を指定します。従ってこの例では全体で 20×10 = 200 ポリゴンを使用します。
 ソースコードの円筒モデル生成部分を上のように書き換え、実行してみましょう。

▼実行結果

 今度は正しく描画されましたね。視点を操作してみてもおかしな事は起こらないでしょう。このように立体形状の複雑さに応じたポリゴン数を指定する事で、立体モデルの表示精度を最適化する事ができるのです。
 なお必要以上にポリゴン数を高く設定しても見栄えが良くなる以上のメリットは無く、無駄にメモリを消費したり処理速度を低下させたりと好ましくない結果を招きます。ハイエンドマシンを所有していて高画質を求めるような場合は別ですが、基本的には必要最低限のポリゴン数に留めるように、「 ポリゴン数の節約 」 を常に心がけましょう。例えば複雑な形状のモデルを開発する際、よく目に付く部分のポリゴン数はある程度増やしておいて、代わりに気にならない部分のポリゴン数は極限まで節約するなど工夫し、全体的にポリゴン数を削りつつも見栄えを良くできれば大変素晴らしい事です。このような意識は3Dプログラミング全般において基本的なテクニックであり、かつ大変重要なものです。

< 前へ [ トップへ ] 次へ >