シェーダーグラフで木の枝と葉のマテリアルが付いたPlaneを揺らいてみました。
まず一枚のPlaneでテストしました。Blenderの頂点ペイントモードですべての頂点を黒で塗り、揺らしたい頂点だけを赤で塗りました。
この葉の部分にUnityでマテリアルを付けます。マテリアルにはシェーダーグラフが設定されています。
シェーダーグラフでは、まず頂点カラーのR値をSplitノードで取り出して、Comparisonノードで1と比較します。同じ値のときにTrueになるようにしました。
それとは別にTImeノードをコサインにつないで、上下し続ける値を作ります。
BranchノードのPredicateにComparisonの出力をつないで、頂点カラーのR値が1のときは、Timeノードからの値が、そうでないときは0が出力されるようにします。
この出力とPositionを足してマスターのVertex Positionにつなぎました。それによって、赤くした頂点は周期的に動き、黒いところは動かないようになります。
さらに、Branchノードの出力とNormal Vectorをかけると、法線方向に沿って動くようになりました。
次に、周期的な動きを調整するために、Timeノードに値を足して、それに別の値をかけ、コサインにつないだ後にまた別の値をかけてからBranchノードに入力するようにしました。
これは、三角関数の基本形の、y = 振幅 * cos周期(θ – 位相)の式のとおりに、振幅、周期、位相を変えられるようにしただけです。
しかし、これだけでは葉が複数ある場合に全て同じ動きになるので、葉ごとに別の値を使って動きを変えたいです。同じPlaneに属する頂点を同じ動きにすることもできますが、今回はPlane1つに葉がたくさん付いているので、頂点ごとに値を変えてみました。
例えば、初めに足す位相に、PositionノードのBの値をかけました。これで上下に2つ並んだ葉の動き方を変えられました。
高さによって位相を変えたので、全体として上下に波打つように動いています。RGBのB(XYZのZ)が高さなのは、このオブジェクトのローカル空間での高さ方向がZ軸だからだと思います。
同じように周期にかければ上にある葉のほうが早く動きます。
このように、位置の値をそのまま使うと不自然なので、Simple Noiseノードでノイズを加えてみました。Positionノードの値はUVに入力しました。
これで、位置の値がノイズテクスチャのどの部分の値を取り出すかを決めて、その出力値を位相や周期、振幅に使えるようになると思います。
次は木のモデルにこのマテリアルを付けて揺らしてみます。