実際の作業は、BlendShapeノードとanimCurveの分析から始まった。
ブレンドシェイプのウェイト値をペイントしただけでは変化はないが、それにキーを打った後、ハイパーグラフで見ると、blendShapeのインプット側にanimCurveTUというノードが複数接続されている。
この最後に付いているTUとはインプットのタイプが時間(time)であり、アウトプット・タイプが倍精度(doUble)であることを示している。
複数あるのは、それぞれのバーテックス毎にわかれているからだ。
通常のオブジェクトのアニメーションで、Translateだけにキーフレームを打つと、これがanimCurveTLという名称となる。(Timeとdistance)
(参照: オンラインヘルプ animCurve)
このanimCurveTUノードには、
blendShape1_inputTarget_0__inputTargetGroup_0__targetWeights_359_
といったように非常に長い名前が付いている。
左側から
ブレンドシェイプ名
インプットのターゲット番号(?)
ターゲットのグループ番号
バーテックスID
となっているようで、最後にアンダースコア「_」で終っている。
そしてこれが同じ名称のblendShapeノードのアトリビュートにつながっている。
blendShape1.inputTarget[0].inputTargetGroup[0].targetWeights[359]
どうやらblendShapeノードには、それぞれのバーテックス情報を個別に扱えるようになっているらしい。
(参照: オンラインヘルプ blendShape)
この接続自体は非常に単純なのでわかりやすい。
出力されるWeight値は、animCurveノードの値と現在のタイムライン上の位置から割り出される。
ためしにあるバーテックスに目星を付け、そのバーテックス番号を控えておき。
該当するanimCurveノードの「Keys」セクションにあるValueを変更すれば、
対応するバーテックスのウェイト値がかわるので、ビュー上でバーテックスがいどうするのが見て取れる。
ここでweight値のキーフレームは0~1の間で、たとえば「0.0863807」という細かな桁までの情報が保存される。
-----------
さてここまでで、以下の事がわかった。
1)各バーティックスはBlendShapeノードによって管理される。
2)BlendShapeノードは、各バーテックスのweight値をanimCurveノードから取得する。
3)animCurveの値は0~1の間の値をとる浮動小数点数(倍精度)である。
すなわち、animCurveノードでなくても、0~1の浮動小数点数を出力することができるノードがあれば、BlendShapeノードを通してバーテックスのweight値がコントロールできることになる。
rampと組み合わせるには、以下のようなことが必要になることがわかる。
1)rampテクスチャーが適用されたオブジェクトにおいて、各バーテックスのカラー情報(グレイスケール)を取得する。
2)その情報を出力し、BlendShapeの各バーテックスのコントロールへ接続する。
3)各バーテックスのカラー情報は、UV座標から得る。
(続く)
0 件のコメント:
コメントを投稿