バージョン

menu_open
警告:あなたのメジャーリリース ( 2023.1.10.8659 ) に該当する最新ドキュメンテーションが表示されています。特定バージョンのドキュメンテーションにアクセスするには、Audiokinetic Launcherでオフラインドキュメンテーションをダウンロードし、Wwise AuthoringのOffline Documentationオプションにチェックを入れてください。
Wwise SDK 2023.1.10
Reverb Zoneの使用

Reverb Zoneは、独自のリバーブエフェクトを持つRoom内の領域をモデル化しますが、隣接するRoomと接続するためにポータルを必要としません。明確な壁がない場合、または一般的に2つの領域間の境界面にあるネガティブスペースがポジティブスペースよりも多い場合は、標準的なRoomの代わりにReverb Zoneを使用します。以下に、Reverb Zoneを活用できるシナリオ例をいくつかご紹介します:

  • 屋外スペースへとつながる屋根付きのバルコニー。実質的に、壁がなく床と天井があるルームを作成します。
  • 高速道路の陸橋。陸橋の下のエリアには独自のリバーブが必要であり、外側のエリアにつながる大型のポータルよりも、Reverb Zoneの方が正確でわかりやすいソリューションです。
  • 森林エリア。森林リバーブは周囲の環境と異なり、独自の雰囲気を設定することもできます。
  • 山の多い屋外の領域にある小さな都市や村のエリア。

