[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:00858] 照光計算



◆◆ 有限会社萌黄の便り(もえぎのたより)◆◆◆◆◆◆◆◆◆◆◆◆◆
<やくぜん食品のご案内> 
高齢社会を迎え、健やかに老を生きるため免疫力を高め、病気をしない身体
づくりのための漢方配合の商品です。 
是非一度ご賞味下さい。 http://www.matsuronet.ne.jp/moegi/
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆


Numakuraです。えんどうさんのリクエストがあったので...

Rendererでは、RGBの各色を0.0〜1.0の実数として扱い、
照光計算も実数で演算し、最終的に0.0〜1.0にクランプし
ます。そのため、1.0を越えた数値は1.0にされます。

Materialに設定できるパラメータは、以下の5種類あります。

Ambient color
Emmisive color
Diffuse color
Specular color
Shininess

上の4種はRGBの3要素あるんですが、簡単のため1要素だけ
と考えます。これらのパラメータと各Lightのデータ、頂点の法線
ベクトル、視線ベクトルなどから計算を行い、その頂点での色を
求めます。まず、簡単なやつから...

1.Emmisive
これは、他の照光計算が終わった後で単純に加えられるパラ
メータです。したがって、大きめの値にすると、1.0をこえてしまっ
てのっぺりした画像になってしまいます。

2.Ambient
AmbientLightの各要素とこの各要素が乗算されて、加えられます。
そのためAmbientLightが生成されていないと0になってしまい、その
効果が現れません。
実際に目に見える世界では、光源ではなくとも壁などからの環境光
があるのですが、レンダラでは光が直接当たらないところは真っ黒に
なってしまいます。この不自然さをなくすのが目的のパラメータです。
一般には、AmbientLightはすべて0.2(これがデフォルトです)とし、
Ambientはすべて0.1ぐらいにしておくでしょう。
(壁などからの環境光を求めるアルゴリズムがラジオシティです)。

3.Diffuse
「モノの色」を決めるもっとも基本的なパラメータで、頂点から光源への
ベクトル(これをLLとします。ベクトルの表現ができないので2つ続けた
もので代用します)と頂点の法線ベクトル(これをNNとする)から計算
されます。Lambertの余弦則(スペルあってる?)から、この2つのベク
トルのなす角度(Θとする)の余弦を計算します。2つのベクトルを
Normalize(正規化。単位ベクトルにすること)すると、

|LL||NN|cosΘ = LL・NN (ベクトルの内積)

単位ベクトルですから、cosΘは、ベクトルの内積で求まります。
次にこの頂点での光の強さを求めます。光の強さは平行光源で
あれば減衰がないのでそのまま、点光源であれば減衰式と頂
点との距離から、スポットライトでは点光源に加えてその範囲に
入っているか、中心から周囲にいくと光が弱くなるconcentration
から光の強さを求めます。(ちなみに、光の減衰は距離の2乗に
反比例するのですが、Java3Dのような指定方法になっているの
は、「距離の2乗に反比例」としてしまうと、2.で書いたのと同じ
理由で光があまりに急激に減衰してしまうからです)。
先程の内積で求めた値と値と光の強さおよびDiffuseの各色を
かけてこの成分を求めます。

4.SpecularとShininess
また、次回(^^;)。

_/_/_/     E-mail:numakura@aie-res.co.jp    _/_/_/