光源の配置
< 前へ [ トップへ ] 次へ >


 前回までで、立体配置の基本説明はだいたい押さえられました。そこで今回及び次回は “光の効果” について説明して行きましょう。光加減は3Dコンピュータ・グラフィックスの見栄えを大きく左右し得る重要な要素です。
 反射や質感の設定は次回に扱うものとし、今回は肝心の光源について説明します。RINEARN 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();
    frame.add( axis );



    /*半径0.7の球を4個配置する*/
    SphereModel3DEG sph1
      = new SphereModel3DEG(0.7, Color.blue);
    sph1.move( 1.0, 1.0, 0.0 ); /*平行移動*/
    frame.add( sph1 );

    SphereModel3DEG sph2
      = new SphereModel3DEG(0.7, Color.blue);
    sph2.move( -1.0, 1.0, 0.0 );
    frame.add( sph2 );

    SphereModel3DEG sph3
      = new SphereModel3DEG(0.7, Color.blue);
    sph3.move( -1.0, -1.0, 0.0 );
    frame.add( sph3 );

    SphereModel3DEG sph4
      = new SphereModel3DEG(0.7, Color.blue);
    sph4.move( 1.0, -1.0, 0.0 );
    frame.add( sph4 );


  }
}


▼実行結果

このようにXY平面に4個の球が配置されます。

・デフォルト光源
 さてこれから光源を配置するわけですが、実は光源は既に一つだけ配置されています。というのもRINEARN 3Dでは起動時にデフォルトの光源が一つだけ配置され、すぐに開発作業を始められるように設計されているからです。これまで配置してきたモデルが陰で真っ黒にならなかったのも、全てデフォルト光源が照らしてくれていたおかげなのです。

・初期化メソッドでデフォルト光源を削除
 今回は光源を自分で配置したいのでデフォルト光源は邪魔になります。最初にRealtime3DFrameクラスの初期化メソッド format( ) を実行し、デフォルト光源を削除しましょう。なお format( ) メソッドを実行すると、その時点で配置されているポリゴンや立体モデルなどが全て配置解除されます。それでは上の例のソースコードの内、Realtime3DFrameクラスの生成部分を以下のように再記述し、実行してみましょう。


/*3D仮想空間*/
Realtime3DFrame frame = new Realtime3DFrame();

frame.format();

▼実行結果

 このように、光源が一切存在しないと立体モデルは真っ黒になってしまいます。


 光源の配置

 RINEARN-X 3Dでは、光源もポリゴンの一種として用意されています。従ってこれまで通り add で配置し、move で平行移動、rot〜で回転などの操作を行う事ができます。詳しくは前回までで述べたのでここでは割愛します。

・平行光源
 まずは平行光源を配置してみましょう。平行光源とは太陽のように舞台を一様な方向の光で照らす光源の事です。無限遠方にある点光源とも言えるでしょう。平行光源の役割は LightElement3DEG クラスが担います。このクラスのコンストラクタは以下の通りです。

LightElement3DEG(
    double 方向X,
    double 方向Y,
    double 方向Z,
    double 輝度,
    Color 色
)

 ここで指定する方向とは、光源の存在する方向ベクトルのことです。太陽のある方向ベクトルと思えば良いでしょう。輝度は0.0〜1.0までの範囲で指定して下さい。1.0は明る過ぎるでしょう。単独光源の場合0.5〜0.7くらいまでがちょうど良い明るさです。
 それでは、方向ベクトル( 0.0, 1.0, 1.0 )の方位に平行光源を配置してみましょう。

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();
    frame.add( axis );



    /*半径0.7の球を4個配置する*/
    SphereModel3DEG sph1
      = new SphereModel3DEG(0.7, Color.blue);
    sph1.move( 1.0, 1.0, 0.0 ); /*平行移動*/
    frame.add( sph1 );

    SphereModel3DEG sph2
      = new SphereModel3DEG(0.7, Color.blue);
    sph2.move( -1.0, 1.0, 0.0 );
    frame.add( sph2 );

    SphereModel3DEG sph3
      = new SphereModel3DEG(0.7, Color.blue);
    sph3.move( -1.0, -1.0, 0.0 );
    frame.add( sph3 );

    SphereModel3DEG sph4
      = new SphereModel3DEG(0.7, Color.blue);
    sph4.move( 1.0, -1.0, 0.0 );
    frame.add( sph4 );



    /*方位(0,1,1)にある輝度0.7の白色平行光源*/
    LightElement3DEG light = new LightElement3DEG(
        0.0,1.0,1.0, 0.7, Color.white
    );

    frame.add(light);


  }
}


▼事項結果

 このように、空間全体に等しい方向で光が照らされている様子が見て取れます。ところでデフォルト光源と見分けが付かないと思われるかもしれません。それは当然で、なぜならデフォルト光源も平行光源だからです。

・点光源
 続いて点光源を配置してみましょう。点光源とは空間上のある地点から放射状に光を発する光源で、例えば電球が典型的な点光源です。点光源の役割は PointLightElement3DEG クラスが担います。このクラスのコンストラクタは以下の通りです。

PointLightElement3DEG(
    double X,
    double Y,
    double Z,
    double 輝度,
    Color 色
)

 ここで指定する座標とは光源を配置する空間座標の事です。それでは座標原点に点光源を配置してみましょう。先ほど例のソースコードの内、光源配置部分を以下のように再記述し、実行してみて下さい。


/*座標原点にある輝度0.7の白色点光源*/
PointLightElement3DEG light
 = new PointLightElement3DEG( 0.0, 0.0, 0.0, 0.7, Color.white );

frame.add(light);

▼実行結果

 このように座標原点から放射状に光が発せられている様子が見て取れますね。なお光源自身は描画されない事に注意して下さい。「RINEARN 3Dでは光源もポリゴンだ」と書きましたが、光源ポリゴンは他のポリゴンの描画に影響を与えつつも、自身は描画実体を持たない特別なポリゴンなのです。

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