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


 起動したばかりの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プログラミング全般において基本的なテクニックであり、かつ大変重要なものです。

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


スポンサーリンク


スポンサーリンク

この階層の目次
お知らせ

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アカウント

スポンサーリンク