てれび・さろん 私の研究開発ツール 第13回

 CGツール POV-Ray

大阪大学 産業科学研究所 向川康博

このページは,映像メディア学会誌 私の研究開発ツール「POV-Ray」 を補うために作成しました. 学会誌と併せてご覧ください.

 はじめに

POV-Ray (Persistence of Vision Ray-Tracer)は, 3次元CGを簡単に作成できるツールである. レイトレーシング法によってレンダリングするため, フォトリアリスティックな画像を容易に作成できる. 図1は,3次元スキャナで計測した著者の頭部を, POV-Rayでレンダリングした例である. POV-Rayはオープンソースのフリーウェアであるため, 気軽にCGを試してみることができる. また,マルチプラットホームで開発されており, Windows, Mac OS X, Linuxなどの代表的な環境はもちろんのこと, SunOSなどのUNIX系やMS-DOSなど,ほとんどの環境で動作する.

POV-Rayは,レイトレーシングソフトウェアであるため,CGの研究者でなければ, 自分には関係のないツールだと思われる方も多いのではないだろうか. しかし,POV-Rayは,後述する様々な特徴により, 実は画像処理やコンピュータビジョンの研究にも利用できる便利なツールである. ここでは,POV-Rayで何ができるのかを簡単に述べ, コンピュータビジョン研究でどのように活用できるのかを実例を挙げながら 紹介する.

Face Face

図1 POV-Rayによるレンダリングの例

 POV-Rayの特徴

レイトレーシング

光源から発せられた光は,金属面での反射や水やガラスでの屈折など, 様々な反射屈折を繰り返した後,人間の眼やカメラに到達する. POV-Rayは,視点に入ってくる光を追跡し,どのように反射屈折したかを 調べることで各画素の色を決定するレイトレーシングを行う. そのため,リアリティの高い画像をレンダリングできるが, 光線の追跡には時間がかかるため,リアルタイムCGには向かない. OpenGLなどのグラフィックツールとは,目的も性格も異なる.

可読性の高いシーンファイル

POV-Rayでは,対象シーンを記述したシーンファイルを入力として, レンダリングした画像を出力する. このシーンファイルは,可読性の高いテキストであり, きれいに構造化されているため,人間にとっても直観的に分かりやすい. そのため,ユーザがテキストエディタを用いてシーンファイルを直接記述できる.

レンダラー

CGツールは,対象シーンを記述するためのモデラーと, それを実際に画像に変換するレンダラーに分けて考えることができる. Mayaや3ds Maxなど,ほとんどの商用CGソフトウェアは, モデラーとレンダラーの両方の機能を兼ね備えており, 基本的にはそのツール内ですべての作業を完結することができる. 一方,POV-Rayはレンダラーであり,モデラーの機能がない. これは決して欠点ではなく,この特徴が, コンピュータビジョン研究のためのツールとして活用できる理由でもある. レンダリング機能だけを独立させたことにより, 様々なモデラーと組み合わせることが可能となる.

前述の通り,シーンファイルは,人間が直接記述することができる. この場合は,テキストエディタがモデラーに相当する. もちろん,Bishop3D などのPOV-Ray専用モデラーと組み合わせてもよいし,最近では Shade などの商用CGツールもPOV-Ray形式でエクスポートできるようになってきている.

ただし,コンピュータビジョン研究者が,研究ツールとして利用する場合に重宝するのは, 自作プログラムとの組合せであろう. CやPerlなどで作成したプログラムからシーンファイルを出力し, それをPOV-Rayに渡すことで,シーンの可視化に関する処理を考えなくて済む. この場合,シーンファイルはプログラム間の中間データという位置づけになるが, ここでも可読性の高いテキストであることが,デバッグを容易にする.

以上のように,レンダラーとしての単機能を独立させた仕組みになっているため, 様々なニーズに応じた使い方が可能となる.

オープンソース

