バージョン

menu_open
Wwise SDK 2021.1.14
Geometry APIを使った回折(diffraction)と透過(transmission)のシミュレーション

はじめに

Wwise Spatial Audioに送信したジオメトリを、音の回折や透過のシミュレーションに使うことがあります。つまり、あなたのゲームエンジンでオブストラクションを計算するレイキャスト方式を、完全に置き換えることも可能です。

エミッタが障害物に隠れてリスナーから見えないとき、Spatial Audioが障害物のエッジ(端)にそってパスを計算し、見つかれば、その端を回り込む音によって発生する回折係数を計算します。これに合わせてエミッタの見かけの入射角が調整され、回折値がWwiseに送信されるので、最終的に音にどう影響するかをあなたがWwiseでコントロールできます。回折の結果としてローパスフィルターが適用されるのが一般的です。

さらに、Spatial Audioはジオメトリを通るサウンドパスを計算します。障害物を透過する音には、API経由でジオメトリにアサインされた表面プロパティで決まる透過損失(transmission loss)の係数が適用されます。透過損失は、ローパスフィルタとボリューム減衰でモデル化されるのが一般的です。

下図は、WwiseのGame Object 3D Viewerのスクリーンショットです。ある音の、薄い壁の周りを回折する回折パスと、透過損失100の透過パスが示されています。

警告: 障害の計算方法として、あなたのゲームエンジンのレイキャスト方式から、ジオメトリを使った回折と透過に、完全に切り替えることは可能ですが、ジオメトリが複雑になるとパフォーマンスコストが急速に増大します。Spatial Audioに送信するジオメトリは、できるだけシンプルにしてください。また、効率的なRooms and Portalsによる抽象化( RoomとPortal 参照)を、ジオメトリによる回折と合わせて利用した方が、後者の複雑な計算を減らせます。

Wwise Reflectと組み合わせて使えば、ジオメトリによる回折をエミッタとリスナーの間の直接的な音の伝播のパスだけでなく、その初期反射のパスに対しても適用できます。

回折用(diffraction)に、ジオメトリを設定する

Spatial Audioに送信されるジオメトリセットはすべて、回折のパスを計算するときに考慮するべきかどうかを明確に示す必要があります。明示するには、AkGeometryParams::EnableDiffraction フラグを使います。このフラグが回折の計算に必要なエッジデータ生成を可能にし、ダイレクトパスに対するジオメトリによるディフラクションと、リフレクションのディフラクションの、両方で使われます。

また、メッシュの境界エッジでも音が回折するのかどうかを検討します。メッシュの境界エッジとは、1つの三角形だけにつながるエッジのことで、多様体の境界に存在することになります。エッジ数が増えると回折の計算がより複雑になるので、あなたのメッシュの境界エッジで音が回折しないのであれば、このオプションを無効にしておきます。

最後に、エッジ材質はエネルギーを吸収せず、Acoustic Surfaceに設定されているAcoustic Textureは回折に一切影響しません。エッジは、音を単に曲げるだけです。

透過(transmission)用に、ジオメトリを設定する

音の透過のために、ジオメトリのセットアップで特に必要な追加の手順はありませんが、様々なジオメトリタイプに合わせて透過損失(transmission loss)の係数を調整したほうが良いと思われます。例えばコンクリート構造は、ほぼすべての音響透過を妨げる可能性が高いのに対し、ベニヤ板で構成されたジオメトリは、わずかに音を妨げるだけかもしれません。

AkGeometryParams::Triangles アレイの中の各 AkTriangle に、 AkTriangle::surface が入っていますが、これは AkGeometryParams::Surfaces アレイに対するインデックスです。 AkAcousticSurface::transmissionLoss フィールドは、それを参照する三角形を透過する音に対し、どれだけの透過損失を適用すべきかを表します。値は0から1の間で設定されます。透過損失は損失率に換算され、オクルージョンカーブを評価するために使われます( AkSpatialAudioInitSettings::bUseOcclusion が有効であることが前提)。ある透過損失の音に適用される最終的なボリューム減衰とフィルター値は、Wwise Project Settingsで定義したオクルージョンカーブによって決まります。透過損失を組み込みパラメータとして適用したり、RTPCにマッピングしたりすることもできます。

ダイレクトパスの、ジオメトリによる回折

Geometric Diffractionのデモが、Integration Demoサンプルにあるので(SDK/samples/IntegrationDemoの中)、ダイレクトパスのジオメトリによる回折に、ジオメトリを利用する例を、ご覧ください。このデモの場所は、Demo Positioning > Spatial Audio: Geometryです。

