Home | Lesson | Game | Tool | Link

16.ライト設定

Irrlichtで実装されている3種類のライトの説明を行います。

サンプルを実行して確認してみてください
スポットライトの場合は、プレイヤーがハンドライトを持っているような感じになっています。
プレイヤー(カメラ)の位置が光源になっています。
操作方法
移動:カーソルキーとWASDキー
視点変更:マウス移動
ライト切り替え:マウス左クリック
ライト減衰設定:マウスホイール回転

使用可能なライトは以下の3つです。
・ディレクショナルライト	ELT_DIRECTIONAL
・ポイントライト		ELT_POINT
・スポットライト		ELT_SPOT
ディレクショナルライト
ポイントライト
スポットライト

ライトの設定
ライトを作成しただけだと、初期設定ではポイントライトになっています。
ただし、距離による減衰がX方向にしか設定されていないので、
ディレクショナルライトと同じように見えてしまいます。
//ライト作成
ILightSceneNode *light = smgr->addLightSceneNode(
	0, vector3df(0,0,0), SColorf(0xFFFFFFFF), 1.0f);

//ライトタイプ
light->getLightData().Type = ELT_DIRECTIONAL;
//light->getLightData().Type = ELT_POINT;
//light->getLightData().Type = ELT_SPOT;

//減衰値設定
light->getLightData().Attenuation = vector3df(0.05f, 0.05f, 0.05f);

ライトの影響を受ける
ライトを作成したら、ノードもライトの影響を受けるようにします。
ISceneNode* node[3];

//ノードの作成
node[0] = smgr->addCubeSceneNode(2.0f);	//立方体

//立方体
node[0]->setMaterialTexture(0, driver->getTexture("wall.bmp"));
node[0]->setMaterialFlag(EMF_LIGHTING, true);	//光源計算:false=off


SLight
ライトの設定を変更するには、SLightの内容を変更する必要があります。
SColorf		AmbientColor	0.0f,0.0f,0.0f
SColorf		DiffuseColor	1.0f,1.0f,1.0f
SColorf		SpecularColor	1.0f,1.0f,1.0f
bool		CastShadows	true
vector3df		Direction		0.0f,0.0f,0.0f
vector3df		Position		0.0f,0.0f,0.0f
vector3df		Attenuation	1.0f,0.0f,0.0f
f32		Falloff		2.0f
f32		InnerCone		0.0f
f32		OuterCone		45.0f
f32		Radius		100.0f
E_LIGHT_TYPE	Type		ELT_POINT
AmbientColor	アンビエントカラー
DiffuseColor	ディフューズカラー
SpecularColor	スペキュラカラー
CastShadows	影を作るかどうか
Direction		ライトの方向(読み込みのみ、ポイントライトでは無視される)
Position		ライトの位置(読み込みのみ、ディレクショナルライトでは無視される)
Attenuation	減衰値(距離による光の減少値、ディレクショナルライト以外)
Falloff		内部コーンと外部コーン間のライトの減少値(スポットライトのみ)
InnerCone		内部コーン(スポットライトのみ)
OuterCone		外部コーン(スポットライトのみ)
Radius		ライトの半径
Type		ライトのタイプ


ライトの注意点1
今回はデバイスをOpenGL(EDT_OPENGL)で作成しています。
DirectXでは見た目が異なる場合があるかもしれないので、注意して下さい。

筆者の環境では、DirectXの環境で実行すると、ポイントライトと
スポットライトが表示されませんでした。
また、OpenGLでもDirectXでもライトの半径が影響していないようです。

また、ライトは複数作成可能ですが、グラフィックカードによっては
作成できるライトには制限が出てくる可能性があります。


ライトの注意点2
ライトはポリゴンの各頂点に対して反映されます。
そこで、かなり大きな1枚ポリゴンがあった場合(ライトで照らされる範囲より大きい場合)、
頂点に光が届かなければ、ライトは反映されません。
ポリゴンが小さければ、ライトの影響を受け易くなりますが、
ポリゴンの描画に時間がかかってしまいます。


FPSのハンドライトを作る
予めライトは作成しておいて、特定の行動(マウスクリックやボタン)で
ライトをON/OFFすれば実現可能かと思います。
その場合注意したいのが、光が当たった所は光りますが、
光源からの光は「光として画面に見えない」ので、
今ライトで照らしてますよ!的なテクスチャやオブジェを光源に用意しましょう。


メモ
ちょっと思いついたことを・・・
1.createDeviceでステンシルシャドウを有効にする
2.影の色を黒ではなく、白に変更する
3.球体または円形のものを照らす(ただし、球体は画面に表示させない)
これで、1枚ポリゴンにもスポットライトのような画面効果が出せるかも?

ダウンロード
今回作成したファイル一式です。

宿題
1.ライトを複数作成して設置してみましょう。
2.FPSでよく使うようなハンドライトを作成してみましょう。