むずかしいことはわかりません

いろいろ書いてるみたいな

Esenthel Engineを試してみてるんですけども。 - 落ち着いてライトについて読んでみた

ライトがちゃんとあたらないんですよねーとかいいつつ、実行時間でライトの場所が変わるようにDirectional Lightを設定していた俺です。

 

ライトの種類

http://msdn.microsoft.com/ja-jp/library/cc373077.aspx

というのがありましたので、これを読んでライトの種類を確認しました。

で、問題の行はこれです。

LightDir(Vec(Cos(Time.time()), Sin(Time.time()), -1.5), Vec(1, 0, 0), 1, 1, 0.5);

 最初のVecは、その光源をどこに置くかです。「ディレクショナルライトは太陽のような遠く離れた光源に例えることができる」と考えると、この行でやってることは

・位置情報を実行開始からの累積時間で算出する

・Z軸は-1.5の位置、XとYは円を描くように動く

・色は赤(!)

・その後ろはよくわからない(ほぼデフォルトだし)

です。位置的なものを直さないでやってるとこんな感じになります。

f:id:sato_c:20131219165329p:plain

Zが-1.5なんだから奥まった位置からあたってますしね。仕方ない。

で、こちらを修正しました。

f:id:sato_c:20131219165505p:plain

LightDir(Vec(0, 0, 1), Vec(0.5, 0.25, 0.25)).add();

 色がピンクっぽく、ライト位置はモデルよりも手前からあたるようになっているので、後ろが陰になってより自然な(?)ライトになりました。

ピンクのライトが自然かって言われるとアレなので、色はデフォルトにしときましょう。2番目のパラメータを削除しておけばデフォルトの色(RGB全部1=白)です。

LightDir(Vec(0, 0, 1)).add();

 そしたら、こんなかんじ。

f:id:sato_c:20131219165836p:plain白すぎちゃって、女優のシワ消しライト状態になってますが、最初のライト当たらなくてふびんな子みたいに見えてた島風もちゃんと見えるようになりました。

 

というわけで、LightDirはディレクショナルライト、光源の位置を指定してやれば光があたるというのがよくわかった事例でした。

Time.time()は実行開始時からの経過時間を取る関数です。

レンダリングのたびにライトを追加(.add)してやらないとならないのは面倒ですが、ここらへんは一度書いたらあんまり触らないところでもありそうです。