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

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

  }
}

▼実行結果

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


スポンサーリンク



スポンサーリンク

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

リニアンプロセッサー nano の先行開発版やソースコードリポジトリを公開
2019年04月16日 - オープンソースで開発中の小型プログラム関数電卓ソフト、「 リニアンプロセッサー nano 」の先行開発版やソースコードリポジトリを公開しました。概要と使用方法、ビルド方法などについて解説します。

各ソフトウェアの最新版を一括でリリース、OpenJDKのJava実行環境(JRE)に対応
2019年03月06日 - RINEARNでは3月6日に、主要なソフトウェアの最新版を一括でリリースしました。今回のアップデートには、以前お知らせした、OpenJDKで生成したJREへの対応が含まれています。その概要等をお知らせします。

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

コードアーカイブ新着
[公式ガイドサンプル] 立体モデルを生成して3D空間に配置する

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを生成し、3D空間に配置します。
2019年05月21日
[公式ガイドサンプル] ポリゴンを生成して3D空間に配置する

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体の基本的な構成要素となるポリゴンを生成し、3D空間に配置します。
2019年05月20日
[公式ガイドサンプル] CSVファイルにデータを書き出し&読み込んで、複雑な3次元曲面のグラフを描く(魔法陣形)

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、魔法陣のような3次元曲面のグラフを描画します。
2019年05月17日
[公式ガイドサンプル] CSVファイルにデータを書き出し&読み込んで、複雑な3次元曲面のグラフを描く(花形)

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、花の形の3次元曲面のグラフを描画します。
2019年05月16日
[公式ガイドサンプル] CSVファイルにデータを書き出し、読み込んで3次元のメッシュグラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、3次元のメッシュグラフを描画します。
2019年05月16日
公式Twitterアカウント

スポンサーリンク