フリーウェアでシミュレーション結果アニメーションを作る

Pov-Ray 編 2. 流体データの場合

<< Prev - Index - Next >>

2. ボリュームレンダリング

■ 最初に表示した箱の中に、ボリュームデータを表示してみましょう。
ただし、べたっと単純にソースを書くとそこそこ長くなってしまうので、まずはマクロで中心になる部分を作ってみることにします。

後ではめ込むんで利用するために、密度ファイルを読み込んでいろいろなパラメータを設定するところを切り離して DensityProfile という名前のマクロにしてみます。

#macro DensityProfile ( VTranslate, VScale) 
density{
  density_file df3 "Sample/sample001.df3"

  interpolate 1
  frequency 0

  scale VScale 
  translate VTranslate 

  color_map {
    [0.0 rgb <0.2, 0.0, 0.0>]
    [0.5 rgb <0.5, 0.5, 0.0>]
    [1.0 rgb <1.0, 1.0, 1.0>] 
  }
}  
#end
#マクロ定義開始 (引数...)
密度定義
  読み込むファイル

  補間方法 1:linear
  繰り返し回数

 スケール設定
 位置のオフセット設定

  カラーマップ
    密度 0   で赤
    密度 0.5 で黄  
    密度 1   で白


#マクロ定義終了

■ 密度分布は、デフォルトでは <0, 0, 0> - <1, 1, 1> に分布されます。今回は <-1, -1, -1>, <1, 1, 1> の箱に結果を入れたいので、スケールを2倍 <2,2,2> して、オフセット <-1, -1, -1> するとちょうどぴったりはまることになります。このあたりの設定は、マクロに引数で与えられるようにしました。

interpolate 2 にすると、bilinearでより滑らかな補間をしてくれるのですが、密度0や密度1付近に値があるデータだと、補間の関係で1を超えて0になったり、0を下回って1になったりということが起きるようです。データによっては interpolate 2 の方が綺麗なのですが、デフォルトは1の方がよさそうです。

■ 密度読み込みマクロができたので、それを使って読み込んだ密度分布をもった立方体を作ってみます。

box {
  <-0.99, -0.99, -0.99> <0.99, 0.99, 0.99>
  hollow
  pigment {rgbt <1,1,1,0.95>}
  interior {
    media {
      DensityProfile (<-1, -1, -1>, <2, 2, 2>)
      
      intervals 1
      samples 32,64          
      method 3

      emission rgb 0.3 * <1, 1, 1>
      absorption rgb 1.0 * <1, 1, 1>
      scattering { 1, rgb <1, 1, 1> }  
    }
  }
}
箱を置く
  箱の両端の座標
  中空の箱
  箱の表面の色(今回はほぼ透明)
  箱の中身設定
    中身のガスの設定
  マクロで密度読み込み

  レンダリング精度設定
  レンダリング精度設定
    レンダリング手法

    発光の設定
    吸収係数の設定
    散乱係数の設定(非常に重い)




■ 次のような画像が完成しました。ほぼ透明な灰色の箱の中に、確かにボリュームデータが表示されています。


経験上ボリュームレンダリングは(外部光源で照らす場合は)強い光で照らした方が結果がくっきりするようです。この画像も光源の強さをいじっています。

■ この例は光に照らされたボリュームを計算しているので、非常に重いです。このパラメータで320x240の画像を作るのに、原稿を書いた当初のPentium 4 3.8GHz 32bit環境で40秒、現在の最強環境Corei7 3.43GHz 64bit環境 (1コアのみ)で14秒かかっています。

■ 多少見た目を犠牲にしても良ければ、散乱(scattering) を切り、その分 発光(emission) を強くすることで、影を計算しなくなるので計算量が減り一気に高速化します。

media{} の各種設定詳細
absorption: {COLOR}
  □{0,0,0} 以外を設定すると、光を吸収するので濃い部分の後ろに影が落ちます。
  例えば赤を吸収する物質の後ろは青っぽくなります。

scattering: {type, COLOR, [eccentricity VALUE], [extinction VALUE]}
  □type で散乱の種類を設定します
    1: isotropic
    2: Mie haze
    3: Mie Murkey
    4: Rayleigh scattering
    5: Henyey-Greenstein scattering
  □COLOR で散乱の色を設定します。
  □extinction 散乱した分の光は自動的にabsorptionされます。 これを1以外で設定すると、 その分のabsorptionの強弱を変更できます。
  □eccentricity: type 5 (Henyey-Greenstein scattering) を選んだときに効くパラメータ
    マイナスだと後方散乱、プラスだと前方散乱が強くなって、0で等方散乱です。

emission: {COLOR}
  □{0,0,0} 以外を設定すると、自分で発光します。
    光源がなくても見ることができるという意味での発光で、周囲の物体を照らしたりすることはありません。

interval: VALUE
  □ 物質内の各点でどれだけ光が当たっているか評価する際に、視線方向に何区画で光の評価をするかの設定。大きいほど精確で遅い。

samples: MIN, MAX
  □ interval 毎に複数点でサンプリングして、ばらつきを見てサンプル数を決める。その際の最小値と最大値を設定する。詳細は難しくてよくわからないけど、大きいほど精確で遅いらしい。

※)interval と sample の兼ね合いで、interval を少なめに、sample数を多めに取るほうが良いという記述があった。実際、実行時間もそのほうが早いように感じる。

method: type
  □ 1: サンプルの取り方がランダム 2:サンプルの取り方が等間隔 3:サンプルの取り方がadaptive。adaptive は値が急に変化する場所を細かくサンプリングする賢い実装のようなので、何か問題が起きなければadaptiveを使うのがよさそう。


■ 別のデータサンプルで、宇宙の大規模構造形成のデータです。

密度が 0 の領域が多いので、emission を強くして小さい部分も良く見えるようにしています。

また、上の例では密度が薄い領域にも色をつけていましたが、この場合はそれでは構造が埋まって見えなくなってしまうので、密度 0 では色も <0, 0, 0> にしています。


<< Prev - Index - Next >>
inserted by FC2 system