3DCGbook

映像プロダクションに所属しています。主に毎日のアウトプットを配信していこうと思います。

フェイスにマテリアルをアサインするというヒストリー

フェイスにマテリアルを適用するのって便利ですよね!
それについてちょこっとだけお話。

1. フェイスにマテリアルがアサインされた状態。

f:id:blendcomp:20150122212616j:plain

2. polySmoothFaceをかけた状態

f:id:blendcomp:20150122212624j:plain

あれ!アサインしたのにどっかいっちゃった…。

f:id:blendcomp:20150122212804j:plain

底にいました!


これは、polySmoothFaceをかけてからフェイスにマテリアルをアサインした結果です。
本来であればアサインした後にpolySmoothFaceをかけるのが正解です。

ローポリゴン状態のFaceIDでSmooth後もアサインされるのでこのような結果になります。

上流にヒストリーがある状態でフェイス単位でアサインすると思わぬ結果を招くことになるということです。

ちなみに、フェイスアサインって何通りか存在します…。
なので相当嫌な奴です。私はそこまで詳しくはわからないのですが…。

Shape単位でアサインの場合
sphere_geo というノードにRedマテリアルをアサインすると、
sphere_geoShape.instObjGroups[0] -> red_sg.dagSetMembers[*]
がコネクトされます。

フェイス単位でアサインの場合
アサインする順番にもよりますが…
1.Blueマテリアルがアサインされているsphere_geoがある
2.部分単位でRedマテリアルをアサインする
3.もう一つ部分単位でGreenマテリアルをアサインする

そうすると以下ののようなコネクションが作られます。
sphere_geoShape.instObjGroups[0].objectGroups[*] -> blue_sg.dagSetMembers[*]
sphere_geoShape.compInstObjGroups[0].compObjectGroups[*] -> blue_sg.dagSetMembers[*]

sphere_geoShape.instObjGroups[0].objectGroups[*] -> red_sg.dagSetMembers[*]
sphere_geoShape.instObjGroups[0].objectGroups[*] -> green_sg.dagSetMembers[*]

最初にアサインされていたものだけ2本コネクションが繋がります。

また、objectGroups[*]やcompObjectGroups[*]というアトリビュート…。
これはフェイスにアサインを繰り返すたびにどんどん増えていく仕様です。

f:id:blendcomp:20150122220827j:plain

うーん、スクリプトを考えると面倒くさすぎる仕様ですね。
レンダーレイヤーとかはもろに直結しそう。

なので、できるだけフェイスにアサインは控えたいものですね。