構造物モデルの開発
< 前へ [ トップへ ] 次へ >

 立体構造がある程度複雑になってくると、ポリゴンの位置把握が困難になるため、一つの立体モデルクラスで開発するのが難しくなってきます。またそのような開発方法は、基本的な構造は同じで一部のみが異なる、バリエーションモデルを表現するのにも面倒です。そこでRINEARN-X 3Dでは、立体モデルクラスの他に、立体モデルクラスの集合で構成される構造物モデルというものがあります。
 ここでは構造体モデルの開発方法を紹介しましょう。


 構造物モデル

・構造物モデルは立体モデルの集合

 構造物モデルは多数の立体モデルの集合で表現されています。この立体モデル集合は Structure3DEG クラス中に model という名称のフィールドに定義されています。フィールドの型は立体モデルクラス型( Model3DEG型 )であり、球モデルである SphereModel3DEG クラスをはじめ全ての立体モデルクラスを代入できます構造物モデルのモデリング作業は非常にシンプルな仕組みで、Structure3DEGクラスを継承してこの model という配列にポリゴンを代入していけば良いだけです。たったそれだけで、構造物モデル全体の色設定や材質設定、平行移動や回転などの便利なメソッドが利用可能になります。


 開発
 それでは例として、レーシングバイクの形をした構造物モデルを開発してみましょう。


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


import java.awt.*;


public class MotorCycle extends Structure3DEG{

    private Color bikeColor = Color.blue;

    public MotorCycle(){
      this.make();
    }
    public MotorCycle( Color color ){
      this.bikeColor = color;
      this.make();
    }