CGツールでは, 「表面の粗さ」などのパラメータで質感を制御するが, 実際にその数値がどのように計算に使われているのかが, 明記されていない場合も多い. POV-Rayでは,ソースコードが公開されているため, どのように画素値を計算しているのか疑問があれば, すぐにソースコードを見て確認することができる. また,必要に応じてPOV-Ray改造して利用することも可能である. ソースを解析するというと,大変な作業に聞こえるかも知れないが, 丁寧にコメントが書かれたきれいなソースであるため, 部分的な確認程度であればさほど苦労はない. 中身が分かるツールであるからこそ,研究ツールとして安心して使える.

 簡単な使い方

シーンの記述

以下にシーンファイルの例を示す. テキストエディタなどで入力し, これを「sample.pov」という名前で保存する.

シーンファイルのサンプル:sample.pov
camera{ location <0,0,6>
        look_at  <0,0,0>
        angle 30
}

light_source{ <5,5,5> color rgb <1,1,1>}

object{ sphere { <0, 0, 0>, 1}
        pigment{ color <0,1,0>}
}

次に,このシーンファイルをPOV-Rayでレンダリングすると, 図2のような画像が生成される. シーンを記述するためには, カメラ・光源・物体を記述しなければならない. camera{ … }がカメラに関する定義であり, カメラ位置や視線方向,画角を定義している. light_source{ … }が光源に関する定義であり, 光源位置と照明色を定義している. object{ … }が物体に関する定義であり, 形状(球)と表面色を定義している. 詳しい説明は省略するが,きれいに構造化されているため, 大体の意味は理解できるだろう.

シーンファイルの構造は概ねこのようになっているが, POV-Rayでは様々な省略記法が使えるため, 工夫すればもっと短く,もっと分かりやすく書くこともできる.


図2 シーンファイル sample.povをレンダリングした結果

形状を変える

標準インクルードファイルを使えば,様々な形状を使うことができる. 以下の例では,"shapes.inc" と "shapes2.inc"をインクルードすることで, Cube(立方体), Cone_Y(Y軸方向の円錐),Dodecahedron(正十二面体)を 使っている. なお,以下の例では,"colors.inc"もインクルードすることで, WhiteやGreenといった名称で色を定義するように変更している. 「//」はC++と同様にコメントの記号であり, 立方体だけをレンダリングするようにしている. 図3に示すように,円錐や正十二面体など,様々な形状をレンダリングできる.

様々な形状でレンダリング:shape.pov
#include "colors.inc"
#include "shapes.inc"
#include "shapes2.inc"

camera{ location <0,0,6>
        look_at  <0,0,0>
        angle 30
}

light_source{ <5,5,5> color White}

object{
//      立方体の場合
        Cube rotate <30,0,0> scale 0.7

//      円錐の場合
//      Cone_Y scale 0.9

//      正十二面体の場合(shapes2.incが必要)
//      Dodecahedron rotate <30,0,0> scale 0.8

        pigment{ color Green}
}


図3 形状を変えてレンダリングした結果

反射特性を変える

物体の色は,先ほどの例のようにpigmentで指定する. 一方,反射や屈折については finishで指定する. この例では,specularとroughnessのパラメータによって, 表面の滑らかさを制御している.

反射特性を変えてレンダリング:reflection.pov
#include "colors.inc"

camera{ location <0,0,6>
        look_at  <0,0,0>
        angle 30
}

light_source{ <5,5,5> color White}

object{ sphere { <0,0,0>, 1}
        pigment{ color Green}

// finishで反射特性を制御する
        finish { specular 0.5 roughness 0.1}
//      finish { specular 0.7 roughness 0.01}
//      finish { specular 1.0 roughness 0.001}
}


図4 反射特性を変えてレンダリングした結果

材質を変える

POV-Rayでは,様々な形状や材質を定義した標準インクルードファイルが あらかじめ用意されている. 以下の例にもあるように, 必要に応じて定義ファイルをインクルードすることで, 木材,石,ガラス,金属などのCGを簡単に作成できる.

材質を変えてレンダリング:material.pov
#include "colors.inc"
#include "shapes.inc"
#include "woods.inc"
#include "stones.inc"
#include "glass.inc"
#include "metals.inc"

camera{ location <-3,3,7>
        look_at  <0,0,0>
        angle 30
}

light_source{ <5,6,5> color White*2}

