MetaQuest3S × Unity × VRで実現する煙のシミュレーション開発日記
Blenderの流体シミュレーション機能を使って煙のシミュレーションを実装。有限差分法による移流方程式・拡散方程式・非圧縮条件を用いた高精度なシミュレーションを実現しました。
結果は大成功!かなり良好なシミュレーション結果を得ることができました。物理的に正確な煙の動きを再現できています。
MetaQuest3Sに導入するためにUnityのOpenXRパッケージを使用。自作のアプリをMetaQuest3Sに導入できることが判明し、早速煙のシミュレーションを動かそうとしました。
ここで問題発生! 煙のシミュレーションデータは一般的な3Dモデルデータとしてエクスポートできません。シミュレーションデータはOpenVDBというファイル形式で保存されるため、Unity標準のインポート機能では読み込めませんでした。
GitHubでOpenVDBforUnityというパッケージを発見。これを使えばOpenVDBファイルをUnityで読み込めるはずです。
さらに問題発生! そのパッケージは7年前のもので、7年前のUnityバージョンではMetaQuest3Sに対応させるOpenXRパッケージが存在しません。新しいUnityバージョンとの互換性がありませんでした。
最新のUnityでも使えるZibbraEffectなどのVFX系パッケージを発見。これを使ってBlenderで行った煙のシミュレーションを再現することにしました。
VFXの構築を行い、Unity上での実行に成功!視覚的に美しい煙の効果を再現できました。さあ、いよいよMetaQuest3Sへ書き込みです。
またしても問題発生! OpenXRなどのパッケージがZibbraEffectなどのVFXパッケージに対応していませんでした。外部パッケージを使えないとなると、いよいよ手詰まりです。
アプリケーション内でのリアルタイム流体シミュレーションと、逆投影行列・体積分を使ったカメラのピクセルごとのアルファ値の算出、テクスチャマッピングの作成、カメラへの合成を毎フレーム行う方法を考案。
これは実際のBlenderの流体シミュレーション描画方式と同じ方式なので、理論上は実現可能です。開発開始!
しかし問題発生! 煙のシミュレーションが重い!リアルタイムでの流体シミュレーションは処理に時間がかかります。さらに、実行環境はMetaQuestなのでPC以上に処理負荷が問題になります。完全に盲点でした。
ここまで来てかなりの難題にぶち当たりました。シミュレーションデータはあるが、Unityに持って行けない + 外部パッケージ不可 + リアルタイムでのシミュレーション・レンダリングもスペック的に不可...
そこでGitHubでnanoVDBのUnityでのレンダリングに成功しているC++&C#サンプルコードを発見!しかもUnityの最新版に対応している!これは外部パッケージではないので、MetaQuestでも読み込めるはずです。
nanoVDBは、NVIDIAが開発したOpenVDBのパフォーマンス最適化版で、本質的にはOpenVDBと同じデータ構造を持ちます。つまり、OpenVDBをnanoVDBに変換できれば解決できます。
vcpkgのOpenVDBモジュールに注目。調査すると、vcpkgのOpenVDBモジュールにはOpenVDBとnanoVDBを変換するシステムが含まれていることが判明!
vcpkg環境を構築し、変換ツールを動かすことに成功。OpenVDBファイルをnanoVDBファイルに変換できるようになりました。
得たnanoVDBファイルをサンプルコードにつなげて実行した結果、成功!ちゃんとレンダリングされました。Unity上で煙のシミュレーションデータを表示できるようになりました。
現状のシステムでは一つのnanoVDBしか表示できないため、C++とC#コードを編集・作成して、複数のnanoVDBをアニメーションのように表示させることができるようになりました。
現在の進捗: ここまでが完了しています。次の進展があったら、ここに順次追加されていく予定です。
Blenderで生成されたOpenVDBファイルをNVIDIA nanoVDBフォーマットに変換。メモリ効率とパフォーマンスを大幅に向上させ、VRデバイスでの実行を可能にしました。
MetaQuest3Sに対応したOpenXRパッケージを使用。外部パッケージに依存しない独自のレンダリングシステムを構築し、VRデバイスでの煙のシミュレーション表示を実現。
逆投影行列と体積分を使用したピクセルごとのアルファ値計算。リアルタイムで煙の密度分布を視覚化し、没入感のある火災シミュレーションを提供。
C++で書かれたnanoVDBレンダリングコードをC#のUnityコードと統合。複数フレームのアニメーション機能を独自実装し、時系列的な煙の動きを再現。
このプロジェクトを通じて、VRにおける流体シミュレーションの実装の難しさと、それを解決するための創意工夫の重要性を学びました。 技術的な制約の中でも、最適な解決策を見つけ出すことができました。
煙のシミュレーションを活用した実際の避難訓練システムを構築。MetaQuest3Sを使用して、リアルな火災状況での避難体験を提供します。
nanoVDBの圧縮技術とGPUアクセラレーションを活用して、より高解像度で滑らかな煙のシミュレーションを実現します。
複数のユーザーが同時に参加できる協調避難訓練システムを開発。チームワークを重視した防災教育を実現します。
次の進展があったら、このページに順次追加されていく予定です。
開発の続きをお楽しみに!