回折(diffraction)と透過(transmission)のために音を準備する

Wwise AuthoringツールのPositioningタブで、 Enable Diffraction and Transmission がチェックされていることを確認します。このボックスは、回折や透過に関するSpatial Audio機能を有効にするもので、例えば以下が可能となります。

  • 音の回折パスがジオメトリやポータルを経由する場合は、その計算。パスの計算は、Spatial Audioが、回折と透過を有効にしたサウンドを再生している各ゲームオブジェクトに対し、行います。同じゲームオブジェクト上で、回折を有効にした複数のサウンドが再生中であれば、パス計算は1回だけ行われます。
  • ジオメトリやルーム間を経由する音の透過パスの計算。透過パス上で遭遇した透過損失値のうち、ルームの AkRoomParams::transmissionLoss や、三角形に関連付けられた AkAcousticSurface::TransmissionLoss のうち、必ず最大の透過損失値が、最終的な透過損失係数として用いられます。
  • Spatial Audioの初期設定で AkSpatialAudioInitSettings::bCalcEmitterVirtualPosition が設定されていれば、音をレンダリングするために回折パスのバーチャルポジションを生成してSound Engineに送ります。
  • Spatial Audioの初期設定で AkSpatialAudioInitSettings::bUseObstruction が設定されていれば、回折係数に基づいてオブストラクションカーブを適用します。もしゲーム側も AK::SoundEngine::SetObjectObstructionAndOcclusion 経由でオブストラクション値を設定していれば、両者の値の大きいほうを使います。
  • Spatial Audioの初期設定で AkSpatialAudioInitSettings::bUseOcclusion が設定されていれば、透過損失の係数に基づいてオクルージョンカーブを適用します。もしゲーム側も AK::SoundEngine::SetObjectObstructionAndOcclusion 経由でオクルージョン値を設定していれば、両者の値の大きいほうを使います。

Wwiseにおけるダイレクトパスの回折と透過

回折と透過の様子をGame Object 3D Viewerで観察するには、Profiler Settingsやビュア―のオプションで設定します(下図参照)。

エミッタからリスナーまでのパスで計算された回折係数が、回折エッジごとに表示されます。 AkSpatialAudioInitSettings::bUseObstruction が有効になっていれば、この回折係数は、組み込みゲームパラメータのDiffraction経由、またはエミッタのObstruction値経由で、Wwiseに伝達されます。組み込みゲームパラメータ値はバインドされているゲームパラメータをGame Sync Monitorに追加することでプロファイリングでき、オブストラクションやディフラクションはProfilerのObs/Occタブでプロファイリングできます。

計算した透過損失係数は、Game Object 3D Viewerで、該当する透過パスの隣に表示されます。透過損失の原因がジオメトリであれば、ヒットポイントが、その透過損失率()と共に示されます。一方、透過損失の原因がルームであれば、透過損失率が表示され、その下に文字で"(Room)"と表示されます。

Portalsと同じく、Diffraction値はエミッタがリスナーの視界に入っているときに0で、エミッタがシャドーゾーンを貫通し始めると増加します(Diffraction(回折) 参照)。また、シャドーゾーンの回折の詳細や、組み込みのDiffractionゲームパラメータとオブストラクションの使い方の違いについては、Rooms and Portalsの Diffraction(回折) を参照してください。

ダイレクトパスの回折と、Spatial AudioのRooms and Portalsの関係

Spatial AudioのRooms and Portals( RoomとPortal )でも、隣接するルームのダイレクトサウンドの回折をPortalsによってモデル化します。これら2つのシステムは補完し合う関係で、リスナーと同じ部屋にないエミッタに対して、ジオメトリに基づく回折パスを見つけようとすることはありません。ジオメトリよりもRooms and Portalsの計算の方がかなり効率的なことを考慮すると、複雑な計算を制限するために、2つのシステムを併用することにメリットがあります。

アーリーリフレクションの、ジオメトリによる回折

上記の通りアーリーリフレクションはエッジで回折することがあり、エミッタをWwise Reflectにルーティングすると、Spatial Audioがこの現象のモデル化をサポートします。

その方法を説明する前に、ビューゾーン内の回折を定義する必要があります。

