UE4にPivotPainterという機能があります。モデルにサブオブジェクトの座標軸と向きの情報を格納し、マテリアル関数でコントロールするための機能です。
この機能を使用しなくてもシェーダーのヴァーテックスオフセットが使えるので、サイン波などで揺らがせることはできるのですが、それだけではすべてのメッシュが均等に変位してしまいます。マスクを当てるなどしてオフセットを制限したり、特定の頂点だけ別の向きに動かしたりということも可能なのですが、プロジェクトごとにその機能を作るのも手間だろうということで、用意されたのがこのマテリアル関数ということなんだと思います。
3DSMax用のスクリプトが提供されているのでMaxユーザーはスクリプトを使用するのが簡単なのですが、ぼくはMaxを使用していないので、せめてどこで制御していればわかれば、手間はかかるけど同じようなことができるのでは?と思ったので調べてみました。
結論から書くと、サブオブジェクトの位置座標を格納するのに2つのUVを使用しているようです。
サンプルのオブジェクトではUVを4つ使用しているのですが、そのうち三番目のUVのUがX座標、VがZ座標、四番目のUVのUがY座標を表しています。
(一番目のUVはカラーマップ用、二番目のUVはLightMap用です)
また頂点カラーで軸の向きを制御しているようです。頂点カラーのRGBがそれぞれXZYに当たります。RGBの値が1がプラス方向、0でマイナス方向を表します。 つまりX軸に+方向を向いているサブオブジェクトはRGBで(1,0.5,0.5)となります。
UE4のContentsExsampleに分かりやすい例が入っていました。
この仕組みを理解すればPivotPainterのスクリプトがなくても、PivotPainterのマテリアル関数を使用して制御できるはずです。…はずなんですが、残念ながらBlenderの場合、UVの値があまりに大きな数値になるとどうも値が計測値と一致しません。
しょうがないのでサンプルオブジェクトをガイドにそれっぽい位置にくるように調整してみました。4つのスザンヌはボーンも入ってない一つのメッシュとしてエクスポートしているのですが、PivotPainterの機能によってそれぞれの軸で動いているように見ます。
複数のオブジェクトのように扱えますが、ひとつのオブジェクトなのでドローコールにも優しいです。
PivotPainterには他にも階層をもったモデルのように扱う機能もあるのですが、どんな情報をどこに保存してるのかまだわかっていません。でもUE4からBlenderにインポートして、編集後にUE4に持ち込んでも同じように動くので、Blenderで扱えない情報ということはないはずです。
Blenderのスクリプトに精通している方がいましたら、ぜひPivotPainterのBlender版を作ってください!
ちなみにフォートナイトというEpicのタイトルではPivotPainterを独自に拡張して、破壊の順番なども制御できるようにしているということです。