バージョン

menu_open
Wwise SDK 2023.1.8
統合の詳細 - 3D ポジション

Wwiseで音を再生するには、ゲームに登録され、場合によってポジションをアサインされるオブジェクトに対し、イベントをポストします。その結果、これらのゲームオブジェクトが エミッター になります。シミュレーションされる3D環境 エミッターリスナー の位置関係を使い、音のパンニングなどの特性を変化させることで、プレイヤーが信憑性のある3D環境で、聴覚的にも視覚的にも没入感を体感できるように補助します。

デザイナーは、Wwiseを使い、プレイヤーのスピーカーセットアップにおいて、マニュアル設定で音をパンニングすることも(Speaker Panning)、ゲームオブジェクトのポジションに基づいてパンニングすることも(3D Spatialization)、できます。さらに、Wwiseで減衰カーブや減衰設定を音にアサインし、その音の特性(ボリュームやフィルタリングなど)を距離や角度に基づいて変化させることもできます。

ゲームオブジェクトの位置設定

AK::SoundEngine::SetPosition() 関数を、この情報を必要とする音のゲームオブジェクトごとに、コールします。また、リスナーゲームオブジェクト用にも、これを必ずコールします。ゲームオブジェクトの位置が変わるたびに、位置設定をしなければなりません。

最初のパラメータは、ゲームオブジェクトのIDです。詳細は、統合の詳細 - ゲームオブジェクト を参照してください。

2番目のパラメータは、ゲームオブジェクトの位置と向きを表すベクターを含む AkTransform 構造です。Wwiseサウンドエンジンで、X、Y および Z軸がどのように定義されるかについての詳細は X-Y-Z座標系 を参照してください。

注釈: AK::SoundEngine::SetPosition() 関数を複数回コールし、次に AK::SoundEngine::RenderAudio() 関数をコールした場合に、考慮されるのは最後の値だけです。

リスナー位置の追従

エミッターのポジションがリスナーのポジションに自動的に付いて回るような動作にするには、ゲームオブジェクトのポジションを、フレームごとに明示的にリスナーのポジションと同じ値に設定する必要があります。また、リスナーゲームオブジェクトに対しイベントをポストすることも可能です。

単一のゲームオブジェクトに複数ポジションを設定

1つのゲームオブジェクトに対して1つの3Dポジションしか設定できない AK::SoundEngine::SetPosition() 関数を使わずに、1つのゲームオブジェクトに複数の3Dポジションを設定できる AK::SoundEngine::SetMultiplePositions() 関数を使います。

MultiPositionType は慎重に選択してください。状況や生み出したい効果の種類に合わせてオプションを選択します。

  • MultiPositionType_MultiSources を渡すと、複数のボリュームレベルが追加されるので、まるで複数のオブジェクトが同じ音を同時に出しているかのように聞こえます。この関数は様々な状況に有効で、全く同じ音を出すオブジェクトが多数あるようなときに適しています。ただし音同士の距離が近すぎると、この関数で問題が発生する可能性があります。この問題とは、ボリュームを追加することにより、複数のサウンドが正確に同相で再生するため、クリッピングの可能性が増大することです。
  • MultiPositionType_MultiDirections を渡すと、各スピーカーで再生するボリュームは、その方向における最大ボリュームです。この関数で様々なゲーム状況を演出することができ、例えば壁の開口部やエリアサウンド、または同時に同じ音を発する複数のオブジェクトなどに使えます。ただし、音を出す2つ以上のオブジェクトがゲームプレイヤーの近くに来た時に、音が徐々に大きくなるようにしたい場面では、 MultiPositionType_MultiSources で音を追加してください。
  • MultiPositionType_SingleSource は、リストの最初にあるポジションだけを考慮するので、 SetMultiplePositions() と一緒に使用しないでください。
  • 技術的な制限があるため、回折を有効にした音は、常に MultiPositionType_MultiDirections として扱われます。

複数のサウンドポジションにオブストラクションとオクルージョンを使用

