ToyBox を RIB 対応にする話
ToyBox をシーンデータにより駆動させる必要が出てきたので、取り急ぎ RIB (*1) 対応の作業を開始しました。
*1 RIB - RenderMan Interface Bytestream protocol の事で、ものすごく大雑把に言ってしまうと RenderMan(PRMan) で使う入力ファイルの書式。RIB で書かれたファイルを RenderMan に与え、RenderMan はそれを解釈して画像を生成します。
この手の作業をするには yacc/lex を使うのが常套手段なので、今回は C# 版の yacc/lex とでも言うべき gppg / gplex を使用しました。公式ページで配布されている説明書はもちろんですが、日本語で書かれた下記のページも参考になりました:
「gppg/gplexを使って簡単なコンパイラを作成する」
「C#で構文解析:GPPG を Visual Studio で使ってみる」
gppg および gplex の力を借りて tb.exe を作ってみました。
現在対応している RIB のコマンドは、Essential RenderMan に掲載されている最小のシーンを参考に、
以下のシーンデータ(test1.rib)
# test1.rib - a minimal scene
Display "min.ppm" "file" "rgb"
Projection "perspective"
WorldBegin
Translate 0 0 2
Sphere 1 -1 1 360
WorldEnd
を tb.exe test1.rib として実行すると以下のようなイメージが得られます(生成されるのは min.ppm ですが web に掲載する為に PNG フォーマットに変換しています):
備考: 画角やピクセルサイズ等、RenderMan のデフォルト値がどうなっているのか分かりませんでしたので、Essential RenderMan に載ってる絵とは異なります(どこかに資料があれば、RenderMan のデフォルト値に合わせておきたいと思いますが…)。
*1 RIB - RenderMan Interface Bytestream protocol の事で、ものすごく大雑把に言ってしまうと RenderMan(PRMan) で使う入力ファイルの書式。RIB で書かれたファイルを RenderMan に与え、RenderMan はそれを解釈して画像を生成します。
この手の作業をするには yacc/lex を使うのが常套手段なので、今回は C# 版の yacc/lex とでも言うべき gppg / gplex を使用しました。公式ページで配布されている説明書はもちろんですが、日本語で書かれた下記のページも参考になりました:
「gppg/gplexを使って簡単なコンパイラを作成する」
「C#で構文解析:GPPG を Visual Studio で使ってみる」
gppg および gplex の力を借りて tb.exe を作ってみました。
現在対応している RIB のコマンドは、Essential RenderMan に掲載されている最小のシーンを参考に、
- # (コメント)
- Display
- Projection
- WorldBegin - WorldEnd
- Translate
- Sphere
以下のシーンデータ(test1.rib)
# test1.rib - a minimal scene
Display "min.ppm" "file" "rgb"
Projection "perspective"
WorldBegin
Translate 0 0 2
Sphere 1 -1 1 360
WorldEnd
を tb.exe test1.rib として実行すると以下のようなイメージが得られます(生成されるのは min.ppm ですが web に掲載する為に PNG フォーマットに変換しています):
備考: 画角やピクセルサイズ等、RenderMan のデフォルト値がどうなっているのか分かりませんでしたので、Essential RenderMan に載ってる絵とは異なります(どこかに資料があれば、RenderMan のデフォルト値に合わせておきたいと思いますが…)。
コメント
コメントを投稿