[ 前へ | 目次 | 次へ ]
Japanese English

光源の生成・配置と各種設定

ここでは、光源の生成と配置方法、および色や輝度の設定について扱います。

スポンサーリンク


球モデルの配置

まずは下準備として、光の影響を見えるようにするために、球モデルを配置してみましょう。 様々なモデルの生成と配置に関しては次章で詳しく扱いますので、 とりあえずは下のように記述し、実行してみてください。


import graphics3d.Graphics3DFramework;
import Graphics3D;

// プログラムの最初に呼び出される関数
void onStart ( int rendererID ) {
	
	// 画面サイズや背景色の設定(省略可能)
	setWindowSize(800, 600);
	setBackgroundColor(0, 0, 0, 255);
	
	// 球モデルを生成して配置
	int sphere = newSphereModel( 2.0, 2.0, 2.0, 12, 8 );
	mountModel( sphere, rendererID );
}
MountSphereDefaultLight.vcssl

このプログラムを実行すると、画面中心に球が表示されます。 球にはちゃんと陰影が付いて、立体感があるように描画されています。 これは、フレームワークの Graphics3DFramework が、標準で光源を用意して配置してくれているためです。

実行結果、球が表示されている図。
実行結果
球にはちゃんと陰影が付いて、立体感があるように描画されている。

もし光源が無ければ、球には光が当たらずに真っ黒になるはずです。 実際に、標準の光源の明るさを0にして、明かりを消してみましょう。 上のプログラムのonStart関数内(どこでも大丈夫です)に、以下のように3行だけ追記してみてください:


...