Reverb Zoneは、Wwise Spatial AudioにあるRoomタイプで、Roomと同じプロパティをすべて利用できます。またReverb Zoneには以下があります:

  • 親のRoom。Reverb Zoneの親は、Reverb Zoneを含むRoomです。親のルームは、自身の親を持つReverb Zoneの場合もあります。Reverb Zoneとその親はルームの階層を形成します。Reverb Zone全体が親の中に含まれることが推奨されます。
  • トランジション領域。トランジション領域は、Reverb Zoneと親の接合部分にある、あいまいな境界です。トランジション領域の幅はカスタマイズが可能で、ゲームユニットで定義します。トランジション領域は、Reverb Zoneとその親をつなぐPortalに相当します: 2つのRoom間のトランジションを円滑にし、Game Objectがトランジション領域内にある時にさまざまなパラメータをクロスフェードさせます。
  • Reverb Zoneの大きさと形状を定義するGeometry SetとGeometry Instance。 標準的なRoomではジオメトリの定義は任意です。一方Reverb Zoneでは必要で、Reverb Zoneに出入りするオブジェクトのトランジション時にSpatial Audioが計算に使用します。
  • 減衰に関する特有の留意事項。( Reverb Zoneとアテニュエーション(減衰)

Reverb Zoneを通る音伝播

音伝播は複数の方法で管理でき、 AK::SoundEngine::SetGameObjectAuxSendValues でセンドを追加できるほか、Reverb Zoneを利用できます。しかしReverb Zoneにはメリットがあり、Wwise Spatial AudioのRooms and Portals APIが提供する音伝播フレームワークと統合され、これを最大限に活用します。

  • Reverb ZoneはRoomであるため、独自のGame Objectでレンダリングされ、3Dで空間化されます。
  • Reverb Zoneは、別のReverb Zoneなど、ほかのRoomと連結されます。あるRoom/Reverb Zoneから別のRoom/Reverb Zoneへの音の伝播が可能で、その場合はポータル、または片方のReverb Zoneが親であればもう片方のRoomにより、2つのRoomが接続されていることが条件です。

以下は、Reverb Zoneの活用を示した例です。Wwise SDKの一部として配布されるIntegration Demoプロジェクトに含まれています。

エミッタが「Room Object」というRoom内で再生します。
サウンドが、「Patio Object」というReverb Zoneに接続されたPortalから、外へと伝播されます。
サウンドは外に伝播し続け、Reverb Zoneの親ルームまで伝播します。外に出たサウンドはさらに、ジオメトリによって定義された障害物の周りを回折します。

Advanced ProfilerまたはVoice InspectorのVoice Graphで、5つのGame Objectが連結されている様子を確認できます。

エミッタ「Emitter E」が、現在エミッタが含まれているRoomと、隣接するすべてのRoomの両方に送信します。この場合、エミッタは「Room Object」に含まれていて、「Patio Object」に隣接しています。
各Roomが次のRoomへと送信し、リスナーへの最短パスをたどります。「Room Object」が「Patio Object」へと送信し、次に「Patio Object」が「Outside Object」へと送信します。「Patio Object」と「Outside Object」間のリンクは、2つのRoom間の親子関係によって確立されます。

Reverb Zoneのトランジション領域

AK::SpatialAudio::SetReverbZone APIを使用し、Reverb Zoneとその親のRoom間のトランジション領域を指定できます。このトランジション領域の機能はポータルと非常に似ています。トランジション領域は、各Roomのジオメトリが重ならない限り、ポータルやほかのトランジション領域と重なっても問題ありません。この種のオーバーラップを活用し、Reverb Zone間にスムーズなクロスフェードを作成できます。Reverb Zoneのトランジション領域を定義するには、Reverb Zone Roomのジオメトリに1つ以上の「トランスペアレント(透過的)」な面が必要です。トランスペアレントな面とは、 AkAcousticSurface::transmissionLoss を0に設定した面です。Reverb Zoneのトランジション領域の範囲は、Roomのトランスペアレントな三角形の場所と、 AK::SpatialAudio::SetReverbZone に渡される in_transitionRegionWidth パラメータで定義されます。トランジション領域は、各三角形を中心とします。例えば1つの壁がトランスペアレントな面で構成されたRoomを AK::SpatialAudio::SetReverbZone をコールしてReverb Zoneとして定義し、 in_transitionRegionWidth を5に設定したとします。トランジション領域は、Game ObjectがReverb Zoneの外側でトランスペアレントな壁から5ユニットまで近づいた時に始まり、Game ObjectがReverb Zoneの内側で壁を5ユニット過ぎた時に終わります。トランジション領域はトランスペアレントな三角形でのみ定義されるため、トランジション領域にカスタムの形状を定義できます。ルームジオメトリの定義の詳細については ルームのジオメトリを設定する をご参照ください。

Reverb Zoneの作成

このセクションでは、一般的なReverb Zoneの作成手順を説明します。以下の例で屋外環境に囲まれた森林を作成する方法を示します。森林と屋外環境は、それぞれ独自のリバーブエフェクトを持ちます。

  1. 「Outdoors」Roomのパラメータをカスタマイズします。「Outdoors」Roomは自動的に作成されますが、リバーブバスをアサインするために AK::SpatialAudio::SetRoom をコールする必要があります。
    paramsRoom.TransmissionLoss = 0.f;
    paramsRoom.ReverbAuxBus = AK::SoundEngine::GetIDFromString("Outdoors_Reverb"); // Wwise Authoringで定義したAUXバスの名前。
    paramsRoom.RoomPriority = 1; // 「Outdoors」を最低のプライオリティ(優先度)に設定します。
    AK::SpatialAudio::kOutdoorRoomID, // Outdoorsには特別に確保されたIDがあります
    paramsRoom,
    "Outdoors");
  2. Reverb Zoneの形状を定義します。この例では、形状はシンプルな箱型です。以下のサンプルコードにより、面(surface)と三角形(triangle)を定義するGeometry Setと、森林の規模(scale)と位置(position)を定義するGeometry Instanceを作成します。
    AkGeometryParams geometryParams;
    // ジオメトリセット用にユニットサイズのボックスを定義します。
    // この同じボックスを、必要に応じて複数のトランスペアレントなルームに再利用できます。
    AkVertex vertices[] = {
    { 0, 0, 0 },
    { 0, 1.f, 0 },
    { 1.f, 0, 0 },
    { 1.f, 1.f, 0 },
    { 1.f, 0, 1.f },
    { 1.f, 1.f, 1.f },
    { 0, 0, 1.f },
    { 0, 1.f, 1.f }
    };
    // 面のインデックスID。
    // すべてを単一のトランスペアレントな面に設定します。
    AkSurfIdx bottomWall = 0;
    AkSurfIdx rightWall = 0;
    AkSurfIdx topWall = 0;
    AkSurfIdx leftWall = 0;
    AkSurfIdx floor = 0;
    AkSurfIdx ceiling = 0;
    AkTriangle triangles[] = {
    {0, 1, 2, bottomWall},
    {1, 2, 3, bottomWall},
    {2, 3, 4, rightWall},
    {3, 4, 5, rightWall},
    {4, 5, 6, topWall},
    {5, 6, 7, topWall},
    {6, 7, 0, leftWall},
    {7, 0, 1, leftWall},
    {0, 2, 4, floor},
    {0, 4, 6, floor},
    {1, 3, 5, ceiling},
    {1, 5, 7, ceiling}
    };
    // 必要な面は1つのみです
    surface.transmissionLoss = 0.f;
    surface.surface = "Transparent"
    geometryParams.NumVertices = 8;
    geometryParams.Vertices = vertices;
    geometryParams.NumTriangles = 12;
    geometryParams.Triangles = triangles;
    geometryParams.NumSurfaces = 1;
    geometryParams.Surfaces = &surface;
    AK::SpatialAudio::SetGeometry(BOX_GEOMETRY_ID, geometryParams);
    // Reverb Zoneを定義するジオメトリのインスタンスを作成します
    //
    AkGeometryInstanceParams instanceParams;
    instanceParams.GeometrySetID = BOX_GEOMETRY_ID;
    // 森林の規模と位置をカスタマイズします。
    AkVector scale = {WIDTH, HEIGHT, DEPTH};
    instanceParams.Scale = scale;
    position.SetOrientation(0.f, 0.f, 1.f, 0.f, 1.f, 0.f);
    position.SetPosition(X, Y, Z);
    instanceParams.PositionAndOrientation = position;
    // このジオメトリインスタンスはReverb Zoneの定義にのみ使用します
    instanceParams.UseForReflectionAndDiffraction = false;
    AK::SpatialAudio::SetGeometryInstance(FOREST_GEOMETRY_INSTANCE, instanceParams);
  3. 森林のRoomを作成します。setの AK::SpatialAudio::SetReverbZone をコールして親のRoomとしてOutdoors Roomをアサインし、トランジション領域の幅を設定します。
    paramsRoom.TransmissionLoss = 0.f; // サウンドが1つのルームから別のルームへとオクルージョンを受けずに移動するようにします。
    paramsRoom.ReverbAuxBus = AK::SoundEngine::GetIDFromString("Forest_Reverb"); // Wwise Authoringで定義したAUXバスのID。
    AK::SpatialAudio::SetRoom(FOREST_ROOM_ID, paramsRoom, "Forest");
    const AkReal32 kTransitionRegionWidth = 10.f; // 自由にカスタマイズします。
    AK::SpatialAudio::SetReverbZone(FOREST_ROOM_ID, AK::SpatialAudio::kOutdoorRoomID, kTransitionRegionWidth)