    public void make(){



      this.model = new Model3DEG[19];

      /*フロントタイヤ*/
      SphereModel3DEG f_tire
       = new SphereModel3DEG(12, 20, 0, 6, 12, 14 );
      f_tire.setRadius(0.45,0.45,0.2);
      f_tire.setColor(Color.darkGray);
      f_tire.move(1.0,0.0,0.0);
      f_tire.rotX( Math.PI*0.5d );
      model[0] = f_tire;

      /*フロントホイール*/
      TubeModel3DEG f_wheel
       = new TubeModel3DEG( 12, 1 );
      f_wheel.setFace(false);
      f_wheel.setRadius(0.4);
      f_wheel.setHeight(0.2);
      f_wheel.move(1.0,0.0,-0.1);
      f_wheel.setColor(Color.black);
      f_wheel.rotX( Math.PI*0.5d );
      model[1] = f_wheel;

      /*リアタイヤ*/
      SphereModel3DEG r_tire
       = new SphereModel3DEG(12, 20, 0, 6, 12, 14 );
      r_tire.setRadius(0.45,0.45,0.3);
      r_tire.setColor(Color.darkGray);
      r_tire.move(-1.0,0.0,0.0);
      r_tire.rotX( Math.PI*0.5d );
      model[2] = r_tire;

      /*リアホイール*/
      TubeModel3DEG r_wheel
       = new TubeModel3DEG( 12, 1 );
      r_wheel.setFace(false);
      r_wheel.setRadius(0.4);
      r_wheel.setHeight(0.3);
      r_wheel.move(-1.0,0.0,-0.15);
      r_wheel.setColor(Color.black);
      r_wheel.rotX( Math.PI*0.5d );
      model[3] = r_wheel;

      DiskModel3DEG f_disk_r
       = new DiskModel3DEG( 0.27, Color.lightGray );
      f_disk_r.rotX( Math.PI*0.5d );
      f_disk_r.move( 1.0, -0.1, 0.0 );
      model[4] = f_disk_r;

      /*フロントディスクブレーキ*/
      DiskModel3DEG f_disk_l
       = new DiskModel3DEG( 0.27, Color.lightGray );
      f_disk_l.setFace(false);
      f_disk_l.rotX( Math.PI*1.5d );
      f_disk_l.move( 1.0, 0.1, 0.0 );
      model[5] = f_disk_l;

      /*リアディスクブレーキ*/
      DiskModel3DEG r_disk_r
       = new DiskModel3DEG( 0.2, Color.lightGray );
      r_disk_r.rotX( Math.PI*0.5d );
      r_disk_r.move( -1.0, -0.1, 0.0 );
      model[6] = r_disk_r;

      /*リアディスクブレーキ*/
      DiskModel3DEG r_disk_l
       = new DiskModel3DEG( 0.2, Color.lightGray );
      r_disk_l.setFace(false);
      r_disk_l.rotX( Math.PI*1.5d );
      r_disk_l.move( -1.0, 0.1, 0.0 );
      model[7] = r_disk_l;

      /*リアサスペンションアーム*/
      BoxModel3DEG r_sus =
      new BoxModel3DEG(0.24,0.3,0.1,0.2,0.8,Color.lightGray);
      r_sus.rotY( -2.0d );
      r_sus.move( -0.23, 0.0, 0.3 );
      model[8] = r_sus;

      /*フロントサスペンションフォーク*/
      BoxModel3DEG f_sus_r
       = new BoxModel3DEG( 0.1,0.1,0.60, Color.black );
      f_sus_r.rotY( -0.2d );
      f_sus_r.move( 1.0, 0.2, 0.22 );
      model[9] = f_sus_r;

      /*フロントサスペンションフォーク*/
      BoxModel3DEG f_sus_l
       = new BoxModel3DEG( 0.1,0.1,0.60, Color.black );
      f_sus_l.rotY( -0.2d );
      f_sus_l.move( 1.0, -0.2, 0.22 );
      model[10] = f_sus_l;

      /*シートカウル(後端部)*/
      BoxModel3DEG seat
       = new BoxModel3DEG(0.20,0.3,0.05,0.1,0.8,bikeColor);
      seat.rotY( -1.0d );
      seat.move( -0.45, 0.0, 0.8 );
      model[11] = seat;

      /*シートカウル(座席部)*/
      BoxModel3DEG seat2
       = new BoxModel3DEG(0.1,0.18,0.2,0.2,0.22,Color.black);
      seat2.move( -0.33, 0.0, 0.6 );
      model[12] = seat2;

      /*ガソリンタンク*/
      BoxModel3DEG tank
       = new BoxModel3DEG(0.30,0.3,0.4,0.2,0.7,bikeColor);
      tank.rotY( -1.2d );
      tank.move( 0.5, 0.0, 0.5 );
      model[13] = tank;

      /*ヘッドカウル*/
      BoxModel3DEG head
       = new BoxModel3DEG(0.05,0.2,0.3,0.4,0.7,bikeColor);
      head.rotY( -1.0d );
      head.move( 1.3, 0.0, 0.48 );
      model[14] = head;

      /*サイドカウル右外面*/
      TubeModel3DEG side_r
       = new TubeModel3DEG( 12, 1, 0, 0, 4, 1 );
      side_r.setLowerRadius( 0.7, 0.52 );
      side_r.setUpperRadius( 0.7, 0.34 );
      side_r.setUpperCenter( -0.5, 0.0, 0.7 );
      side_r.setColor(bikeColor);
      side_r.rotY(2.2);
      side_r.move( -0.19, 0.0, 0.31 );
      model[15] = side_r;

      /*サイドカウル左外面*/
      TubeModel3DEG side_l
       = new TubeModel3DEG( 12, 1, 8, 0, 12, 1 );
      side_l.setLowerRadius( 0.7, 0.52 );
      side_l.setUpperRadius( 0.7, 0.34 );
      side_l.setUpperCenter( -0.5, 0.0, 0.7 );
      side_l.setColor(bikeColor);
      side_l.rotY(2.2);
      side_l.move( -0.19, 0.0, 0.31 );
      model[16] = side_l;

      /*サイドカウル右内面*/
      TubeModel3DEG side_r_rev
       = new TubeModel3DEG( 12, 1, 0, 0, 4, 1 );
      side_r_rev.setLowerRadius( 0.7, 0.52 );
      side_r_rev.setUpperRadius( 0.7, 0.34 );
      side_r_rev.setUpperCenter( -0.5, 0.0, 0.7 );
      side_r_rev.setColor(bikeColor);
      side_r_rev.setFace(false);
      side_r_rev.rotY(2.2);
      side_r_rev.move( -0.19, 0.0, 0.31 );
      model[17] = side_r_rev;

      /*サイドカウル左内面*/
      TubeModel3DEG side_l_rev
       = new TubeModel3DEG( 12, 1, 8, 0, 12, 1 );
      side_l_rev.setLowerRadius( 0.7, 0.52 );
      side_l_rev.setUpperRadius( 0.7, 0.34 );
      side_l_rev.setUpperCenter( -0.5, 0.0, 0.7 );
      side_l_rev.setColor(bikeColor);
      side_l_rev.setFace(false);
      side_l_rev.rotY(2.2);
      side_l_rev.move( -0.19, 0.0, 0.31 );
      model[18] = side_l_rev;

    }

}

 それでは、この構造物モデルを Test.JAVA から呼び出し、配置してみましょう。


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();
    frame.setScreenBackground(Color.white);
    frame.setShadingMode(frame.WIRE_FRAME_MODE);

    /*自作構造物モデル*/
    MotorCycle cycle1 = new MotorCycle( Color.red );
    frame.add( cycle1 );

  }
}

▼実行結果

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