防災シミュレーション開発記録

MetaQuest3S × Unity × VRで実現する煙のシミュレーション開発日記

開発の軌跡

2024年10月

Blenderでの煙のシミュレーション成功

Blenderの流体シミュレーション機能を使って煙のシミュレーションを実装。有限差分法による移流方程式・拡散方程式・非圧縮条件を用いた高精度なシミュレーションを実現しました。

移流方程式: ∂φ/∂t + (u·∇)φ = 0
拡散方程式: ∂φ/∂t = D∇²φ
非圧縮条件: ∇·u = 0

結果は大成功!かなり良好なシミュレーション結果を得ることができました。物理的に正確な煙の動きを再現できています。

2024年11月初旬

Unity + OpenXRでMetaQuest3Sへ問題発生

MetaQuest3Sに導入するためにUnityのOpenXRパッケージを使用。自作のアプリをMetaQuest3Sに導入できることが判明し、早速煙のシミュレーションを動かそうとしました。

ここで問題発生! 煙のシミュレーションデータは一般的な3Dモデルデータとしてエクスポートできません。シミュレーションデータはOpenVDBというファイル形式で保存されるため、Unity標準のインポート機能では読み込めませんでした。

2024年11月中旬

OpenVDBforUnityの試行問題発生

GitHubでOpenVDBforUnityというパッケージを発見。これを使えばOpenVDBファイルをUnityで読み込めるはずです。

さらに問題発生! そのパッケージは7年前のもので、7年前のUnityバージョンではMetaQuest3Sに対応させるOpenXRパッケージが存在しません。新しいUnityバージョンとの互換性がありませんでした。

2024年11月下旬

ZibbraEffectによる代替案問題発生

最新のUnityでも使えるZibbraEffectなどのVFX系パッケージを発見。これを使ってBlenderで行った煙のシミュレーションを再現することにしました。

VFXの構築を行い、Unity上での実行に成功!視覚的に美しい煙の効果を再現できました。さあ、いよいよMetaQuest3Sへ書き込みです。

またしても問題発生! OpenXRなどのパッケージがZibbraEffectなどのVFXパッケージに対応していませんでした。外部パッケージを使えないとなると、いよいよ手詰まりです。

2024年12月初旬

リアルタイムシミュレーション+レンダリング重い

アプリケーション内でのリアルタイム流体シミュレーションと、逆投影行列・体積分を使ったカメラのピクセルごとのアルファ値の算出、テクスチャマッピングの作成、カメラへの合成を毎フレーム行う方法を考案。

逆投影行列: P-1 = (VP)-1
体積分: I = ∫∫∫ ρ(x,y,z) dV
アルファ値: α = 1 - e

これは実際のBlenderの流体シミュレーション描画方式と同じ方式なので、理論上は実現可能です。開発開始!

しかし問題発生! 煙のシミュレーションが重い!リアルタイムでの流体シミュレーションは処理に時間がかかります。さらに、実行環境はMetaQuestなのでPC以上に処理負荷が問題になります。完全に盲点でした。

2024年12月中旬

nanoVDBの発見突破口

ここまで来てかなりの難題にぶち当たりました。シミュレーションデータはあるが、Unityに持って行けない + 外部パッケージ不可 + リアルタイムでのシミュレーション・レンダリングもスペック的に不可...

そこでGitHubでnanoVDBのUnityでのレンダリングに成功しているC++&C#サンプルコードを発見!しかもUnityの最新版に対応している!これは外部パッケージではないので、MetaQuestでも読み込めるはずです。

nanoVDBは、NVIDIAが開発したOpenVDBのパフォーマンス最適化版で、本質的にはOpenVDBと同じデータ構造を持ちます。つまり、OpenVDBをnanoVDBに変換できれば解決できます。

2024年12月下旬

vcpkgによる変換ツール構築成功

vcpkgのOpenVDBモジュールに注目。調査すると、vcpkgのOpenVDBモジュールにはOpenVDBとnanoVDBを変換するシステムが含まれていることが判明!

// vcpkgでOpenVDBモジュールをインストール
vcpkg install openvdb
// OpenVDBからnanoVDBへの変換
nanovdb_convert input.vdb output.nvdb

vcpkg環境を構築し、変換ツールを動かすことに成功。OpenVDBファイルをnanoVDBファイルに変換できるようになりました。

2025年1月

レンダリング成功・アニメーション実装現在の進捗

得たnanoVDBファイルをサンプルコードにつなげて実行した結果、成功!ちゃんとレンダリングされました。Unity上で煙のシミュレーションデータを表示できるようになりました。

現状のシステムでは一つのnanoVDBしか表示できないため、C++とC#コードを編集・作成して、複数のnanoVDBをアニメーションのように表示させることができるようになりました。

public class NanoVDBAnimator : MonoBehaviour
{
    private List<NanoVDBData> frames;
    private int currentFrame = 0;
    // フレーム更新とレンダリング処理
}

現在の進捗: ここまでが完了しています。次の進展があったら、ここに順次追加されていく予定です。

技術的な挑戦

OpenVDB → nanoVDB変換

Blenderで生成されたOpenVDBファイルをNVIDIA nanoVDBフォーマットに変換。メモリ効率とパフォーマンスを大幅に向上させ、VRデバイスでの実行を可能にしました。

🎮

Unity OpenXR統合

MetaQuest3Sに対応したOpenXRパッケージを使用。外部パッケージに依存しない独自のレンダリングシステムを構築し、VRデバイスでの煙のシミュレーション表示を実現。

🌫️

体積レンダリング

逆投影行列と体積分を使用したピクセルごとのアルファ値計算。リアルタイムで煙の密度分布を視覚化し、没入感のある火災シミュレーションを提供。

🔧

C++/C#統合

C++で書かれたnanoVDBレンダリングコードをC#のUnityコードと統合。複数フレームのアニメーション機能を独自実装し、時系列的な煙の動きを再現。

技術的課題と解決策

❌ 発生した問題

  • OpenVDBファイルの直接インポート不可
  • 旧バージョンパッケージの互換性問題
  • 外部VFXパッケージのOpenXR非対応
  • リアルタイムシミュレーションの処理負荷
  • VRデバイスでのパフォーマンス制約

✅ 採用した解決策

  • vcpkgによるOpenVDB→nanoVDB変換
  • 独自のC++/C#レンダリングシステム
  • Unity標準機能のみを使用
  • プリレンダリングによるパフォーマンス最適化
  • フレームベースアニメーション実装

このプロジェクトを通じて、VRにおける流体シミュレーションの実装の難しさと、それを解決するための創意工夫の重要性を学びました。 技術的な制約の中でも、最適な解決策を見つけ出すことができました。

今後の展望

🔥 避難訓練システム

煙のシミュレーションを活用した実際の避難訓練システムを構築。MetaQuest3Sを使用して、リアルな火災状況での避難体験を提供します。

⚡ パフォーマンス最適化

nanoVDBの圧縮技術とGPUアクセラレーションを活用して、より高解像度で滑らかな煙のシミュレーションを実現します。

🌐 マルチユーザー対応

複数のユーザーが同時に参加できる協調避難訓練システムを開発。チームワークを重視した防災教育を実現します。

次の進展があったら、このページに順次追加されていく予定です。
開発の続きをお楽しみに!