Blenderで遊ぶボリュメトリックデータ
縦型MVコンテストの備忘録のラストとして、ボリュメトリックのお話です。
今回、初めてボリュメトリック(以下"ボリュ")に触らせていただき、How-to含めて大変勉強になりました。その過程で学んだアニメーション付きボリュの特徴や演出方法などについてまとめました。
後述のGeometry Nodesを模写すれば、こちらのようなものが出来上がります。
例としてJO1與那城さんのボリュを使用させていただきますが、コンテストが終わった今、当然私に利用権利はないと思われますので、これが最後となります。ここまでは許してくれるかな…怒られたら消します。
今後もJapan Vertical MV Contestさんの一つの特徴として、たくさんの人がボリュに触れる機会になっていけば良いなと思っています。
ボリュメトリックモデルとは
基本
多方向のカメラから被写体の体積を捉え点群に置き換えて、その表面をポリゴン化したもの。
今回のようなアニメーション付きボリュのイメージとしては、踊る仏像の動きを1コマごとに木材から削り出している感じ。ポリゴン化というのは、その彫刻の表面に濡れた新聞紙を糊付けして型をとり、中身(彫刻自体)は抜いた状態。
データの方が分かり易ければ、頂点数分(数万以上)の行のXYZデータが収まったフレーム数分のスプレッドシートがひとつのExcelにまとまっている状態。
データ形式:
Alembic(例:〇〇.abc)
環境依存度が低いのでどのソフトで開いてもアニメーション付きモデルの再現性が高い。
テクスチャ:
mp4
テクスチャ"ムービー"
Blenderでのセットアップ
環境
Macbook Pro M1 (os12.7.2)
Blender 4.0
インポート
インポート>Alembic で該当データを選択。
スケールを設定してインポート。
データ提供元からスケール指定がない場合は、とりあえず1にして、インポート後に等倍スケールとかにすればOKかと思います。
インポートしたオブジェクトを見ると、自動的に"MeshSequenceCache"モディファイアが追加されている。オプションとして、アニメーションのオフセットとか速度などを設定できる。
テクスチャのセットアップ
オブジェクトに新規マテリアルを追加
イメージテクスチャとしてmp4を参照して、以下のようにノード設定。細かいシェーディングやライトも設定をするまではEmissionに繋いでおけばわかりやすいかと。
初ボリュさんへの注意点
データサイズは通常モデルと比べて激重です。アニメーション付きの今回はオブジェクト1個で3GB越え。でもこれがボリュということか。仕事のときは作業環境と相談しないと致死案件になりうる。
フレームごとに頂点数もインデックスも変わる。ボリュの成り立ちを考えてみればわかることで、ボリュ界隈の方々には当然のことなのかもしれないが、Geometry Nodesでインデックス指定系のノードを組もうとしたときのショックよ…。
遊ぶ前の確認
準備が整ったところで、ボリュの大前提を確認しましょう。
前述の通り、アニメーション付きボリュは固定インデックスではありません。
下記の図のようにGeometry Nodesでインデックス指定しても、指定範囲とそれ以外の境界部分はモニョモニョとランダムに動きます。
なので、アニメーション付きボリュの場合は、空間座標で指定していく、あるいは、他オブジェクトとの相対座標や当たり判定で指定するのがかなと思います。
遊び方
紹介するのは、Geometry NodesでSimulation Zoneを使用する方法です。
再度、成果物はこちらのようになります。
メンバーカラーがグリーンということで全体的に緑で。
ジオメトリノード
上記の丸写しで再現できるかと思います。
ざっくりと概要を説明すると、
ボリュメトリックオブジェクトにGeometry Nodesを追加。
表示範囲とパーティクル生成範囲を指定するために、指定のCollection内のオブジェクトからの距離あるいはNoise Textureによる割り振りどちらかを選択して使えるようにする。
頂点に0〜1を割り振ることで”ここからここまでが表示部分でそれ以外は隠す”という定義をします。
"見えてる/見えてない"の境界線部分に、Distribute Pointsで指定の濃度の点群が生成されるよう設定。(粒子からモデルが出現する演出)
点群が生まれた面のNormal(面の向き)を初期速度として設定。
点群をSimulation Zoneで扱い、フレーム毎に時間経過や速度への変更、頂点サイズなどが引き継がれるようにする。
一定の"年齢"に達した点は削除されるように設定。
点群を任意の形状でインスタンス化する。
インスタンスのスケールを点の"年齢"から自動的に削除するように
範囲指定で用いたファクターなどは、Shaderでも使えるようにAttributeとして保管。
数値にキーフレームを打ちたい箇所や、モディファイアからコントロールしたい箇所はOutputへ繋ぐ。
マテリアル
ボリュメトリック
Geometry NodesでAttributeとして保管した範囲ファクターを参照する。(ここでは"fac"と"border")
ボリュとセットのmp4をImageTextureで参照して、フレーム数などを設定。AutoRefreshに必ずチェックを入れる。BaseColorへ繋ぐ。
"fac"をMapRangeで微調整して、0~1を反転させてAlphaへ繋ぐ。
この時"From Max"の数値が極端に0に近く調整しにくい場合は、Geometry Nodesせ設定した"Alpha Border Adjust"で調整する。"border"を使用して境界線の色とEmissionを設定する。
パーティクル
Geometry Nodeで保管した"age"Attributeを参照。
MapRangeで調整して、Emission ColorとStrengthにそれぞれ繋ぐ。
基本、FromMax値はGeometryNodeで設定したLifeLimitの値を打ち込む。
まとめ
比較的シンプルで汎用性の高いサンプルにしたつもりですが、キャプチャなどで見えない箇所について何かご質問があればX(ツイッター)で投げていただければと思います。
ちなみに、ボリュのポジション情報などをSimulationZone内で改変しようとするとアニメーションがぶっ飛びました。マクロが壊れてExcel全部動かなくなったみたいな感じ。
各フレーム毎に、頂点ーUVーアニメーションが紐づいているから、思っていたよりもずっと繊細。これをデータとしてまとめたスタジオのエンジニアの方に敬意を払いたいと思います。コンテストでも配布物だったのもあり、データ容量にも気を使って制作されたことと思います。
こんな感じで締めたいと思います。
ありがとうございました。