Unityのダイナミックルームモデリング
End-of-Life Notice for Oculus Spatializer Plugin
このドキュメントが今後更新されることはなく、削除される場合もあります。
Oculus Spatializerはダイナミックルームモデリングを提供します。このモデリングは、VRエクスペリエンスで、現在のルームとその空間内のユーザー位置を動的にアップデートするモデルに基づいて、反響と残響を生成できるようにします。
リリース1.22より前のOculus Spatializerでは、「シューボックス」と呼ばれる直方体をベースにして、単純な反響モデルのみが使用できました。このアプローチは、空間を音で埋めて自然に聞こえるようにする上で、非常に効果的です。このアプローチでは、音の反響と残響はバイノーラルで空間化されます。つまり、タイミング、音量、その他の効果が左右の耳で異なります。これにより、音の方向性を強化するための適切な手がかりが提供されます。この単純なシューボックス反響システムは使いやすさを考慮して設計されており、常にサウンドデザイナーが設定したボックスの寸法の中心にリスナーを配置します。このため、ミドルウェアツールですべてを制御するシンプルなワークフローが可能になります。サウンドデザイナーは、可能な限りVRエクスペリエンスにフィットするより自然な音響空間が得られるように、ボックスの壁の寸法と反響係数を決定することができます。
ただし、ルームのサイズが固定されるため、この単純なアプローチには限界があります。リスナーがエクスペリエンス内の壁や他の固定オブジェクトの近くに移動する場合でも、常に中央に配置されていました。さらに、残響は動的でないため、ほとんど効果がありませんでした。最新のOculus Spatializerは、より動的になり、音がさらにリアルに響きます。しかも、それによって計算の複雑さが大幅に増大したり、ワークフローが影響を受けたりすることはありません。
シューボックスをVRエクスペリエンス内の実際の空間に適合させるため、リリース1.22以降のOculus Spatializerはゲームエンジンと統合されています。シューボックスが、空間の形状とサイズに動的に順応するようになりました。これにより、ルームの寸法を動的に変えられるようになり、リスナーがルーム内を移動していくのに合わせて音響特性を変更できるようになりました。この機能を実現するため、Spatializerはゲームエンジン内でレイキャスティングを使用します。これを簡潔なもののままにするため、デフォルトの実装で、Spatializerはエンジンレイキャスターに接続します。この実装は可能な限り軽量に設計されているので、キャストされるレイの数はわずかです。さらに、以前のレイキャスト結果の履歴が保持され、時間の経過とともに推定が改善されます。
SpatializerはUnityエディターの視覚化オプションも備えており、それによってルームの寸法とレイが当たる場所を確認できます。レイキャスティングを視覚化する機能は、音響に影響を与えることを意図していないジオメトリ(UIオブジェクトなど)との予想外の衝突に対処する際に、特に役立ちます。
Unityエディター内でOculus Spatializerを使用するには、次のスクリプトをゲームオブジェクトに添付します。
Assets/OSPNative/scripts/OculusSpatializerUnity.cs
Add Componentボタンをクリックして、Oculus Spatializer Unityを検索します。検索結果の中からOculus Spatializer Unityを選択します。

最も簡単な方法は、このスクリプトをシーン内の空の静的ゲームオブジェクトに追加することです。そうすると、ジオメトリエンジンがアクティブになり、現在の実装がオーバーライドされます。
このスクリプトは、スクリプトを含むゲームオブジェクトがシーンに追加された後でアクセス可能になるパブリック変数を公開します。

