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


 前回までで、立体配置の基本説明はだいたい押さえられました。そこで今回及び次回は “光の効果” について説明して行きましょう。光加減は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では光源もポリゴンだ」と書きましたが、光源ポリゴンは他のポリゴンの描画に影響を与えつつも、自身は描画実体を持たない特別なポリゴンなのです。

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

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

リニアングラフ3DのVCSSL用APIにカメラ制御関数を追加、回転アニメーションツールも同梱
2019年10月09日 - RINEARNでは10月9日にソフトウェアの最新版をリリースしました。VCSSLのAPI関数の追加や、リニアングラフ3Dのアニメーションツールの追加など行っています。その概要をお知らせします。

小型関数電卓 RINPn(旧称リニアンプロセッサー nano)の公式ページを開設
2019年10月02日 - 現在オープンソースで開発中の、「シンプル&コンパクト」を目指した小型プログラマブル関数電卓ソフト「 RINPn 」の公式ページが、RINEARNサイト内にオープンしました。その概要をお知らせします。

Vnanoの公式サイトがオープン、チュートリアルやAPI仕様書等も掲載
2019年08月07日 - オープンソースのアプリケーション組み込み用スクリプトエンジン「 Vnano 」の公式サイトを開設しました。チュートリアルや、スクリプトエンジンのAPI仕様書などが参照できます。その概要をお知らせします。

コードアーカイブ新着
3Dグラフを回転アニメーションさせるツール

3Dグラフを、Z軸まわりにゆっくりと回転アニメーションさせるツールです。全角度のグラフを、連番の画像ファイルに保存する事もできます。
2019年10月09日
[公式ガイドサンプル] ユーザーのGUI操作に対して処理を行う

「VCSSL GUI開発ガイド」内のサンプルコードです。ユーザーがGUIを操作した際に行う処理を実装します。
2019年07月28日
[公式ガイドサンプル] 各種GUIコンポーネントを画面上に配置する

「VCSSL GUI開発ガイド」内のサンプルコードです。色々な種類のGUI部品を画面上に配置します。
2019年07月28日
連番ファイルから3Dグラフをアニメーション描画するツール

フォルダ内の連番データファイルを読み込み、3Dグラフを高速で連続描画して、アニメーションさせるツールです。グラフを連番の画像ファイルに保存する事もできます。
2019年06月03日
連番ファイルから2Dグラフをアニメーション描画するツール

フォルダ内の連番データファイルを読み込み、2Dグラフを高速で連続描画して、アニメーションさせるツールです。グラフを連番の画像ファイルに保存する事もできます。
2019年05月24日
公式Twitterアカウント