2010年1月29日金曜日

Freestyleのスタイルモジュール作成に関してのメモ

Freestyleがblenderから受け取ったViewMapに対して行う処理の種類や流れは

・描画する線の選択
・線の処理(接続、分割、並べ替え)
・線を描画するためのシェーダの準備
・線の描画

というのが大まかなところ。

本家というかスタンドアロン版というか、blender統合でないFreestyleの
公式サイトのチュートリアルにあるサンプルがわかりやすい。
ソースは下のたった4行。
from Freestyle import *
Operators.select(QuantitativeInvisibilityUP1D(0))
shaders_list = [IncreasingColorShader(1,0,0,1, 0,1,0,1)] Operators.create(TrueUP1D(), shaders_list)
ざっと流れをさらっていくと
1行目はお約束。Freestyleのモジュールをインポート。

2行目は線の選択。
blenderのシーンから作成されたViewMapから描画する線をselect()で選択する。
QuantitativeInvisibilityUP1D()は引数に渡した実数以上の視認性がある線を返す
とかそんな感じみたい。
上記サンプル中では引数が0なので、結果としてとりあえずカメラから線として
見えてるものは描画する線として選択する、という状況。
もちろん物体の影になってる陰線は選択されない。

3行目はシェーダの準備。
例えるならどんなペンや筆で2行目で選択した線を描画するかを決める感じ。
IncreasingColorShader()は線の始点から終点にかけて色が変化していくペン。
最初の4つの引数が線の始点における色、あとの4つが終点における色。
4つの引数は頭からRGBA。
なのでこの場合、描画された線は始点が赤、終点で緑になるような色の変化をする。

4行目で実際に線を描画。
create()の1番目の引数に指定されているTrueUP1D()がよくわからん。
描画する線として選択した線は内部では外形線なのか、それともカメラの始点から
山や谷を見たときにでてくる稜線なのかといった具合に細かく分類されているみたい。
で、TrueUP1D()はそういった分類された要素のすべてを返すという感じっぽい。
2番目の引数は1番目に指定された線を描画するためのシェーダを指定する。
ここでは3行目で準備した赤→緑に色が変わるシェーダを指定していることになる。

結果としてこのサンプルのスタイルモジュールは、カメラから線として見えてるものを
すべて赤→緑に色が変わるペンで描いたような出力をするという感じ。

実際にFreestyle統合版のblenderでテストするとこんな具合に。
まずはblenderでのシーンのスクリーンショット。





で、統合版のFreestyleはViewMapを見ることができないけど
このシーンのViewMapはこんな感じのはず。




サンプルのスタイルモジュールを適用したFreestyleのレンダ結果はこんな感じに。
マテリアルがデフォルトの灰色のままなのでちょっと見づらいかも。




上記の公式サイトを見るとシェーダや線の選択や作成のアルゴリズムみたいなものまで
pythonで書いて拡張できるみたい。ペンというかシェーダのパターンに画像ファイルを
指定したりとかもできるっぽい。

---------------------------------------------------------------
コメントなどありましたらこちらへ->web拍手