2006年06月10日
グループマスクはちょっと危険 modo201
modo201のShaderTreeにはいろんなマスクが用意されている。今回はグループマスクを使って変なことになったので書いておく。結論から言うと、グループマスクを指定する時はItemとPolygonTagの両方で同時に絞り込むのはやめた方がいいようだ。以下はおかしな現象が起きた例。
まずSHIFTを押しながら球と円柱の作成ボタンをクリックして2つアイテムを作成して並べる。
次にこれら2つのアイテムの上半分をポリゴン選択してmキーを押し、マテリアルを設定する。
マテリアルの設定パネルが出たら名前をm1にして適当な色を付けて置く。
残りのポリゴンもm2という名前で適当な色をつけてマテリアルを設定しておく。
modoのメッシュデータはポリゴンに対してTagというものが付加出来るようになっている。マテリアルはそのタグの1つだ。他にもSelection SetやPartというタグが使える。マテリアルは光沢や色などいろいろなパラメータを含んでいるが、SelectionSetやPartは付加情報が無い。2つの違いはSelectionSetが同じポリゴンに対して重ねて設定できるのに対してPartは1種類しか設定できないところだ。
さて次に球体の方のアイテムにアイテムマスクを設定する。アイテムリストのSphereは右クリックしてCreate Item Maskを選択するだけだ。
こうして設定した結果がこのShaderTreeだ。Item:sphereという名前のアイテムマスクが出来ているのが確認できる。開くと図のように中にはマテリアルが1つ入っている。その下に並んでいるm2、m1は先に作ったマテリアルだ。これも実際のマテリアルはm1、m2の階層の下に配置されている。この、Item:sphere、m1、m2などのマテリアルが入っている入れ物が、それぞれのマテリアルが適用される範囲を限定する役割を果たしている。この入れ物がグループで、これでマスクするからグループマスクと言うらしい(effectにも同じ名前のものがあるからややこしい)。ShaderTree内のリストは上にあるほど優先順位が高く、一番上のマテリアルが全てをカバーしてしまえば、その下のマテリアルは全部無視される。グループマスクによって適用される範囲が限定されると、そのグループ内のマテリアルに影響されないポリゴンが出てくる。それが下のマテリアルでカバーされていく。全ての設定から洩れたポリゴンはBaseMaterialの設定になる寸法だ(もちろんそうならないようにも出来る)。
先に作成したアイテムマスクがどのような設定のグループなのか見てみると、Itemで対象を絞り込むようになっていて、PolygonTagTypeをMaterial、PolygonTagはallになっている。「マテリアル全て」という事は何も絞り込んでいないという事で、アイテムマスクがItem項目のみで絞込みをしている事がわかる。ちなみにマテリアル作成で出来たグループはItemがallでPolygonTagTypeがMaterial、PolygonTagにマテリアル名が来る。これで「全てのアイテムの中で特定のマテリアルが設定されているものポリゴン全部」ということになる。
さて、ここからが問題である。アイテムマスクのPolygonTagをallからm1に変えてみる。こうすれば、この階層の下にあるMaterial(3)が影響する範囲がSphereアイテムのm1マテリアルに絞り込まれる筈である。予想を裏切って、Sphereの絵柄は変化しない。これはm1をm2にしても同じである。
次にItemをallにしてみると両方のアイテム共に全体にマテリアルの影響が出てしまった。
ところがここでPolygonTagをm1からm2に切り替えると両アイテムのm2マテリアルが割り当てられたポリゴンのみにMaterial(3)の色が現れた。
さらに再びm1に切り替えると、今度はm1マテリアルが割り当てられたポリゴン全てにMaterial(3)の色が出た。
この状態でItemをallからSphereに戻すと、当初期待していた結果(Sphere内のm1マテリアルが設定されたポリゴンのみにMaterial(3)の色が出る)になる。
さらにm1をm2に切り替えると、またおかしな状態に戻った。
Itemをallに切り替えてから同様の方法でm2に持っていくと、ちゃんと設定が反映された。
以上、どうもItemとPolygonTagは同時に絞り込まないほうが良いようである。Itemが指定されていたらPolygonTagはallに、PolygonTagが指定されていたらItemをallにしておいた方がいらないトラブルは避けられるだろう。これは仕様なんだろうか・・・。
まずSHIFTを押しながら球と円柱の作成ボタンをクリックして2つアイテムを作成して並べる。
次にこれら2つのアイテムの上半分をポリゴン選択してmキーを押し、マテリアルを設定する。
マテリアルの設定パネルが出たら名前をm1にして適当な色を付けて置く。
残りのポリゴンもm2という名前で適当な色をつけてマテリアルを設定しておく。modoのメッシュデータはポリゴンに対してTagというものが付加出来るようになっている。マテリアルはそのタグの1つだ。他にもSelection SetやPartというタグが使える。マテリアルは光沢や色などいろいろなパラメータを含んでいるが、SelectionSetやPartは付加情報が無い。2つの違いはSelectionSetが同じポリゴンに対して重ねて設定できるのに対してPartは1種類しか設定できないところだ。
さて次に球体の方のアイテムにアイテムマスクを設定する。アイテムリストのSphereは右クリックしてCreate Item Maskを選択するだけだ。
こうして設定した結果がこのShaderTreeだ。Item:sphereという名前のアイテムマスクが出来ているのが確認できる。開くと図のように中にはマテリアルが1つ入っている。その下に並んでいるm2、m1は先に作ったマテリアルだ。これも実際のマテリアルはm1、m2の階層の下に配置されている。この、Item:sphere、m1、m2などのマテリアルが入っている入れ物が、それぞれのマテリアルが適用される範囲を限定する役割を果たしている。この入れ物がグループで、これでマスクするからグループマスクと言うらしい(effectにも同じ名前のものがあるからややこしい)。ShaderTree内のリストは上にあるほど優先順位が高く、一番上のマテリアルが全てをカバーしてしまえば、その下のマテリアルは全部無視される。グループマスクによって適用される範囲が限定されると、そのグループ内のマテリアルに影響されないポリゴンが出てくる。それが下のマテリアルでカバーされていく。全ての設定から洩れたポリゴンはBaseMaterialの設定になる寸法だ(もちろんそうならないようにも出来る)。
先に作成したアイテムマスクがどのような設定のグループなのか見てみると、Itemで対象を絞り込むようになっていて、PolygonTagTypeをMaterial、PolygonTagはallになっている。「マテリアル全て」という事は何も絞り込んでいないという事で、アイテムマスクがItem項目のみで絞込みをしている事がわかる。ちなみにマテリアル作成で出来たグループはItemがallでPolygonTagTypeがMaterial、PolygonTagにマテリアル名が来る。これで「全てのアイテムの中で特定のマテリアルが設定されているものポリゴン全部」ということになる。
さて、ここからが問題である。アイテムマスクのPolygonTagをallからm1に変えてみる。こうすれば、この階層の下にあるMaterial(3)が影響する範囲がSphereアイテムのm1マテリアルに絞り込まれる筈である。予想を裏切って、Sphereの絵柄は変化しない。これはm1をm2にしても同じである。
次にItemをallにしてみると両方のアイテム共に全体にマテリアルの影響が出てしまった。
ところがここでPolygonTagをm1からm2に切り替えると両アイテムのm2マテリアルが割り当てられたポリゴンのみにMaterial(3)の色が現れた。
さらに再びm1に切り替えると、今度はm1マテリアルが割り当てられたポリゴン全てにMaterial(3)の色が出た。
この状態でItemをallからSphereに戻すと、当初期待していた結果(Sphere内のm1マテリアルが設定されたポリゴンのみにMaterial(3)の色が出る)になる。
さらにm1をm2に切り替えると、またおかしな状態に戻った。
Itemをallに切り替えてから同様の方法でm2に持っていくと、ちゃんと設定が反映された。以上、どうもItemとPolygonTagは同時に絞り込まないほうが良いようである。Itemが指定されていたらPolygonTagはallに、PolygonTagが指定されていたらItemをallにしておいた方がいらないトラブルは避けられるだろう。これは仕様なんだろうか・・・。