下図をご覧ください。エミッタはリスナーの視界に入っていますが、鏡面反射がリスナーに当たっていません。つまり、ビューゾーンに入っているのです。すでに Diffraction(回折) で説明した通り、回折はビューゾーン内でも発生します。ただしWwise Spatial Audioでは、ダイレクトパスのモデル化を行うRooms and Portalsでもジオメトリによる回折でも、ビューゾーン内の回折が実際のダイレクトパスと比較して無視できる程度なので、考慮されません。しかし反射に関しては、ビューゾーンの回折が劇的な影響をもっています。回折がないとアーリーリフレクションが聞こえるのはリフレクションゾーン内だけで、そこでは純粋な鏡面反射となっています。リスナーがビューゾーンに入った途端、反射が聞こえなくなります。回折を有効にしておけば、エッジが作用して反射波が回折されます。そうすると、リスナーがリフレクションゾーン内を歩き回ったり、そこを遠ざかったりしたときに、追加のフィルタリングや減衰が適用されたあとの反射を聞くことができるのです。

リフレクションゾーン内では、鏡面反射でほかが圧倒されるものと予想し、回折パスも、それに伴う回折値も、計算されません。あるエッジにおけるビューゾーンの回折を計算すると、リフレクションゾーンとビューゾーンの境界線において0となり、ビューゾーンとシャドーゾーンの境界線において100となります。

高次のアーリーリフレクションでは、ビューゾーンとシャドーゾーンの両方の回折が作用します。

サウンドにReflectionを適用するには

リフレクションを要するすべてのサウンド用に、Wwise Authoringツールで、Wwise Reflectの入ったAuxバスにアーリーリフレクションのセンドを設定します。詳細は Wwiseプロジェクトセットアップ を参照してください。反射の回折を目的とする回折の特別な設定はなく、ジオメトリに対して回折を有効にするだけで充分です。

Wwise Reflectの設定

回折エフェクトを適用した反射は、Wwise Reflectでイメージソースとして表示されます。反射の回折のエフェクトをデザインするのに、回折で変化する3つのカーブ、つまりDiffraction Attenuation、Diffraction LPF、Diffraction HPFを使うことができます。詳細は Wwise Reflect's documentation を参照してください。

ジオメトリのAPIとルームやポータルを、合わせて使う

Wwise Spatial Audioのルームやポータルは、ジオメトリAPIと連動して反射や回折を表現します。ルームやポータルのネットワークを、周辺のジオメトリのハイレベルの抽象化(またはLOD(Level of Detail)の低レベルバージョン)としてとらえることができます。ルームやポータルを、レベルのジオメトリと注意深く合わせて使えば、詳細で効率的な音響シミュレーションを達成できます。

ポータルを通過するジオメトリによる回折

エミッタ(ジオメトリ回折用に正しく設定されたサウンドを再生中のエミッタ、 回折(diffraction)と透過(transmission)のために音を準備する 参照)が、リスナーと同じルームにない場合、ジオメトリによるパスを以下のように計算します:

  • エミッタからリスナーまでの音の伝播パスを、ルームとポータルのネットワークを使い計算します。
  • 各パスの、エミッタに最も近いポータルとエミッタの間の部分は、ジオメトリの回折アルゴリズムを使い、まるでポータルがリスナーであるかのように計算します。リスナーから見て、エミッタが1つのポータルの真後ろにいない限り、計算されるジオメトリパスは1つ(最短のもの)だけです。それ以外にエミッタとポータルのパスをいくつ計算しても、別のバーチャルポジションが出るわけではないので、不要です。
  • 2つのポータルの間も、ポータル同士で直視できなければ、ジオメトリによる回折を使い、間のパスを計算します。これらの計算は、シーンにジオメトリやポータルが追加されたり削除されたりする度に行い、必要に応じて再利用します。多くの場合、2つのポータルの間の最短パスだけを使います。唯一、リスナーがポータルの真後ろにいるときが例外で、その場合は複数のパスを用い、リスナーがポータルを通過した際の中断を回避します。
  • 各パスの、リスナーに最も近いポータルとリスナーの間の部分は、ジオメトリに従った回折アルゴリズムを使い、まるでポータルがエミッタであるかのように計算します。
  • 以上のパスを組み合わせた結果がパスとなり、必要に応じて複数のパスをつなげたり合体させたりします。

ポータルを通過する反射

