はじめに
ツイッターでpovrayで検索すると、学校の課題でヒーヒー行っている学生さんらしきツイートを多々目にするため、POV-Rayをあまり知らないと悪いイメージがあるかもしれません。
しかし、Qiitaの住人の方々の様にコードがスラスラかければ、色々おもしろいことが出来ます。
今回は微分方程式の解のプロットを各座標を球に置き換えて、POV-Rayでそれらの周りを回るアニメーションを作ってみます。
Maximaでローレンツアトラクタのデータをつくる
lorenz.txt
load("dynamics");
f(x,y,z):=-10*(x-y);
g(x,y,z):=-y-x*z+28*x;
h(x,y,z):=x*y-8/3*z;
rkdat:rk([f(x,y,z),g(x,y,z),h(x,y,z)],[x,y,z],[1,1,1],[t,0,50,0.01]);
system("pwd");
write_data(rkdat,"rk.dat");
プロットデータをPOV-Rayのファイルにする
今回は、Perlで出力された各プロットを球として表示するようにしてみました。
#!/usr/bin/env perl
print<<'EOF';
#include "colors.inc"
#include "skies.inc"
#include "glass.inc"
camera{
location <sin(clock*pi*2)*600,0,cos(clock*2*pi)*600>
up <0,1,0>
look_at <0,0,0>
}
light_source {
<100,100,-100>
color rgb <1,1,1>
}
EOF
while(<>) {
@dat=split(/ /);
@dat = map {$_ * 10} @dat;
print<<"EOF";
object {
sphere {<$dat[1] , $dat[2] , $dat[3]>,1}
material {
texture {
pigment{color Clear}
finish{ F_Glass1 }
}
interior {
I_Glass1
fade_color Col_Emerald_03
}
}
}
EOF
}
print << 'EOT';
sky_sphere {
S_Cloud5
}
EOT
chmod +x plot3d.pl
cat rk.dat |./plot3d.pl >test.pov
POV-Rayでレンダリングする
以下のコマンドで、レンダリングして、結果を複数のPNGファイルに書き出せます。
povray +A +H768 +W1024 +KFF60 test.pov
静止画から動画に変換する
ffmpegでOSXのQuikTime Playerで開くことの出来るフォーマットで出力してみます。
ffmpeg -r 30 -i test%02d.png -vcodec libx264 -pix_fmt yuv420p lorenz.mp4
まとめ
微分方程式の解をPOV-Rayでレンダリングして表示することが出来ました。