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

Pov-Ray 編 1. 粒子データの場合

<< Prev - Index - Next >>

1. 一枚絵を作る
1.1 オブジェクトを配置する

■ Pov-Rayとは、フリーの3D描画ソフトで、ちょっと癖がありますが普通に3DCGを作るために使われるソフトです。

Pov-Ray の特色は、一般のCG製作ソフトのようにGUIを使ってぐりぐりモデルを作ったりするのではない、テキストベースのCUIに近い操作方法にあります。
シミュレーション結果を見るような用途には、むしろGUIよりも便利な面もあると思います。

■ Pov-Ray では、テキストで何をどのように描画するのかを指示する .pov ファイルを読み込んで絵を作ります。 適当な .pov ファイルを作ってシミュレーション結果を表示してみましょう。

■ まず絵を出力するためには、カメラと光源、そして配置したいオブジェクトが必要です。シミュレーション結果は原点付近に置く事として、斜め45度の角度で見下ろすようなカメラにしてみます。

camera {
  location <3, 3, 3>
  sky      <0, 0, 1>
  look_at  <0, 0, 0>
  angle    45
}
カメラの設定
  位置
 カメラを振るときの軸になる方向
  どこを見るか
  カメラの視野角


■ 3DCGは現実と一緒で光が当たってないと、ものが見えません。光源を置いておきます。これはもう見た目がどのようになるかの違いでしかないので、見づらくならないように適当な位置に置いておきましょう。

light_source{ 
  <2, 3, 5>
  color rgb <1, 1, 1>
  parallel
  point_at <0, 0, 0>
}
光源の設定
  光源位置
  色の設定(rgb)
 平行光線
  原点向きに照射


■そして、オブジェクトを配置します。今回は粒子データということで、原点に球を配置しておきましょう。

sphere {
  <0, 0, 0>, 0.5
  pigment {
    rgbt <1, 1, 1, 0> 
  }
}
球の配置
位置と半径
球の色設定
色の設定(rgb+透明度)



■ この内容を.povファイルとして保存をして、Pov-Rayでレンダリングをすれば図がつくられます。

■ Windows用の Pov-Rayは、GUIによるテキストエディターを組み込んだソフトになっているので、画面上で編集します。

でレンダリングを実行です。

■ UNIX/Linux系の Pov-Rayは、UNIX/Linuxらしくコマンドラインツールとして作られています。

> povray SampleSphereA.pov +p

通常は +p オプション(pause) をつけて表示を残すようにしておきます。

■ Window 版にくらべて不便な場合もありますし、逆にスクリプト処理をする場合などは(余分なエディターが表示されずに)便利な場合もあります。

■ 原点に球が配置されました。

この画像は、画面への表示と同時にファイル名が同じの画像ファイル(SampleSphereA.bmp または SampleSphereA.png)として保存されています。

この例から、明らかにシミュレーションデータを読んで 位置や半径に応じて次々に sphere 命令をファイルに出力するスクリプトがあれば、粒子のデータを連続画像ファイルにすることができそうです。

■ 今回はSAMPLEDATAというフォルダに、10個の連番データがあるものとします。
また、それぞれのデータの中身のフォーマットは

x y z vx vy vz radius
x y z vx vy vz radius
x y z vx vy vz radius
....

のようになっているものとします。(ただし速度情報は今回は使いません)

■ 元データを変換する方法は複数考えられます。前セクションで見た awk を使うこともできるでしょう。

awkでの変換のサンプル->

■ ここでは、スクリプト言語の定番の一つである perl を使ってみます。

#! /usr/bin/perl

$input = "SAMPLEDATA/Dust001.txt";
$output = "POVSEQUENCE/povout.pov";

open (IN, "< ${input}");    
open (OUT, "> ${output}");

while ($line = <IN>){
    ($x, $y, $z, $dummy, $dummy, $dummy, $r) 
        = split(/\s+/, $line);
    
    printf OUT "sphere {\r\n";
    printf OUT "\t<$x, $y, $z>, $r\r\n";
    printf OUT "\tpigment {\r\n";
    printf OUT "\t\trgbt <1, 1, 1, 0>\r\n";
    printf OUT "\t}\r\n";
    printf OUT "}\r\n";
}
システム内のperlの位置

入力ファイル名
出力ファイル名

入力モードでオープン
出力モードでオープン

入力を1行づつ読むループ
各変数に代入する


出力フォーマット
(Windows環境を想定して
改行記号\r\nとしている。
Linux/UNIX系OSでは\n
となる。)



■ perl の文法についての詳細は省きますが、perlに限らずプログラミングをした経験があれば大体の見当はつくと思います。
あまり他の言語で見ない perl のコマンド\yen nとしては

$line = <IN> で入力モードで開いたファイルを一行取り込む。
= split (/\s+/, $line); で、一行の文字列を、1文字以上の空白(\s+)で区切って分割して、左辺に代入する。

などでしょうか。興味があれば perl の解説文書などをあたってください。
この解説を作っている間に発生したperl関係のトラブルなどのメモをリンクしておきます。→■


■ これでメインの描画部分は完成したので、カメラや光源の設定を付け足すことでスナップショットを作ることができます。

■ この図は16384個の球から構成されるデータの出力です。

■ 光源が一つでアンチエイリアス無し640x480 程度の画像であれば、Pentium4 で 3〜4秒ほどで描画することができました。


1.2 マクロを使ってシンプルにする

■これで表示部分はo.k.なのですが、16384個分のデータがあるため、.povファイルは大きくなりました(1.36MB)。

この手のファイルはできるだけサイズを小さくしたほうが便利なので、マクロを利用してみます。

■ マクロを作るのは簡単で、#macro と #end で囲むことによってマクロになります。

#macro S(p, r)
sphere{
  p, r
  pigment {
    rgbt <1, 1, 1, 0> 
  }
}
#end

■これを.povファイルのはじめに定義しておくことにより、球の表示は

 S (<x, y, z>, r) 

のように一行で書ける様になります。球を書き込む部分スクリプトもシンプルになります。

#! /usr/bin/perl\yen n

$input = "SAMPLEDATA/Dust001.txt";
$output = "POVSEQUENCE/povout.pov";

open (IN, "< $input"); 
open (OUT, "> $output"); 

while ($line = <IN>){
    ($x, $y, $z, $dummy, $dummy, $dummy, $r)
	= split(/\s+/, $line);

    printf OUT "S(<$x, $y, $z>, $r)\r\n";
}

■マクロを解釈するために実行速度は僅かに落ちますが、マクロの解釈などよりも実際のレンダリングの方が重い処理のため、ほとんど差は生じないでしょう。
これでファイルサイズは666KBと半分以下に縮みました。


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