リフレクションはポータルを通過することができ、ポータルの開口部で最大2つの平面が交差していても通過できます。ポータル自体が音響的な開口部なので、音を通過させるために三角形ジオメトリに「穴をあける」必要はなく、三角形の数が大幅に増えるのを回避できます。例えば、箱のようなジオメトリのルームがあり、6つの面を、それぞれ2つの三角形で表すとします。音が箱の外にも伝播するようにしたければ、1つの壁と交差するポータルを追加し、ポータルのZ軸が壁に交差するように配置します。いつも通り、どのゲームオブジェクトがルーム内にあり、どれが外にあるのかは、ゲームが判断し、判断するのに使うのは AK::SpatialAudio::SetGameObjectInRoom です( RoomとPortalの概要 参照)。 エミッタ(リフレクション用に正しく設定されたサウンドを再生中のエミッタ、 Wwiseプロジェクトセットアップ 参照)が、リスナーと同じルームにない場合、音の伝播ネットワークでそのサウンドが伝わる状態であれば、リフレクションをシミュレーションします。反射を、以下のように計算します:

  • エミッタのあるルームに接続する各ポータルと、エミッタの間の反射を、まるでポータルがリスナーであるかのように計算します。
  • ポータルとリスナーの間の回折パスを、 ポータルを通過するジオメトリによる回折 の説明のとおりに計算し、ポータルとエミッタの間の反射パスに付け加えます。
  • もし回折パスが回折100を超える場合は反射を計算せず、途中で超えた場合は、その時点で計算を停止します。

ルームの間のポータルを、ジオメトリを使って方向を決めるヒント

下図は、方向が正しく設定されたポータルの例です。

  • ジオメトリに切り抜きがあれば、反射パスや回折パスはポータルを通過することができます。
  • ポータルと重なった、最大2つの平面から、長方形の切り口を引きます。同一面の1つ以上の三角形によって、1つの平面が定義され、Spatial Audio Geometry APIに渡されます。
  • ジオメトリの切り抜きが、Game Object 3D Viewerに濃い緑色で描かれます。
  • 切り出しを正しく検知するには、2つの平面が交差せず(ただし平行である必要はない)、ポータルの幅(X)全体と高さ(Y)全体に広がる必要があります。
  • 2つの平面の間や、ポータルで接続する2つのルームの間に、隙間があることは許容されます。ただし、ゲームオブジェクトがポータルに入ることができるのは、接続するルームのどちらかに、それが事前にあった場合のみです。
  • ゲームオブジェクトがポータルを通過してトランジションする場合は、 AK::SpatialAudio::SetGameObjectInRoom に渡されるルームのコンテイメント結果は、ヒントとして使うだけです。実際のルームを判断するには、ゲームオブジェクトのポジションをポータルのZ軸に投影し、次にゲームオブジェクトが、前のルームと後ろのルームにそれぞれ対応する、ポータルの前半分と後ろ半分の、どちらにあるのかをテストします。
  • ポータルが、2つのルームの間でぴったり合っていることも、中央に正確に位置することも、必要ありません。
  • ポータルの中央が必ず、2つのルームの間のトランジションポイントとなります。
  • 2つのルーム間を滑らかにトランジションできるだけの深さがZ軸にそって確保できるようにしてください。
  • 2つのルーム間のトランジションが唐突すぎる場合は、Z軸に沿ってポータルを長くすることで解決できることが多いです。

特定のルームのジオメトリのタグ付け。

レイとトライアングルの交差テストや、反射が生じるかもしれない面を、サーチする領域を制限する最適化の1つとして、特定のルームにジオメトリを自分でアサインすることが可能です。まず、そのルームのIDに、 AkGeometryParams::RoomID を設定します。そうすることで、ルームのジオメトリがほかのルームから見えるのはポータルを通したときだけで、直接には見えないということを、Spatial Audioに示します。1つのルームIDに関連付けられるジオメトリセットは1つだけなので、 AkGeometryParams::RoomID を無効にしない限り、複数の部屋で見えるようなジオメトリをルームに設定できません。また、ルームのIDに関連付けられたジオメトリセットがあれば、このルームにあえて関連付けたジオメトリ以外をルームが「見る」ことはできません。ルームにジオメトリセットをアサインしたあとは、そのルームの反射や回折をシミュレーションするときに、Spatial AudioはルームIDに具体的に関連付けられたジオメトリ以外を見ません。


このページはお役に立ちましたか?

サポートは必要ですか?

ご質問や問題、ご不明点はございますか?お気軽にお問い合わせください。

サポートページをご確認ください

あなたのプロジェクトについて教えてください。ご不明な点はありませんか。

プロジェクトを登録していただくことで、ご利用開始のサポートをいたします。

Wwiseからはじめよう