次の変数を変更できます。
- Layer Mask (レイヤーマスク): ジオメトリは、特定のレイヤー列挙でタグ付けできます。Spatailizerは、レイヤーマスクで選択されたものと一致するジオメトリのみを使用します。
- Visualize Room (ルームの視覚化): オンにすると、ジオメトリに当たるレイがUnityエディターに表示されます。レイヤーマスクで選択されたレイヤーに割り当てられたジオメトリのみが表示されます。また、VRエクスペリエンス全体を通し、移動に合わせて現在の空間にフィットするよう、シューボックスの残響モデルが動的に変化する様子を確認できます。また、Rays Per Second (レイ毎秒)、Max Wall Distance (壁との最大距離)などのほかの変数を設定した場合の結果も表示されます。
- Rays Per Second (レイ毎秒): ルームのサイズと形状を近似するために、リスナーの位置からランダムに照射されるレイの1秒当たりの数を指定します。値を大きくするとルーム特性をより正確に近似できますが、より多くのCPUリソースが必要になります。
- Room Interp Speed (ルーム補間速度): ルームが1つの近似値から次の近似値にスムーズに遷移するのにかかる時間(秒単位)を指定します。値を大きくするとゆっくりと遷移していきます。この値が小さすぎると、反響と残響が不安定になり、ルーム内を跳び回るように聞こえる可能性があります。この値が大きすぎると、ある空間から別の空間に移動するときに、特にルームのサイズまたは形状に大きな違いがある場合に、反響と残響が遅れて聞こえるように感じられることがあります。
- Max Wall Distance (壁との最大距離): 各レイが照射される有効最大距離(フィート単位)。その範囲内で壁に当たらない場合、ルームのサイズの近似には使用されません。
- Ray Cache Size (レイのキャッシュサイズ): ルーム特性を近似するためにキャッシュされるレイの数。キャッシュが大きいほど、現在のルーム特性に近づけるために、より多くのレイが使用されます。この値が大きすぎると、ある空間から別の空間に移動するときに、特にルームのサイズまたは形状に大きな違いがある場合に、音の遷移速度が不十分になることがあります。この値が小さすぎると、音がかなり不安定に感じられることがあります。
- Dynamic Reflections Enabled (動的反響の有効化): この変数をオフにすると、残響は持続しますが、反響はオフになります。詳しくは、下記の「残響と反響」をご覧ください。
- Legacy Reverb (レガシー残響): ダイナミックルームモデリングは、従来の残響効果よりも滑らかで正確な残響効果を提供します。ただし、ダイナミックルームモデリングは、従来より多くのCPUリソースを必要とします。CPUリソースの使用量を削減する必要がある場合、また作成するアプリにはレガシー残響効果で十分な場合、レガシー残響モデルを使用できます。
直接音、反響、残響
以下では、直接音、反響、残響の違いについて簡単に説明します。
音が発生すると、リスナーにはまず直接音が聞こえます。これは、リスナーに聞こえる最も強力な信号であり、Oculusの空間化ツールにとっては3Dで音の位置を特定するための鍵となります。無響室では、反響が壁に吸収されるため直接音のみが聞こえます。現実世界の音は常になんらかの物体に跳ね返されてリスナーに返ってくるため、直接音のみだと無味乾燥で非現実的に聞こえます。
次に、反響について説明します。ルーム内では、音は壁にぶつかって一部は吸収され、一部は反響としてルーム内に跳ね返されます。音の直接的な反響を一次反響と呼びます。箱のように6面体のルームでは、リスナーには最初に直接音が聞こえ、次に6個の反響が聞こえます。6個の一次反響が再び壁に跳ね返されると、それぞれがさらに6個の反響を生み、合計36個(6 x 6 = 36)の反響が生じます。これらの反響の音量は最初の6個よりはるかに小さく、二次反響と呼ばれます。
一次反響と二次反響は、それぞれ独特で、聴き分けることができます。それらは、元の音によく似ているという点で、一種のエコーであるといえます。一次反響、二次反響、さらには三次反響(36 x 6個)は、音の反響の一部と見なされます。反響は、空間化ツールの2番目に重要な要素です。反響はリスナーにルームの形状を感じさせます。
残響は、反響からさらに一歩進んだ形態です。三次反響以降、音の跳ね返りは次第にあいまいで不明確になります。その結果、跳ね返りが網目のようになり、連続したノイズのように聞こえます。このような高次の跳ね返りは、音の残響部分であり、それらをシミュレーションするとCPUに負荷がかかるため、反響部分とは異なる方法でモデル化されます。CPU使用量を抑えつつ高次の跳ね返りを近似するため、Oculusではいくつかの工夫を行っています。
Oculusの用語定義では、反響は控えめな聞こえ方がするものの最初の少数の跳ね返りであり、残響は互いを区別できない高次の跳ね返りです。