サンリオVfes2023 TORIENA with BC の破壊
はじめまして。ちゅーたなです。
2年半ぐらい前からVRChatで遊んでいます。
ポピ横などのpublicワールドで育ちました。
今回ありがたいことに、SANRIO Virtual Festival 2023 B4 Chill Parkにて「TORIENA with BC」のメンバーとして参加しました。
この文章では僕が参戦した経緯と担当箇所について記します。
主に「VR x Houdini x Shaderで作成する演出手法」と「キャラクターアニメーション」についてです。
以降では実際の演出内容を含みます。
1. 初見でアーカイブ視聴する予定の方は実際に体験されてから読んだ方が楽しいかもしれません。ご注意を。
2. 既に体験された方(ありがとうございます!)は今回の解説を見てからアーカイブ視聴されるとより面白いと思います。
つまり、1/29, 1/30のタイムシフト公演でもう一度見ましょう。
B4のパフォーマンスは全部楽しいですよ。見逃さないように!
経緯
去年の9月ごろ、三日坊主さんからサンリオ演出のお誘いを受けました。
TORIENAさんのパーティクルライブとのことで、正直僕には”キラキラ”したパーティクルライブは作れそうにないなーと思ってました。
しかし、よくよく話を聞いてみると、
「大きなTORIENAさんに壁を壊しながら登場してほしい!!」
「生肉と一緒にヘドバンしたい!!」
といった表現をしたい!と仰るのです。
…サンリオで???すごく楽しそう!!!ってなりました。
あとなんとなく「この演出なら僕っぽいな」って思いました。
当時、B4に登場する別チームについて知らなかったのですが、恐らく継続して登板するであろうキヌさんと、同時期の動きでなんとなく察せられたEstyOctoberさんに対抗すべく、
僕も参戦して坊主さんの武器になろうと決意しました。
坊主に金棒。
制作担当箇所
役割としてはEngineerです。
坊主さんとTORIENAさんの、飛距離のある素敵な想いを、VR世界で構築するお仕事です。
具体的には、
1曲目『Break Me Down』の演出全般
2曲目『デコイ』の視界ジャックエフェクト
モーションキャプチャを使ったキャラクターアニメーション作成
その他、Udon製のshader同期やgit管理など細かいところ
になります。
坊主さんの担当箇所はご本人がきっと書いてくれるので任せます。
TORIENAさんには曲はもちろんのこと、テクスチャやモデリングも担当いただきました。TORIENAさんは曲もヤバイですが、モデリング力もヤバイです。本人アバター(LiLENA)は自作ですし、2曲目のプロップ(机とか)やネズミたちもTORIENA製です。特にネズミはお願いしてから1日で完成してました。凄すぎる。
さて、これからは主にHoudiniを使った破壊表現とShaderを使った視界ジャック、そしてMotion Captureを使ったキャラクターアニメーションについて簡単に解説します。
Houdini: 破壊
1曲目の『Break Me Down』では大きなTORIENAさん(以降、DEKAENAちゃんと呼びます)が壁を破壊しながら突入してくるシーンから始まります。
その後も左右の壁や天井をパンチして壊したり、台パン(床パン?)で破片を飛び散らしたりしました。
これらはHoudini製です。
まず負荷等のために最適化されたB4フロアを破壊Readyにします(ごめんなさい)(こちらを参考にしました。)
次にあらかじめボロボロになった壁を作成します。それぞれのピースはまだくっついています。
この壁に向かって拳の代わりにボールをぶつけて、「ピース同士が衝撃に耐えられなくなったら破片となって飛び散る」ようにDOPシミュレーションを行います。
次にパラメータを探索しながらいい感じの破壊になるまで試行錯誤します。
運頼みのパラメータガチャをしても良いと思いますが、今回は曲名通り『破壊』がメイン演出になるので、それっぽい指針を立ててみます。
上図のような単純なモデルを考えます。拳とみなしたボールは十分素早く飛んできて壁にぶつかり、その衝撃で破片が水平方向に飛ぶ場合、ボールと破片の系では外力が働かない、とみなしても良いと思います。
この場合、運動量保存則によって、破片が飛ぶ瞬間の速度ベクトルVが求まります。
V = (m / M) v
ここで右辺のmとMはそれぞれボールと破片の慣性質量、vはボールの初期速度ベクトルです。
その後、破片は得られた初期速度と重力に従って放物線運動するでしょう。
つまり今回のモデルにおいて、シミュレーション結果に大きく影響するパラメータは、『ボールと破片の質量比』と『ボールの初期速度ベクトル』になります。あとは重力加速度です。(重力加速度は別に地球上の値を使わなくても良いと思いますが、値を変更した場合はすべてのシミュレーションで一貫させます)
具体的には『破片のよさげなサイズと位置』、『剛体ボールのサイズ』、『剛体ボールの位置と速度の大きさ』が試行錯誤する箇所になります。あとは頑張ります。
これでいい感じの破壊アニメーションはできました。Unityに持っていくためにはFBXとして出力する必要があるので、Houdini側でLabs RBD to FBXで書き出します。
その後、Unity側ではAnimation付きFBXとしてimportして、Timelineに組み込めるようになります。
破壊表現の出力方法は1つではありません。Ayanoさんが解説していた記事では、破片に対応したボーンを作成してSkinnedMeshとして出力する方法が紹介されています。
こちらの場合、破片数が大きすぎるとその分ボーンが膨大になったり、精度劣化につながったりすることもあります。
繰り返しになりますが僕たちは『破壊』がメイン演出になるので妥協はできません。
実際、PC環境であれば意外にも負荷的に問題なかったりします。(問題になった時に考えれば十分です)
天井の破壊と床パンについても似たような組み方で作成しました。
一貫したモデルを考えたことで、比較的楽に調整することができました。
Houdini: Lightning
DEKAENAちゃんが雷を操っていたらかっこいいですね。
特に2曲目のデコイに繋げるためには色々なオブジェクトを掃除しないといけないので、雷をバリバリさせることでTORIENA内部空間が限界になっている状態を表現しています。
元ネタはこちらです。Houdini製です。
まずLightningアニメーションを作成します。
次にこれをUnityに持っていく方法を考えます。今回は力業でいきます。
まずフレームごとにループを回してmergeして、全フレームのメッシュを一度に生成します。対応するフレーム数をメッシュの頂点カラーに仕込んでおきます。
これでアニメーション無しのただのメッシュになったので普通にFBX出力します。Unity側では頂点シェーダーでアニメーションさせます。
頂点カラーから対応するフレーム数を復元して、必要ないメッシュは逐次clipさせます。
この手法の嬉しい点は、過去フレームのメッシュも簡単に利用できるので、稲妻の残像を残せていい感じです。
嬉しくない点は、気を付けないとすぐにメッシュ数が爆発することです。(でも、意外と気にならず動いていますよね?)
Houdini: その他
僕が担当した細かいところも大体Houdini製です。
Houdiniは破壊もLightningもモデリングもひとまとめの作業空間でおこなえるので環境整理や連携がしやすいです。(プロジェクトファイルとして保存されているのはノード情報だけなので容量も軽いです)
Shader:視界ジャック
制作陣のこだわりとして、DEKAENAちゃんが起点となる大きな演出たちには、できる限り予備動作を用意しています。
巨大化したキャラクターは動きが相対的にゆっくりになるはずです(質量(3乗)と筋断面積(2乗)の関係から、大きくなるほど体を動かすのが”重く”なってきます)。その解釈を広げて、予備動作が無いまま素早く場面展開すると、演出としての”巨大さ”が弱くなると考えました。
あと曲を聴いていたら「好き勝手に暴れるけど、暴れているところはちゃんと見てて!」とDEKAENAちゃんが言ってる気がしました。仰せのままに。
視界ジャックを例に挙げると、
実際これらはシェーダーの工夫というよりアニメーションの工夫ですね。
筆が乗ってきたのでもう少し補足します。
『DAKAENAちゃんが壁を突き破って登場する』演出はインパクトがあって良かったのですが、制作当初はそこがピークになってしまい、その後がパッとしないという現象が発生しました。
というのも、DEKAENAちゃんは正面に大きく存在しているが故に正面の変わり映えがしないのです。(正面に演出を追加しづらい)
そのためB4空間全体を利用することを考えると、
オブジェクトをDAKAENAちゃん周辺に配置するか(鎖やニコちゃんなど)
オブジェクトを観客側に配置するか(お肉や空から降ってくる中TORIENAさん、SUBENAちゃんなど)
全体エフェクトをかけるか(視界ジャック)
が候補になります。
そのいずれも正面には開始点を持てないので、しれっと出してしまうと観客側としては見逃してしまいます。もしくは「いつどこからエフェクトがくるか分らない」から気が散りそうです。
解決策として、正面にいるDEKAENAちゃんに誘導してもらうことにしました。
(その他、「今何かが起きている!」を実感してもらうために、DAKENAちゃんの目が光ったり、壁が光ったりします)
せっかくなので線画風ホワイトエフェクトについて。
これはSSAOとエッジ検出で作っています。
SSAOはphi16さんのCubesを見て、「不透明オブジェクトがアニメーションするときにAOあったら良いなー」と思っていました。
坊主さんの作るアニメーションともマッチするだろう!と思って裏で勝手に作っていました。
最初は座標変換周りでうまくいかず、Cubesに潜っては解説記事とにらめっこしてました。(できなくて悔しい悔しい呟きながら)
最終的にはPROTOCOさんとコードレビューして、簡単なところは理解できたので演出に採用しました。
今回のケースだと、破壊用の破片オブジェクトが大量に仕込まれているので、オブジェクトベースでマテリアル数を増やす作戦はやりたくなかったです。
そこでdepthカメラ側からWorld座標とNormalを復元してAOを作りました。
この手法の欠点として、depthを使う以上、アバターの透明衣装が浮き出てしまいます。この対応については最後まで悩んでいました。(SSAOの上からさらに彩度を落とす視界ジャックを加えて、浮いてしまう色をできるだけ減らしました)
Shader:その他
演出に必要なものは都度作っていきました。
Animation GPU Instancingを使って肉ダンス用シェーダー書いたりとか。
視界ジャック作成として【VRChat想定】エフェクトシェーダー【視界ジャック】を参考にしたり、ポリゴンをバラバラにして掃除したかったので立体映像風シェーダーを参考にstandard shaderに移植したりしました。
あとはBPMに合わせてグリッチノイズが入ったりします。
Animation: モーション収録
僕はアニメーターではないのですが、モーションキャプチャ周りについて少しだけ知っていたので、DEKAENAちゃん達のモーション収録を担当しました。バーチャルプロダクション感があって楽しかったです。
撮りたい動きを坊主さんと相談した後、HUMRを仕込んだ収録ワールドを準備しました。次にDEKAENAちゃん用にミニチュア版のB4ワールドを用意しました。破壊シミュレーションなども含めています。なのでタイムラインに従ってTORIENAさん(フルトラ)に実演いただきました。
その後、HUMR側でログからアニメーションをFBX化させます。
ここまでで作成できたアニメーションだと精度面で不十分だと個人的に感じました。
不満点は以下です。
体全体のブレによって足が地面に対してふわふわしています。VRChatのフルトラは腰中心でIKを解いているので、地面が陽に与えられているわけではないです。一方でヒトは地面からの反力を受けながらバランスを保っています。つまり足の接地感がリアルさを生みます。
トラッキング精度の関係で足がノイジーでした。あとは腰飛びなど。これらも足の接地感を減少させる原因です。
ところどころ腕がめり込んだりしてました。これも直してかっこいいパンチにしたいです。
HUMRはボーンベースでキャプチャされるので、リップシンクや表情までは難しいです。
データがなんだかんだで重たいです。一般的にモーションデータは軽い方ですがキャプチャデータは60 FPSで全関節の姿勢情報を記録しているので、収録が長い分重たくなります。全フレームは要らないので、できるだけkey frame reductionしたいです。(モーションとしての”情報”を落とさずに)
これらに対応するために、FBXをアニメーション編集ツールに持っていきます。今回はMotionBuilderを使用しました。
キレイにしすぎても"VRChatらしく"なくなるので、ほどほどに頑張ります。
参考になるか分かりませんが具体的な工程を載せておきます。
(こちらを参考にしています)
アバターのリグを組みます(Control Rig作成)
Groundに対してFoot Contact IKを解きます。これで足がきちんと地面に接触します(そのために簡単に腰位置や足の位置を下げて地面に接触するように調整します)
トラッカー由来のプルプルしたノイズを除去するために体全体にノイズ除去フィルターをかけます。
めり込んでいる腕などを手付け修正して、アニメーションオーバーライドさせます。
全体をいい感じにKey Frame ReductionさせてFBX出力します。
Unity側でさらにリップシンクや表情を追加します。
アニメーション編集前後の一例を比較動画として載せておきます。
(左DEKAENAが編集前、右DEKAENAが編集後です。)
左DEKAENAちゃんは腰から動くことでふわふわしているのに対して、
右DEKAENAちゃんはしっかり足が接地しており安定感があります。
また後半の両手をクロスするシーンでは、編集前の左側では腕が伸びきっていて、更に両腕のメッシュが干渉しています。
右側では腕に力を貯めるようなクロスモーションになるよう調整しています。
小さな変化ではありますが、DEKAENAちゃんの力強さを補強できたかなと思います。(他の子たちのアニメーションも同様の手順で修正しました)
どうですかね?
僕は一応満足しました。
最後に
以上、制作した演出の簡単な解説になります。
ご質問ご指摘なんでも投げてください。
もしかしたらHoudiniなんて聞いたことない OR 触ったことない方もいるかもしれません。
実際、僕は去年1月からHoudiniを始めたのでまだ1年程度の付き合いになります。
そんな初心者である僕がHoudiniを演出制作に使用できたのは、僕たちが定期的に参加しているVRC Houdini勉強会のおかげです。主催者のtanittaさんに感謝を。
また、去年凄まじい衝撃を与えてくれたキヌさんに応えるべく、自分なりに制作したつもりです。今僕にできることは全部出し切りました。そんなキヌさんは今年も凄かったです。嬉しい。
最後に、素敵な機会を与えてくれたTORIENAさんと三日坊主さんに感謝します。
また何か機会があれば挑戦したいです。よろしくお願いします。
この記事が気に入ったらサポートをしてみませんか?