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

 立体構造がある程度複雑になってくると、ポリゴンの位置把握が困難になるため、一つの立体モデルクラスで開発するのが難しくなってきます。またそのような開発方法は、基本的な構造は同じで一部のみが異なる、バリエーションモデルを表現するのにも面倒です。そこで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 );

  }
}

▼実行結果

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


スポンサーリンク



スポンサーリンク

この階層の目次
新しいお知らせ

次回のVCSSL 3.4.10において、関数1個の挙動に非互換な修正が適用されます
2019年02月12日 - VCSSLの次回の正式リリース版3.4.10において、これまでドキュメントと実際の挙動が異なっていた描画系の関数1個に、非互換な修正が適用されます。その詳細と、使用コードでの対応方法について解説します。

RINEARNのソフトウェア向けにOpenJDKで生成したJava実行環境(JRE)の提供を開始
2019年02月06日 - Javaのリリースモデル変更への対応として、OpenJDKのjlinkツールを用いて、RINEARNのソフトウェア実行用に生成したJava実行環境(JRE)の提供を開始しました。その詳細と、今後の方針について解説します。

シンプル&コンパクトなプログラム関数電卓! 「 リニアンプロセッサー nano 」の概要
2019年01月26日 - RINEARNでは現在、プログラム関数電卓ソフト「 リニアンプロセッサー 」の派生版として、シンプル&コンパクトな方向性を目指した「 リニアンプロセッサー nano 」を開発中です。その概要をご紹介します。

コードアーカイブ新着
入力された数式を積分して値とグラフを表示するツール

画面上で数式を入力すると、それを数値的に積分し、値とグラフを表示してくれるGUIツールです。
2019年01月20日
z = f(x,y,t) の形の数式を3Dグラフとしてアニメーション描画するツール

入力欄に z = f(x,y,t) の形の数式を入力すると、それを3次元のグラフにアニメーション描画してくれる簡易ツールです。
2018年11月26日
y = f(x,t) の形の数式を2Dグラフとしてアニメーション描画するツール

入力欄に y = f(x,t) の形の数式を入力すると、それを2次元のグラフにアニメーション描画してくれる簡易ツールです。
2018年11月25日
t を媒介変数とする x(t), y(t), z(t) の数式を3Dグラフに描画し、アニメーションもできるツール

入力欄に x(t), y(t), z(t) の形の数式を入力すると、それを t を媒介変数として3次元のグラフに描画し、アニメーションもできる簡易ツールです。
2018年11月20日
t を媒介変数とする x(t), y(t) の数式を2Dグラフに描画し、アニメーションもできるツール

入力欄に x(t), y(t) の形の数式を入力すると、それを t を媒介変数として2次元のグラフに描画し、アニメーションもできる簡易ツールです。
2018年11月19日
公式Twitterアカウント

スポンサーリンク