Kantan Mapperはマスク毎に画像を張り込むような使い方では、簡単にセットアップすることができるのですが、以前紹介した、複数のマスクに対して1つの画像をマッピングするケースでは、コンポーネントのUV設定機能を使用できないため、マスクと画像の位置合わせを決めてしまうと、マスクの位置調整ができないという問題がありました。そこで、Kantan Mapperのコンポーネントに後付け改造で、マスクの変更に追従して設定した画像をアップデートする仕組みを考えてみました。
まずは、Kantan Mapperで通常通り、マスクを作成します。マスクがすべて」完成したら、このKantan Mapperをコピーします。オリジナルのKantan Mapperはマスクデータのために使用します。コピーしたKantam Mapper1の中に移動して、上記のようなネットワークを追加します。
このネットワークは、UV_Templateというオブジェクトコンポーネント中で、作成した複数のマップ 対 1つの画像の関係のテクスチャUV持ったオブジェクトが新たに作成されます。後述で詳細を説明しますが、UV_Templateオブジェクトは基のKantan Mapperのエディタで作成したマスクオブジェクトを動的に参照して、1つのオブジェクトにマージしているため、このままでは、マップが変更される度にテクスチャUVもアップデートされてしまいます。そこで、null SOPを接続して、Lockを掛けることで、マスクをセットアップした時のUV_Templateオブジェクトの状態を保持します。保持したオブジェクトのテクスチャUVとアップデートされるマスクのオブジェクトデータを2コイチ合成することで、マスクの変形にマッピング画像も追従するようになるという仕組みです。以下よりUV_Templateオブジェクトの詳細を説明します。
UV_Templateオブジェクト内のネットワークは上図のような仕組みです。ObjectMerge SOPでKantan Mapperで作成したマスクオブジェクトを参照して1つにまとめています。これとカメラからの視野一杯になる大きさの1ポリゴンのグリッドをマージすると、テクスチャUVを作成するためのテンプレートオブジェクトになります。
テクスチャUVを生成するオペレータは、次に続くTexture SOPなのですが、Texture SOPはマッピングするオブジェクトのバウンディングにテクスチャデータの縦横比率を合わせて、テクスチャUVを生成します。
そこで、画像とマスクの位置をぴったり合ったテクスチャUVを作成するために、マッピングする画像の縦横比と同じグリッドをカメラ一杯に収まるサイズにしてマージ、Texture SOPでテクスチャUVを生成しています。
Object Merge SOPは、他のジオメトリコンポーネント中にあるSOPを参照することができます。サンプルではKantan Mapperのエディット画面で作成される各タイプのマスクのデフォルト名(rect*、Free*、Bezier*) を自動的に参照する設定になっています。もし、個別のマスク名を指定した場合、ワイルドカードを使用して、オブジェクトを参照している部分をマスク名個別に指定します。
カメラ一杯に収まるグリッドはマスクをレンダリングしている画素数とおなじ縦横サイズのグリッドオブジェクトを作成して、見た目で合わせています。Kantan Mapperのデフォルトの設定では、だいたい0.000795スケーリングすると、カメラ一杯のサイズになります。他のマップサイズでもこの設定で対応できると思います。このオブジェクトはMerge SOPで常に1番最後にマージするようにします。
マージしたオブジェクトにTexture SOPを追加すれば、テクスチャUV付きのオブジェクトが完成しますが、Merge SOPで最後にマージした、カメラ一杯のグリッドはテクスチャUVを設定するためのガイドで、マスクとしては不要なので、Delete SOPで削除します。常に一番最後に追加されているオブジェクトなので、NumberタブのUse Numberをチェックして、OperationパラメータをDelete dy Primitiveに、Patternを入力オブジェクトのプリミティブ数を表す$Nに設定して、グリッドのみを削除します。この状態では、既にテクスチャUVは設定されており、削除されたデータはマスクと関係の無い最後の部分なので、UVデータが破綻しません。あとは外部への出力コネクタのために、Out SOPを追加すれば、UV=Templateオブジェクトは完成です。
UV_Templateオブジェクトの出力コネクタにNull SOPを2つ接続します。Pointo SOPを追加して、2つの入力コネクタにNull SOPを接続します。Input2に接続されているNull SOPをLockします。これで、Lockした時点でのUV_Templateオブジェクトが保持された状態となり、Point SOPのInput1から入力されるオブジェクトはKantan Mapperのエディットによってアップデートされたものが常に入力され、Input2から入力されるオブジェクトはLockされた状態のものが入力されることになります。デフォルトの状態ではInput1のオブジェクトがそのままスルーするだけなので、パラメータを設定して、テクスチャUVだけInput2のデータを参照して出力するように設定します。
Add TextureのTextureパラメータを$MAPU2、$MAPV2、$MAPW2に設定します。これで、Input2のテクスチャ UVを参照して出力されるようになりました。あとは、Out SOPを追加して、Kantan Mapperコンポーネントからこのオブジェクトを出力するコネクタ設定します。
サンプルでは冒頭のネットワーク図にあるように、2つのKantanMapperコンポーネントからそれぞれイメージとオブジェクトをジオメトリ・コンポーネントに接続していますが、イメージのソースは直接イメージデータを参照してもかまいません。調整を反映した状態のイメージを出力するためには、もう一度Render TOPでレンダリングする必要があるため、便宜上別のジオメトリ・コンポーネントでオブジェクトとイメージを参照しています。中のネットワークも単純なもので、入力されているオブジェクトに対してMaterial SOPでイメージをしているだけです。