存在する全てのオブジェクトに適用されてしまうところ。blender標準のエッジも同様の
仕様なんだから仕方が無いというか、そういうものなんだろうと思っていました。
が、よく調べたらFreeStyleの公式ブログの進捗情報にヒントを発見。
詳細は上記ブログを見てもらうとして、ポイントはビューマップに存在するエッジがどの
オブジェクトのものなのか?が参照できるようにになっていたという点。上記ポストには
これを利用してシーンに存在するオブジェクトの名前を指定して、そのオブジェクトの
ビューエッジを取得するObjectNamesUP1Dクラスがサンプルとして掲載されています。
こんな感じ。
class ObjectNamesUP1D(UnaryPredicate1D):
def __init__(self, names):
UnaryPredicate1D.__init__(self)
self._names = names
def getName(self):
return "ObjectNamesUP1D"
def __call__(self, viewEdge):
return viewEdge.viewShape().getName() in self._names
これを利用して
upred = AndUP1D(QuantitativeInvisibilityUP1D(0),
ObjectNamesUP1D(["Cube"]))
Operators.select(upred)
とするとカメラから見えて、かつCubeという名前のオブジェクトに含まれる、という
条件に当てはまるエッジが取得できるという仕組み。
早速これを利用したスタイルモジュールを作成して実際にレンダリングしてみました。
まずはこんなシーンを作る。
これを各オブジェクトに異なるスタイルモジュールを指定してレンダするとこんな感じ。
やったことは
最初にシーン全体に対して汎用な設定のモジュールでエッジを描画。
次にシーンのSuzanneには左上から順にm01からm12までの異なる名前をつけてあるので
上段(m01〜m04):それぞれ色を変更したスタイルモジュールで上書き
中段(m05〜m08):それぞれエッジ検出とタッチを変更したスタイルモジュールで上書き
下段(m09〜m12):最初に指定した汎用設定の描画のまま上書き無し
という感じ。
ファイル構成としては最初はシーンで使うスタイルモジュールを1個にまとめられないかと
いろいろ試していました。が、スタイルモジュール中で一度作成したビューエッジのを
解放、もしくは上書きしてビューエッジを再作成する、というのがうまく出来ず・・・。
結局シーンで使用するスタイルの数だけスタイルモジュールを作成しています。
というわけで、上記シーンの下段4つは個別のスタイルを割り当てていないので使用した
スタイルモジュールの数は、m01〜m08用にそれぞれ設定を変えた8個+全体描画用の
汎用設定1個の合計9個を使用しています。
ついでに上記シーンのファイルをこちらにアップしてみたり。
個別設定のスタイルモジュールsmod_m01.pyからsmod_m08.pyの8個、全体設定用の
スタイルモジュールのsmod_main.py、シーンの.blendファイルが含まれています。
freestyle関連は設定済みなので、ファイルを開いてレンダすればスタイルモジュールを
適用した状態でレンダされるはずです。
---------------------------------------------------------------
コメントなどありましたらこちらへ->web拍手