過去の独りごち/独りごとはこちら
過去のJavaアプレットは
こちら

 

3/22 釜の蓋が開く

 遠景との境界いじりというものがこんなに難しかったとは…と、ただただ愕然とするばかりです。不審人物よろしく家の周りをウロウロしながら、境界を見ては「どういう構造で境界ができるのか」という事柄について思案していたのですが、自然な境界を醸し出すには、圧倒的なモデリングの労力が必要なようです。

 しかし、背景をいじるのももう疲れました…

 

    /_ ‐- 、 ヽ  、ミ  レ- 、
  〈  ヽ \ j /ヽ∨∠_    ヽ    これが…
.   ヽ`ー三う ,ィ, ハ 'ニ, i |ヽ. i l   せい…いっぱい…
.     ト、ニ∠イ_:ヽ{ ::'''_:ノル'  i { 〉     です
     レ' : =;;三`テツy;ッzj' イ; } :}.{    みな…さん
    l  j'  ::: : |「 ソ   ,ンノ ,〉   受け取って…
   ノ  {'   、_;;j' /__ (. ( r'     ください…
  ,.イー=ゝ、 fF==ァ′〜 )_ノ    伝わって………
  {、 ,.ヘ\{  ̄「/三ニ=('
  ヘミ \_> ` ー'rう'´ ー-、       ください……
    ヽ\=-‐''´ `ー-


mukistg0322.zip
(11.6MB バイナリのみ)

 そろそろプログラミングを続けさせてください(倒

 実は今までRayleigh/Mie散乱を使って綺麗かつ簡単に夕焼けを実現する方法がなかなか分からなかったんです。というのも、Rayleigh散乱は波長の4乗に反比例する割合で光を散乱するので、青い光はよく散乱します。しかし、Rayleigh散乱にはin-scatteringとout-scatteringの二種類があり、光を強めるin-scatteringの効果は距離に比例しますが、光を減衰させるout-scatteringの効果は距離の指数関数に比例します。

 つまり、南中時は太陽までの距離が短いのでin-scatteringが支配的になり、青い光が目に届くのですが、夕暮れ時は太陽までの距離が長いためout-scatteringが支配的になり、青い光が弱められるので赤みがかった日の光として観察できる、という事になります。

 で、ポリゴンで作った天球体メッシュの大きさを変えないことにはうまいこと夕焼けが表現できませんし、大気圏の高さまであるようなデカいメッシュを作ったらあっという間に遠方クリッピング平面の彼方に消えてしまうので、天球体描画用に視点→頂点間距離に対する係数をいろいろといじったシェーダを考えなければなりません。太陽光線の方向が地平線と平行に近かったら視点→頂点間距離をぐんぐん伸ばす、というような。

 しかし、もうひとつ逃げ道がありました。メッシュの大きさを変えず、シェーダ内部の式もいじらず、夕焼けを実現する方法が。それは、負の値の散乱係数を与える、という妙な方法でした。これにより、青い光ほどRayleigh散乱によって目に届きにくくなる、というからくりです。その一方で、Mie散乱をわざと強めることでトータルの光の量を補償します。折角のシミュレーション結果は台無しといいますか、そもそも天球体までの距離とかは無茶苦茶いい加減なのでもとより台無しなんですが、工学的にはこれが正義なのです。きっと。

Taku Hayase(SANDMAN)

戻る