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

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

  }
}

▼実行結果

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


スポンサーリンク


スポンサーリンク

この階層の目次
お知らせ

Vnanoのソースコードと開発リポジトリをGitHubで公開
2018年09月30日 - 現在開発中の、ソフトウェア上でのスクリプト処理用途に向けた小型・軽量スクリプトエンジン「 Vnano 」のソースコード&リポジトリを公開しました。ビルド・使用方法や、現状の段階と今後などを解説します。

リニアングラフ3D&2D Ver.5.6 リリース! Java言語のプログラムからも制御可能に
2018年08月19日 - 約5年ぶりの大きなバージョンアップを迎えた、新しいリニアングラフ Ver.5.6の特徴をご紹介します。UIがリファインされ、Java言語でグラフ描画ライブラリとして使う事も可能になりました。

ライセンスの緩和方向への改訂を実施、条件を満たす場合のソフトの再配布などが可能に
2018年07月16日 - RINEARNでは2018年7月に、ソフトウェアライセンスの緩和方向への改訂を実施しました。新ライセンスでは、いくつかの条件を満たす場合において、ソフトの再配布などが無申請で可能になりました。

コードアーカイブ新着
配列を3Dグラフにアニメーションプロットする(点/線グラフ)

座標値配列の内容を、3次元の点/線グラフに連続でプロットし、アニメーションさせるサンプルプログラムです。
2018年11月14日
配列を2Dグラフにアニメーションプロットする

座標値配列の内容を、2次元グラフに連続でプロットし、アニメーションさせるサンプルプログラムです。
2018年11月13日
配列を3Dグラフにプロットする(曲面/メッシュグラフ)

座標値配列の内容を、3次元の曲面/メッシュグラフにプロットするサンプルプログラムです。
2018年11月12日
ファイルを3Dグラフにプロットする(曲面/メッシュグラフ)

座標値ファイルの内容を、3次元の曲面/メッシュグラフにプロットするサンプルプログラムです。
2018年11月11日
連番画像をアニメーション再生する簡易ツール

フォルダ内の連番画像ファイルを、動画への変換不要で、そのままアニメーションとして再生できる簡易ツールです。
2018年09月04日
公式Twitterアカウント

スポンサーリンク