AK::SoundEngine::SetObjectObstructionAndOcclusion API は、すべてのサウンドポジションに1つのオブストラクションとオクルージョンの値を適用します。代わりに AK::SoundEngine::SetMultipleObstructionAndOcclusion を使用すると、各サウンドポジションに対して固有のオブストラクション値とオクルージョン値がアサインされます。詳細については オブストラクションやオクルージョンとゲーム定義AUXセンド をご覧ください。

ユースケースの例

単一のゲームオブジェクトに対して複数のポジションを作成することにより、次のような数々のサウンドエフェクトをシミュレートできます:

エリアサウンド

MultiPositionType_MultiDirections オプションを適切なSpread(スプレッド)値および距離ベースのVolume Attenuation(ボリューム減衰)値と組み合わせて使用することで、エリアサウンドをシミュレーションできます。このメソッドを使用する場合、ポジションの数が相加的にボリュームを上げていないことを確認する必要があります。このメソッドを使用してエリアサウンドをシミュレートすることにより、複数の方向から聞こえてくるリアルな減衰特性を持った単一サウンドを生み出すことができます。

次の例では、黒い点がサウンドの最初のポジション、黒い円は減衰と拡散(スプレッド)の最小距離を、ピンクの円は最大半径を表しています:

複数ポジションを持つエリアサウンドのサンプル

青い領域は、ゲーム内の湖を表します。湖から発せられるアンビエンスサウンドは、4つのポジションを持つサウンドを使用してシミュレートされています。

リスナーがポジションAにあるとき、湖のサウンドは全方向から聞こえなければなりません。これは、サウンドをすべてのスピーカーで再生するように拡散させる適切な高拡散値を設定することにより実行可能です。

リスナーがポジションBにあるときは、減衰の距離の限界を超えています。これは、最大減衰でリスナーに湖のサウンドが全く聞こえないかかすかにしか聞こえないことを意味します。大きな湖をシミュレートするために複数のポジションを使用しているため、サウンドは常に適切な方向から聞こえます。

リスナーがポジションCにある時、リスナーには広角にあるスピーカー(~180度)から湖の音が聞こえますが、リスナーが湖から一定の距離に離れてあるためサウンドが減衰されます。この状況では、リスナーは減衰半径内にあるため、湖のサウンドが最大レベルまで減衰されることはありません。

このテクニックでは、複数のサウンドポジションを重ね合わせることにより、あらゆる種類のオブジェクトの形状を再現することができます。しかし、新たなポジションが追加されることにより、結果的なボリュームを計算するためにより多くのCPUが要求されることに注意してください。

同じエリアで同じサウンドを発する複数オブジェクト

例えば、ゲーム内のレベルのいずれかで、すべての廊下が壁にある松明で照らされているとします。これらの松明は、すべて同じで、全く同じ音を出します。それぞれの松明に、Playイベントを個別にポストすると(20本あったとして)、消費されるCPUやメモリはかなり増加します。また、サウンドがストリーミングされる場合、潜在的に複数の重複したストリームが存在するためI/Oアクセスが増加します。

このような状況では、 SetMultiplePositions() の使用がパフォーマンスを大幅に改善します。また、すべてのサウンドを1つの操作で簡単に制御することが可能で、登録する必要のあるゲームオブジェクト数を減らすことができます。

ゲームでこのシナリオを作成するには、 MultiPositionType_MultiSources またはMultiPositionType_MultiDirectionsを使用します。

MultiPositionType_MultiSources は一般的により正確ですが、ポジション同士が近すぎると問題となる場合があります。複数サウンドをシミュレートするために1つのボイスのみが再生される場合、Wwiseが異なるポジションのボリュームを追加するため、ボリュームが 0 dB を上回る可能性があることに注意してください。MultiPositionType_MultiDirections のCPU使用率はやや少なめで、単純に最大ボリュームを取り、各スピーカーでこれを再生します。MultiPositionType_MultiDirections はボリュームを加算せず、クリッピングが発生しないことが保証されるため、より適しているかもしれません。

サウンドの複数ポジションがあるにもかかわらず、サウンドエンジンに再生されるボイスは1つのみです。これは、全てのサウンドが範囲外にある場合、1つのバーチャルボイスのみが処理されることを意味します。

1つの音源の複数のチャンネルを、それぞれ別のポジションにアウトプットする

