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

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

<< Prev - Index - Next >>

3 データ間を補間する
3.1 連続データの補間をする

■ シミュレーションのスナップショットの数だけ画像を作っただけでは、滑らかな映像や長い映像は作れません。1秒間に10枚(通常のテレビアニメで秒8枚程度)で動画にしたとして、10秒で100枚のスナップショットが必要です。

■ 山のようにスナップショットデータを取るのでなければ、データを補間して映像化したいところです。
そこで、線形補間を実現するような .pov ファイルを作成してみます。

#! /usr/bin/perl

$input =  "SAMPLEDATA/Dust%03d.txt";
$output = "POVINTERPOLATE/povout%03d.pov";

for ($i = 1; $i <= 9; $i++){

    $fin  = sprintf($input , $i);
    $fin2 = sprintf($input , $i+1);
    $fout = sprintf($output, $i);

    open (IN, "< $fin");   
    open (IN2, "< $fin2"); 
    open (OUT, "> $fout"); 
    
    printf OUT << 'END';
#macro S(p, r)
sphere{
  p, r
  pigment {
    rgbt <1, 1, 1, 0> 
  }
}
#end
camera {
  location <0.6, 0.6, 0.6>
  sky      <0, 0, 1>
  look_at  <0, 0, 0.6>
  angle    45
}
light_source{ 
  <2, 3, 5>
  color rgb 2 * <1, 1, 1>
  parallel
  point_at <0, 0, 0>
}
END
    while ($line = <IN>){
	($x, $y, $z, $dummy, $dummy, $dummy, $r)
	    = split(/\s+/, $line);
	$line = <IN2>;
	($x2,$y2,$z2, $dummy, $dummy, $dummy,$r2)
	    = split(/\s+/, $line);
	printf OUT "S(<
	($x2 - $x) * clock + $x,
	($y2 - $y) * clock + $y,
	($z2 - $z) * clock + $z>,
	($r2 - $r) * clock + $r)\r\n";
    }
    close(IN);
    close(OUT);
    
}
■ Pov-Rayでは、連番画像を順番に出力してアニメーション(の素材)を作る機能があります。
アニメーション作成中の時間の扱いは、変数 clock が 0から1まで変化ことで実現されます

■ 例えば、<0, 0, 0> から <3, 0, 0>まで移動する場合は次のように表現されます。

sphere { < 3*clock, 0, 0>, 1 }

■ 先ほどのサンプルを発展させて、一度に2つのデータを読んで補間するように粒子を配置する .pov ファイルを作成するスクリプトが左になります。

2つのファイルから <$x, $y, $y> <$x2, $y2, $z2> を読み込んで、clock が 0 から 1 に変化するにしたがって、線形に補間された位置に球を表示するように組まれています。

■ これを実行すると

povout001.pov (001 002 のデータの補間)
povout002.pov (002 003 のデータの補間)


povout009.pov (009 010 のデータの補間)

のような形で9個の .pov ファイルが作られます。

■ 具体的に .pov ファイルの中身を1行見てみると、次のような形になっています。

S(<(0.363407 - 0.363407) * clock + 0.363407, (0.354748 - 0.354748) * clock + 0.354748, (0.45668 - 0.419623) * clock + 0.419623>, (0.001 - 0.001) * clock + 0.001)

中身は典型的な線形補間の式 (x2-x1) * t + x1 ですね。


3.2 連番画像を出力する(コマンドライン編)

■ さて時間clockが0から1まで変化するとして、それを何コマで出力するかなどの設定をする必要があります。

■ 一つの方法は、そうした出力設定を定義した .ini ファイルを作成し、それを読み込んでPov-Rayを実行することです。 Windows ではこの .ini ファイルを設定する方法が楽かもしれません。
.ini ファイルを使う方法は連番画像を出力する(.iniファイル編)を参考にしてください。

■ もう一つの方法として、Pov-Ray をコマンドラインから実行して、コマンドのオプションとしてアニメーションの設定を与える方法があります。例えば以下のようなものです。

$ povray /RENDER povout001.pov +KFI0 +KFF10 +SF0 +EF9 +Opovout /EXIT

既に Windows でもコマンドラインで実行できるように既に設定してあるとします。Windows版は、そのまま立ち上げると操作待ちの状態になってしまうので、/RENDER オプションと /EXIT オプションを忘れないようにします。

LINUX/UNIX 用の Pov-Ray は元からコマンドラインで操作するための設計になっているので、コマンドを実行するとレンダリングを開始し、レンダリングが終了すればそのまま終了です。/RENDER と /EXIT オプションは必要ありません。(というか対応していない)

$ povray povout001.pov +KFI0 +KFF10 +SF0 +EF9 +Opovout