// プログラムの最初に呼び出される関数
void onStart ( int rendererID ) {
	
	// 標準の光源の明るさを 0 にする
	setDirectionalLightBrightness( 0.0 );
	setAmbientLightBrightness( 0.0 );  
	
	...
MountSphereNoLight.vcssl

実行すると、このように真っ黒になります。球に光が一切当たらないためです。

実行結果、真っ黒になっている図。
実行結果
球に光が一切当たらないため、真っ黒に描画されている。

光源の生成

光の加減を自分で細かく調整したい場合、上のように標準の光源を消してから、自分で光源を生成して配置する事になります。

光源を生成するには、 newLight 関数、 newPointLight 関数、 newAmbientLight 関数の3つの関数を使用します:

int newLight ( int x, int y, int z, float power )
全体を一定の方向から照らす平行光源を生成する関数です。
int newLight ( int x, int y, int z, float power )
特定の点から放射状に照らす点光源を生成する関数です。
int newAmbientLight ( int x, int y, int z, float power )
方向に関係無く、 モデル全体を一様に照らすアンビエント(環境光)光源を生成する関数です。

引数は以下の通りです:

  • x, y, z: 光源の存在する方向/位置ベクトルを指定します。
  • power: 輝度を 0.0 〜 1.0 の範囲で指定します。全体を一個の光源で照らす場合、適性な輝度は 0.5 前後が目安となります。

これらの関数は、各種の光源を生成し、その光源のIDを割り振って返します。このIDは、配置や設定操作などで使用します。

光源の配置

光源を配置するには、 mountLight 関数を使用します。

- 関数の形式 -

void mountLight ( int lightID, int rendererID )

引数は以下の通りです:

  • lightID: 光源のIDを指定します。
  • rendererID: レンダラーのIDを指定します。

なお、光源は、任意の座標系の上に配置する事も可能です。 そのような場合には引数を一つ追加し、配置先座標系のIDを指定します:

- 関数の形式 -

void mountLight ( int lightID, int rendererID, int coordinateID )

引数は以下の通りです:

  • lightID: 光源のIDを指定します。
  • rendererID: レンダラーのIDを指定します。
  • coordinateID: 光源を配置する座標系のIDを指定します。

光源の色設定

光源の色を設定するには、 setLightColor 関数を使用します。

- 関数の形式 -

void setLightColor (
  int lightID,
  int red, int green, int blue, int alpha
)

引数は以下の通りです:

  • lightID: 設定対象の光源のIDを指定します。
  • red, green, blue, alpha: 光源の色成分(赤, 緑, 青, 不透明度)を、それぞれ 0 〜 255 の範囲で指定します。各色成分の意味や混色のされ方については、基盤の準備 の回で解説しています。

色の付いた光でモデルを照らすと、 光の色が持つ色成分が、モデルの色が持つ色成分をそれぞれ照らします。 つまり光の青成分は、モデルの青成分のみを照らし、赤成分には影響を与えません。

具体的には、白いモデルを青い光で照らすと、普通の青色になります。 しかし、緑のモデルや赤いモデルを青い光で照らしても、全体的に暗いままです。

光源の位置設定

光源の位置を変更するには、 setLightLocation 関数を使用します。

- 関数の形式 -

void setLightLocation ( int lightID, float x, float y, float z )

引数は以下の通りです:

  • lightID: 設定対象の光源のIDを指定します。
  • x, y, z: 光源の存在する方向/位置のベクトル成分を指定します。

光源の輝度設定

光源の輝度を変更するには、 setLightBrightness 関数を使用します。

- 関数の形式 -

void setLightBrightness ( int lightID, float power )

引数は以下の通りです:

  • lightID: 設定対象の光源のIDを指定します。
  • power: 光源の輝度を指定します。輝度は0.0〜1.0の範囲で指定します。 全体を一個の光源で照らす場合、大体0.5前後の輝度が適正値です。

引数powerで光源の輝度を指定します。 輝度は0.0〜1.0の範囲で指定します。 全体を一個の光源で照らす場合、大体0.5前後の輝度が適正値です。

光源が多数存在する場合は、その分だけ一個当たりの輝度を下げてやる必要があります。 しかし輝度の等しい光源が様々な方向に存在すると、 陰影が一様化してしまい、立体感が無くなってしまいがちです。 そのような場合には、各光源の輝度をある程度ばらけた値に設定する事が有効です。

距離による明るさの減衰はない事に注意

なお、VCSSL光源は、近いものも遠いものも同じ明るさで照らします。光源と物体の距離に応じて、明るさを減衰させる機能は、今の所サポートされていません(将来的に、輝度とは別の設定項目として追加される計画はあります)。

従って、「この光源は遠くにあるので、照らされ方を暗くしたい」といった場合、その光源の輝度自体を下げて調節してください。

プログラム例

それでは、先程のプログラムで光源を配置してみましょう。以下のように記述し、実行してみてください。


import graphics3d.Graphics3DFramework;
import Graphics3D;

// プログラムの最初に呼び出される関数
void onStart ( int rendererID ) {
	
	// 画面サイズや背景色の設定(省略可能)
	setWindowSize(800, 600) ;
	setBackgroundColor(0, 0, 0, 255);
	
	// 標準の光源の明るさを 0 にする
	setDirectionalLightBrightness( 0.0 );
	setAmbientLightBrightness( 0.0 );
	
	// (1.2, 1.5, 1.0)の位置に、輝度0.5の光源を配置
	int light = newLight( 1.2, 1.5, 1.0, 0.5 );
	mountLight( light, rendererID );
	
	// 原点に、輝度0.5のアンビエント光源を配置
	int ambientLight = newAmbientLight( 0.0, 0.0, 0.0, 0.5 );
	mountLight( ambientLight, rendererID );
	
	// 球モデルを生成して配置
	int sphere = newSphereModel( 2.0, 2.0, 2.0, 12, 8 );
	mountModel( sphere, rendererID );
}
SphereWithLight.vcssl

このプログラムを実行すると、ちゃんと光に照らされた球が表示されます。 最初の実行結果と同じですが、最初は標準で用意されている光源で照らされていたのに対し、 今度は自分で生成・配置した光源で照らされています。

なお、光の明るさは、 newLight 関数で生成した光源の輝度によって調整できます。 影の場所の明るさは、 newAmbientLight 関数で生成した、アンビエント光源の輝度によって調整できます。

実行結果、光に照らされた白い球が表示されている図
実行結果
球に光が当たって、立体感も表現されている。



スポンサーリンク



Japanese English
この階層の目次
[ 前へ | 目次 | 次へ ]
RINEARN からのお知らせ
※ VCSSL は RINEARN が開発しています。

各ソフトやVCSSLの英語版ドキュメント整備がほぼ完了
2025-06-30 - RINEARNでは2年前から、AIの補助による英語版ドキュメントの大幅拡充計画を進めてきました。今回、主要ドキュメント&コンテンツの英訳がほぼ完了し、一応の目標水準に達しました。詳細をお知らせします。

VCSSLの最新版をリリース: 外部プログラムとの連携機能を少し強化、他
2025-05-25 - VCSSL 3.4.52をリリースしました。外部プログラム(C言語製の実行ファイル等)との連携機能を少し強化し、文字化け対策やOS判別などを可能にしました。他にも細かい機能追加があります。詳細をお知らせします。

VCSSLの最新版をリリース、Java 24上での非互換な挙動を対処
2025-04-22 - VCSSL 3.4.50をリリースしました。Java 24環境上でのネットワークドライブ関連のファイルパス解決で、従来環境とは異なる挙動が生じていたのを解消しました。詳細をお知らせします。

リニアングラフやVCSSLの最新版をリリース、目盛りの位置や内容を自由に指定可能に!
2024-11-24 - リニアングラフ3D/2Dを更新し、自由な位置に、自由な表記内容の目盛りを描けるようになりました! 併せて、Java言語やVCSSLでの、プログラム制御用APIも拡張しています。詳細をお知らせします。

Exevalator 2.2 をリリース、TypeScript 対応によりWebブラウザ上で動作可能に
2024-10-22 - オープンソースの式計算ライブラリ「Exevalator(エグゼバレータ)」の2.1をリリースしました。新たに TypeScript に対応し、Webブラウザ上での式計算にも使えるようになりました。詳細を解説します。

アシスタントAI作成の舞台裏(その2、作成編)
2024-10-12 - アシスタントAIの作成方法解説の後編です。実際にChatGPTの「GPTs」機能を用いて、アシスタントAIを作成する手順や、独自の知識をもたせたり、精度を出すためのノウハウなどを解説しています。

アシスタントAI作成の舞台裏(その1、基礎知識編)
2024-10-07 - アシスタントAI作成方法解説の前編です。今回はまず、アシスタントAIを作る前に抑えておきたい、基礎知識を延々と解説しています。そもそもLLM型AIとはどんな存在か? RAGとは何か? 等々です。

ソフトの利用をサポートしてくれるアシスタントAIを提供開始!
2024-09-20 - RINEARN製ソフトの使い方の質問応答や、一部作業のお手伝いをしてくれる、アシスタントAIを提供開始しました。ChatGPTアカウントさえあれば、誰でも無料で使用できます。使い方を解説します。

Exevalator 2.1 をリリース、新たに Visual Basic に対応
2024-07-28 - オープンソースの式計算ライブラリ「Exevalator(エグゼバレータ)」の2.1をリリースしました。今回から、新たに Visual Basic(VB.NET)でも使用できるようになりました。詳細を解説します。

関数電卓 RINPn(りんぷん)、Esc キーで計算式の一発クリアが可能に
2024-07-20 - 関数電 RINPn の Ver.1.0.2 をリリースしました。今回から、キーボードの「 Esc 」キーを押すと、入力中の計算式を一発でクリアできるようになりました。詳細を解説します。