Reverb Zoneとアテニュエーション(減衰)

Reverb Zoneの減衰は、Roomの動作とプロパティを継承し、追加の留意事項があります:

透過損失

面を通過できるのは透過パスのみのため、回折パスが透過損失を持つことは通常ありません。Reverb Zoneでは、 回折パスが通過するReverb Zoneのトランジション領域の AkRoomParams::TransmissionLoss が0を超える場合、ウェットパスとルームトーンにおいて例外が発生します。その場合は、同じ部屋からの異なるパスが、異なる透過損失量を持つ可能性があります。これはVoice Inspectorで確認できます:

このルームトーンの例では、ルームからリスナーへと直接の透過パスがあります。さらに、ポータルを通って回折するパスがあります。各パスの透過損失量は異なります。

直接透過パスの透過は、 エミッタとリスナーの(直接)コネクション に計算方法が記載されており、リスナーのルームとエミッタのルームにおける透過損失の最大値です。これらのルームが別々のReverb Zone階層に含まれる場合、透過損失は、ルームとそれぞれの親の両方における最大値です。

回折パスでは、パスがトランジション領域を通る時は子のルームの透過損失( AkRoomParams::TransmissionLoss で指定)が採用され、最終的な透過損失はパス上で見つかった最大値です。

距離

Reverb Zoneのどの面をトランスペアレント(透過損失を0)にするかを選ぶ際は、Reverb Zone内のオブジェクトと親のルーム間の距離の計算に影響するため、気を付ける必要があります。Reverb Zoneまで、およびReverb Zoneからのすべての距離計算は、最も近い不透過の三角形に基づき測定されます。

よくある例として、大規模なReverb Zoneの床があげられます。Reverb Zoneの床がトランスペアレント(床面の透過損失が0)で、リスナーがいずれの壁からも遠く離れた場所に配置されている場合、親のルームへの最短距離は床経由となるため、多くの場合望ましくありません。

