tana_ash's diary

プログラミングや電子工作など。やってみたこと、わかったことをまとめておく場所。

Vim Scriptでレイトレーシング

経緯

以前、「Vim Scriptでもレイトレーシングができるのではないか?」ということを考えていました。 昨日早朝、布団の中でそのことを突然思い出したので布団を飛び出し衝動的に実装しました。

tana/vimtracer · GitHub

機能

このような画像をPPM形式で生成できます。 256x256ピクセルの画像を54秒で生成できました。(Intel Core i5 3.40GHz、Vim 7.4)

f:id:tana-ash:20150221201422p:plain

点光源と影、反射を実装しました。 物体は球体しか実装していないので、平面のように見える白い床も実は巨大な球体です。

今のところは球体の位置や色、画像サイズもすべてハードコーディングされています。

気づいたこと

Vim Scriptには制御構造や関数のほかに浮動小数点数、リスト、辞書のデータ構造を持っているので、 基本的にはRubyPythonのような言語に近い感覚でプログラムが書けます。

しかしレイトレーシングを書くには若干心細く、

  • max/min関数が浮動小数点数に対応していない/比較方法を指定できない
  • ファイル出力がfilewrite関数(行のリストを一気に書き出す)しかない
  • バイナリファイルに0を出力するためにnr2char(0)を使うと、ヌル文字ではなく空文字列''が返る

という問題がありました。そのために

  • 浮動小数点数リストの最小値を求めるfmin関数を自作する
  • PPMファイルをバイナリ形式(P6)で出力することを断念し、テキスト形式(P3)で出力する

という方法で解決しています。

まとめ

Vim Scriptは浮動小数点数の扱いやバイナリファイル入出力などの機能がレイトレーシングには若干心細く思います。 しかし、他の言語と比べて極端に難しいというわけでもなく、それなりに複雑な処理も書くことができました。