経緯
以前、「Vim Scriptでもレイトレーシングができるのではないか?」ということを考えていました。 昨日早朝、布団の中でそのことを突然思い出したので布団を飛び出し衝動的に実装しました。
機能
このような画像をPPM形式で生成できます。 256x256ピクセルの画像を54秒で生成できました。(Intel Core i5 3.40GHz、Vim 7.4)
点光源と影、反射を実装しました。 物体は球体しか実装していないので、平面のように見える白い床も実は巨大な球体です。
今のところは球体の位置や色、画像サイズもすべてハードコーディングされています。
気づいたこと
Vim Scriptには制御構造や関数のほかに浮動小数点数、リスト、辞書のデータ構造を持っているので、 基本的にはRubyやPythonのような言語に近い感覚でプログラムが書けます。
しかしレイトレーシングを書くには若干心細く、
max
/min
関数が浮動小数点数に対応していない/比較方法を指定できない- ファイル出力が
filewrite
関数(行のリストを一気に書き出す)しかない - バイナリファイルに0を出力するために
nr2char(0)
を使うと、ヌル文字ではなく空文字列''
が返る
という問題がありました。そのために
という方法で解決しています。
まとめ
Vim Scriptは浮動小数点数の扱いやバイナリファイル入出力などの機能がレイトレーシングには若干心細く思います。 しかし、他の言語と比べて極端に難しいというわけでもなく、それなりに複雑な処理も書くことができました。