別の例をあげると、Reverb Zoneの1つの面に、別のルームへのポータルがあることも珍しくありません。ポータルが接続された面は、通常は不透過のはずです。

この例では、Reverb Zoneの強調表示された3つの面が不透過になっています。底面は床と共有されています。左の面は別のルームと共有され、ポータルが接続されています。上面は創造性を活かして、例えば屋根付きのバルコニーなどを表します。ほかの面はすべてトランスペアレントです。

Reverb Zoneの配置に関する推奨事項

  • AK::SpatialAudio::SetReverbZone APIでルームの階層を作成します。親子関係は AK::SpatialAudio::SetReverbZone で直接作成し、兄弟関係は2つ以上のReverb Zoneに同じ親ルームを指定することで作成します。
  • 各Reverb Zoneとその親ルーム間のトランジションをトランジション領域によって定義済みのため、同じ階層に含まれるルーム間はポータルを使用して接続できません。同じ階層内のルームをポータルで接続させるパラメータで AK::SpatialAudio::SetReverbZone または AK::SpatialAudio::SetPortal をコールすると失敗します。
  • Reverb Zoneのトランジション領域は、常に親ルームに直接接続およびトランジションし、隣接するルームや兄弟ルームに接続するために使用することはできません。このため2つのReverb Zoneが隣接し壁を共有する場合、共有する壁はトランスペアレントにできません。共有する壁の AkAcousticSurface::transmissionLoss は0を超えるようにしてください。Reverb Zoneから別のReverb Zoneへと直接トランジションすることはできないため、各Reverb Zoneとそのトランジション領域は重ならないようにします。
  • 別のルームと共有する面(Reverb Zoneが親ルームと共有する面など)は一般的にトランスペアレントにしません。例えばReverb Zoneで床面や天井面を通じて音を伝播させない場合などです。
  • ポータルと同様、Reverb Zoneのトランジション領域のサイズにより、Reverb Zoneのプロパティが影響を及ぼすエリアを指定します。Reverb Zoneへのスムーズなトランジションを実現するには、トランジション領域を広くするとよいでしょう。
Triangle for a spatial audio mesh.
AkTriIdx NumTriangles
Number of triangles in Triangles.
AkReal32 transmissionLoss
AKSOUNDENGINE_API AKRESULT SetReverbZone(AkRoomID in_ReverbZone, AkRoomID in_ParentRoom, AkReal32 in_transitionRegionWidth)
AkAcousticSurface * Surfaces
void SetPosition(const AkVector64 &in_position)
Set position.
Definition: AkTypes.h:487
AkVertIdx NumVertices
float AkReal32
32-bit floating point
AkUInt16 AkSurfIdx
Position and orientation of game objects in the world (i.e. supports 64-bit-precision position)
Definition: AkTypes.h:422
AKSOUNDENGINE_API AKRESULT SetGeometry(AkGeometrySetID in_GeomSetID, const AkGeometryParams &in_params)
void SetOrientation(const AkVector &in_orientationFront, const AkVector &in_orientationTop)
Set orientation. Orientation front and top should be orthogonal and normalized.
Definition: AkTypes.h:507
AKSOUNDENGINE_API AKRESULT SetGeometryInstance(AkGeometryInstanceID in_GeometryInstanceID, const AkGeometryInstanceParams &in_params)
AkTriangle * Triangles
Vertex for a spatial audio mesh.
Parameters passed to SetGeometryInstance
constexpr AkRoomID kOutdoorRoomID
The outdoor room ID. This room is created automatically and is typically used for outdoors,...
AkSurfIdx NumSurfaces
Number of of AkTriangleInfo structures in in_pTriangleInfo and number of AkTriIdx's in in_infoMap.
AKSOUNDENGINE_API AkUInt32 GetIDFromString(const char *in_pszString)
AkVertex * Vertices
Number of vertices in Vertices.
3D vector for some operations in 3D space. Typically intended only for localized calculations due to ...
Definition: AkTypes.h:362
AkGeometrySetID GeometrySetID
Parameters passed to SetGeometry
AkWorldTransform PositionAndOrientation
AKSOUNDENGINE_API AKRESULT SetRoom(AkRoomID in_RoomID, const AkRoomParams &in_Params, const char *in_RoomName=nullptr)

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

サポートは必要ですか?

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

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

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

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

Wwiseからはじめよう