■ それでは各オプションの意味を見ていきます。

+KFI0
+KFF10
何枚目から何枚目までを clock の 0 から 1 に対応させるかの設定です。
.ini ファイルでの以下の設定に対応します。
Initial_Frame = 0
Final_Frame = 10
+SF0
+EF9
実際に何枚目から何枚目までレンダリングを実行するかです。
ここでは0〜9までのレンダリングをするようにしています。
.ini ファイルでの以下の設定に対応します。
Subset_Start_Frame = 0
Subset_End_Frame = 9
+Opovout +の後は大文字のオーです。出力ファイル名を設定します。
デフォルトでは .pov ファイルと同じ名前になるのですが、
今回はそのままだと povout001000.bmp … の様に混乱してしまうので、
ファイル名の数字を使わないように強制的に設定しています。
Output_File_Name = povray
に相当します。

■ この他良く使いそうなオプションです。

+Hn
+Wn
高さ(height)と幅(width)の設定です。 ini ファイルでの以下の設定に対応します。
Height=n
Width=n
+A
-A
アンチエイリアスのオンオフです。
オンにすると(時間をかけて)より高画質の絵を作ります
Antialias=ture/false に相当します。(ちなみにyes/no, on/offでも認識します)
+Fxn xは出力するファイルのタイプです。
ファイルタイプは一文字で表現されていて、例えばP'N'GだとNになります。
さらにnで、出力画像の色深度ビット数も指定することができます。
例えばpngはオプションとして5から16までの値を取れます。(通常は8bit)
ファイルタイプは次の選択肢があります。
C Compressed Targa-24 format (RLE, run length encoded)
N PNG (portable network graphics) format
P Unix PPM format
S System-specific such as Mac Pict or Windows BMP
T Uncompressed Targa-24 format
.ini ファイルでの以下の設定に相当します。
Output_File_Type=x
Bits_Per_Color=n
+KIn.n
+KFn.n
clock の変化を 0→1 ではなく任意のn.nからn.nまでにします
Initial_Clock=n.n
Final_Clock=n.n
に相当します。 clockの数式で表したカメラワークの微調整に使うかもしれません。

■ Dust001.txt と Dust002.txt を補間した .pov ファイルで10枚分の動画を作ったのが下の動画です。



3.3 連番画像を全部出力する(コマンドライン編2)

■ 後はすべての .pov ファイルを実行して連番ファイルにすればよいことになります。
きちんとつながった連番にするには、オプションを少し考えなければいけません。

■ 下が(povrayコマンドでpvengine.exeが立ち上がるように設定した)Pov-Ray for Windows での実行コマンドです。
LINUX/UNIX 系では、/EXIT と /RENDER オプションは必要ありません。

povray /RENDER povout001.pov +KFI0 +KFF10 +SF0 +EF9 +Opovout /EXIT
povray /RENDER povout002.pov +KFI10 +KFF20 +SF10 +EF19 +Opovout /EXIT
povray /RENDER povout003.pov +KFI20 +KFF30 +SF20 +EF29 +Opovout /EXIT
povray /RENDER povout004.pov +KFI30 +KFF40 +SF30 +EF39 +Opovout /EXIT
povray /RENDER povout005.pov +KFI40 +KFF50 +SF40 +EF49 +Opovout /EXIT
povray /RENDER povout006.pov +KFI50 +KFF60 +SF50 +EF59 +Opovout /EXIT
povray /RENDER povout007.pov +KFI60 +KFF70 +SF60 +EF69 +Opovout /EXIT
povray /RENDER povout008.pov +KFI70 +KFF80 +SF70 +EF79 +Opovout /EXIT
povray /RENDER povout009.pov +KFI80 +KFF90 +SF80 +EF89 +Opovout /EXIT

■ 連番出力の桁数は、自動で設定されてしまうので、桁が増えたときなどは、+Opovout0 等と、必要な場所で頭に0をつけて桁あわせをする必要があるかもしれません。

今回は手作業のコピー&ペーストでコマンドを入力しましたが、このようなコマンドを出力する様なスクリプトを組んでおけば次から再利用が効くので、興味のある人は頑張ってみましょう。

■ 10 枚のスナップショットファイルから補間した、90枚9秒のFLASHを最後に置いておきます。
(ブラウザの設定によって見えない可能性があります…)


■ いくら補間が効くとはいえ、これ以上スナップショットデータを少なくすると、動きが不自然になりそうです。どれぐらいのスナップショットデータがあれば映像として充分か、シミュレーションの物理とHDDの空き容量と相談して決めることになります。


謝辞:データのサンプルは、北海道大学低温科学研究所(2008年時点)の和田浩二さんに提供いただきました。
<< Prev - Index - Next >>
inserted by FC2 system