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でよく使うようなハンドライトを作成してみましょう。
|