object{ Plane_XZ translate <0,-1,0>
        texture{T_Stone8}
}

object{ Sphere scale 1.4
//      標準インクルードファイルに含まれているテクスチャを利用する
        texture {T_Wood1 scale 2 }
//      texture {T_Stone9}
//      texture {T_Dark_Green_Glass}
//      texture {T_Brass_3B}
}


図5 材質を変えてレンダリングした結果

 コンピュータビジョン研究での活用例

POV-Rayは,CG研究者やアーティストだけのツールではない. シーンを撮影した画像をもとに様々な解析を行う コンピュータビジョン研究者にとっても強力なツールである. ここでは,著者が今までにコンピュータビジョンの研究のために POV-Rayをどのように利用してきたかを紹介したい.

理想的な照明環境での実験

フォトメトリックステレオ法など, 光源方向を変化させた時の陰影の変化を手がかりにシーンを解析する手法がある. 著者も,光源方向を変化させた時の陰影の変化から, 拡散反射・鏡面反射や影などの光学現象を分類する研究をしている. これらの研究では, 環境光が存在しないなどの理想的な照明環境を想定していることが多い. しかし,現実には完全に理想的な照明環境で実験するのは難しい. そこで,POV-Rayでレンダリングした合成画像を用いてシミュレーション実験を行った.

図6は,カメラと物体を固定し, 光源位置だけを変化させてレンダリングした画像である. 光源は垂直方向に4方向,水平方向に5方向の20方向に変化させた. 単に,3次元座標を2次元座標に射影する幾何計算だけなら簡単であるが, 影を正確に描画するのは,自作プログラムでは面倒である. この実験では,シーンファイルを Perlプログラムで出力して, 20枚の画像をPOV-Rayでレンダリングした. これらの画像を用いた実験により, 理想的な照明環境で定量的な評価を行った.


図6 照明方向を変化させてレンダリングした画像

反射屈折光学系シミュレーション

我々は,図7(a)に示すように,双曲面鏡と複数の放物面鏡を組み合わせることで, 全方位360度を観測しつつ, 奥行き推定も可能な複眼全方位センサを開発している. このような,特殊な光学系の開発においては, 光学系の設計から完成までに相当のタイムラグがある. そのため,設計が完了した時点で, 早期にシミュレーションによる評価をする必要がある. この評価においても,POV-Rayは重宝する.

POV-Rayは,放物面や双曲面などの幾何形状を記述でき, かつレイトレーシングもよってミラーでの反射光も正確に追跡できることから, 反射屈折光学系のシミュレータとして活用できる. 図7(b)は,POV-Rayでシミュレートしたシーンである. 複眼全方位センサの近くに,チェッカーパターンの立方体を配置した. このシーンを複眼全方位センサで撮影した場合の シミュレーション画像が図7(c)である. この画像を用いて,センサの性能を評価できる. POV-Rayは反射屈折を扱えることから, このようなミラーを用いたセンサの評価に活用できる.

(a) (b) (c)
図7 複眼全方位センサのシミュレーション

BRDF計測装置とPOV-Rayの連携

物体表面の反射特性は,双方向反射率分布関数(BRDF)で記述できる. 著者は,実物体のBRDFを1度刻みで計測できるシステムを開発している. 図8(a)が計測の対象となる硬貨であり, 図8(b)に示すシステムで等方性BRDFを計測した. これにより,ある光源方向からの入射光照度に対する 視点方向への反射光輝度の比率を, 3次元配列として記録した. しかし,パラメトリック反射モデルを利用せず, 反射率を密に記録した数値データを直接用いて 画像をレンダリングできるソフトは見当たらない.

そこで,計測したBRDFに基づいて画像をレンダリングできるように, POV-Rayを改造した. 図8(c)は,(a)の反射特性を持った竜の形状をレンダリングした結果である. 前述のように,POV-Rayのソースコードはきれいに書かれているため, 改造は容易であった. 実際には,Phongモデルで反射光強度を計算する関数 void do_phong()の中身を, 計測したBRDFに基づいて画像をレンダリングするように書き換えた.

(a) (b) (c)
図8 BRDF計測装置とPOV-Rayの連携

 リンク