3次元モデルを閲覧するビューワー

簡単にプロファイラでレイトレーサーの処理時間を計測したところ、やはりレイとオブジェクトとの交差判定がボトルネックになっていることが分かりました。元々、コーディングにおいてあまり実行速度を配慮してない事もあるのですが、このままだとレンダリング処理が複雑になるにつれて、テストの実行時間が長くなり、作業効率が悪くなる一方です。
そこで、シェーディング周りの作業は置いておいて、取り急ぎシーン中のオブジェクトを空間データ構造によって管理する作業に取りかかることにしました。扱う空間データ構造は、プログラムの設計上、後から交換可能にしておいて、最初は比較的単純なkdツリーにしようと思います。ただし実装するにあたって、単体テストのみだと空間がどのように分割されているのか分かりにくいので、先にツリーを視覚化するビューワーを作成することにしました。大まかな方針は以下の通りです。

  • テストプログラムを実行して、構築したkdツリーのノード情報を収集する
  • 収集したノード情報を元にモデルデータを出力する
  • 出力したモデルデータをビューワーからインポートして視覚化する

モデルデータのフォーマットは、いろいろ迷った挙げ句、PLYにしました。PLYはデータ構造が単純なのでインポートプログラムが書きやすい点が魅力です。また、ASCII形式をサポートしているので、テキスト処理が得意なスクリプトでモデルデータを作成するのにも便利そうです。
ビューワーの作成には、RubyOpenGLバインディングruby-openglを使いました。手続きが煩雑になりがちなOpenGLプログラミングも、Rubyで書くとなんだか手軽で、C/C++の場合と較べるとずっととっつきやすいですね。ただ、遊びでトラックボールのような操作を真似ようとしたものの、マウスの動きから求めた任意軸の回転が思うようにいかず、ちょっと残念。クォータニオンを使うと、回転変換の加算や乗算を扱えるため制御しやすく、単純な計算式で実現できるみたいですが、クォータニオン自体がよく分かっていないので今後の課題にします。まあ、開発ツールですから多少不具合があっても十分でしょう。とりあえず次の場所にソースコードを曝しておくので興味のある方はどうぞ。
http://homepage.mac.com/radio_nights/files/viewer.tar.gz

自作ビューワーでStanford-Bunny *1 を表示したところ。

*1:The Stanford 3D Scanning Repositoryで公開されているPLYファイルは、レンジイメージとして保存されているので、Blenderを使ってポリゴンデータに変換して利用しました。