例えば車のスピーカー、つまりエミッターから、ステレオレコーディングされた大音量の音楽が流れているとします。下図のとおり、音楽のステレオソースファイルの、左右のインプットチャンネルを、左右のエミッターから、それぞれアウトプットすることができます。

この場合、 SetMultiplePositions() オーバーロードと、 AkChannelEmitter パラメータを合わせて使うと、インプットチャンネルを柔軟にアサインできます。エミッターポジションが、それぞれ左右のインプットチャンネルのどちらを使うべきかを、 AkChannelMask で指定できます。そうすると、ソースの左右チャンネルでオーディオコンテンツが異なれば、リスナーには、その時点の位置における左右チャンネルの差が聞こえてきます。

1つのマルチチャンネルソースが、聞くポジションによって、異なるチャンネルから聞こえる様子
注釈: 上図では、車の左と右に位置するリスナーにおいて、左エミッター(赤)と右エミッター(青)を組み合わせた音が、1つのアウトプットチャンネルから聞こえ、紫色で示されています。2つのエミッターを合算した具体的な内訳は、それぞれに設定された減衰距離やカーブで決まります。例えば車の右側から一定の距離だけ離れたリスナーには、左スピーカーより右スピーカーの音がよく聞こえるはずで、それは左スピーカーの減衰の方が大きいからです。右側から充分に離れた場所では、左スピーカーの音がリスナーに全く聞こえなくなることも考えられます。

開口部からのサウンドをシミュレート(サウンドの再配置)

サウンドが部分的にオブストラクションおよび/またはオクルージョンされている時、実際にこれらのサウンドがある位置とは別の方向から聞こえてくるように感じることがあります。このようなケースでは、サウンドを複数の場所に位置づけて希望するエフェクトを作成することができます。

例えば、サウンドのダイレクトパスが建物によってブロックされているような場合があるとします - 次の図を参照してください。オブジェクト Aの実際のポジションを使用する代わりに、次のような2つのポジションを交互に使用するほうがよりリアルなサウンドになります:A' および A''。その際、SetObjectObstructionAndOcclusion() を使用して、すべての位置に同じオクルージョンおよび妨害パラメータを適用するか、 SetMultipleObstructionAndOcclusion() を使用して、各サウンドの位置ごとに固有のオクルージョンおよび閉塞値を指定します。

2つの交互ポジションを使用してサウンドを再配置

このアプローチは、破壊された環境をシミュレートする場合にも上手く機能し、サウンドが任意の複数ポジションから聞こえて来るようにできます。サウンドを再配置する場合、 MultiPositionType_MultiDirections を使用することをお勧めします。

X-Y-Z座標系

Wwiseの音は、左手系の座標システムを想定しています。以下がデフォルト値ですが、重要なのは、リスナーのオリエンテーションフレームに対する、エミッターのポジションとオリエンテーションだけです。

  • X: 右向きのベクター
  • Y: 上向きのベクター
  • Z: 前向きのベクター
WwiseサウンドエンジンでのX、Y および Z軸の方向

3Dポジションの統合例は、 3D ポジション統合例 を参照してください。

参照
uint16_t AkUInt16
Unsigned 16-bit integer
AkUInt64 AkGameObjectID
Game object ID
Definition: AkTypes.h:60
AKRESULT
Standard function call result.
Definition: AkTypes.h:131
Position and orientation of game objects in the world (i.e. supports 64-bit-precision position)
Definition: AkTypes.h:411
AKSOUNDENGINE_API AKRESULT SetMultiplePositions(AkGameObjectID in_GameObjectID, const AkSoundPosition *in_pPositions, AkUInt16 in_NumPositions, MultiPositionType in_eMultiPositionType=MultiPositionType_MultiDirections, AkSetPositionFlags in_eFlags=AkSetPositionFlags_Default)
AKSOUNDENGINE_API AKRESULT SetPosition(AkGameObjectID in_GameObjectID, const AkSoundPosition &in_Position, AkSetPositionFlags in_eFlags=AkSetPositionFlags_Default)

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

サポートは必要ですか?

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

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

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

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

Wwiseからはじめよう