버전
menu

Wwise SDK 2024.1.6
Reverb Zone 사용하기

Reverb Zone(리버브 구역)은 뚜렷한 리버브 효과가 있는 Room 내의 특정 영역을 모델링하지만 인접한 Room에 연결할 때 별도의 포털이 필요하지 않습니다. 눈에 띄는 벽이 없거나 일반적으로 두 영역 사이의 접점에서 음의 공간이 양의 공간보다 많은 경우 기본 Room 대신 Reverb Zone을 사용하세요. 다음은 Reverb Zone을 사용할 수 있는 몇 가지 예입니다.

  • 야외 공간과 연결되며 지붕이 있는 발코니. 벽은 없지만 바닥과 천장이 있는 공간을 효과적으로 만들어냅니다.
  • 고속도로 고가도로. 고가도로 아래 공간에는 고유한 리버브가 필요하며, Reverb Zone은 외부 공간과 연결된 대형 포털보다 더 정확하고 간단한 솔루션입니다.
  • 산림 지역. 숲의 리버브는 주변 환경과 뚜렷이 구별되어야 하며, 독특한 분위기를 내야 합니다.
  • 산악 지대에서 야외에 있는 작은 도시나 마을.

Reverb Zone은 Wwise Spatial Audio 내의 Room 유형 중 하나로, Room과 모든 속성이 동일합니다. 또한 Reverb zone은,

  • 상위 Room이 있습니다. Reverb Zone의 상위 항목은 Reverb Zone이 포함된 Room입니다. 상위 Room은 자체 상위 Room이 있는 Reverb Zone이 될 수도 있습니다. Reverb Zone과 그 상위 항목은 Room의 계층 구조를 형성합니다. Reverb Zone은 상위 항목 내에 완전히 포함되게 하는 것이 좋습니다.
  • 전환 구역이 있습니다. 전환 구역은 Reverb Zone과 그 상위 항목 사이의 접점에 있는 모호한 경계입니다. 전환 구역의 너비는 사용자가 지정할 수 있으며, 게임 단위로 정의됩니다. 전환 구역은 Reverb Zone을 상위 항목에 연결하는 Portal과 비슷합니다. 두 개의 Room 사이의 전환을 부드럽게 하고, 게임 오브젝트가 전환 구역 안에 있을 때 다양한 매개변수를 크로스페이드합니다.
  • Reverb Zone의 크기와 모양을 정의하는 Geometry Set와 Geometry Instance가 있습니다. 표준 Room의 경우 지오메트리를 정의하는 것은 선택 사항입니다. 그러나 Reverb Zone의 경우에는 반드시 지오메트리를 정의해야 합니다. Spatial Audio가 오브젝트가 Reverb Zone으로 들어오고 나가는 시점을 계산할 수 있어야 하기 때문입니다.
  • 감쇠(attenuation)와 관련하여 몇 가지 고유한 고려 사항이 있습니다. (Reverb Zone과 감쇠(attenuation))

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의 상위 룸인 경우, 사운드는 한 Room/Reverb Zone에서 다른 Room/Reverb Zone으로 전달될 수 있습니다.

다음 예시에서는 Reverb Zone의 사용법을 보여줍니다. 이는 Wwise SDK의 일부로 배포되는 Integration Demo 프로젝트에 포함되어 있습니다.

이미터가 "Room Object"라는 이름의 Room 내부에서 재생됩니다.
사운드가 "Patio Object"라는 이름의 Reverb Zone에 연결된 Portal로부터 전달됩니다.
사운드가 Reverb Zone의 상위 계층 Room의 외부로 계속 전달됩니다. 외부에서 사운드가 또한 지오메트리에 의해 정의된 장애물 주변으로 회절됩니다.

Advanced Profiler나 Voice Inspector의 Voice Graph에서 5개의 Game Object가 어떻게 연결되어 있는지 확인할 수 있습니다.

"Emitter E" 이미터는 현재 안에 들어가있는 Room과 인접한 Room 모두에게 전송됩니다. 이 경우, 이미터는 "Room Object" 내부에 있고 "Patio Object"와 인접해 있습니다.
각 Room은 리스너에게 가장 짧은 경로를 따라 다음 Room으로 전송합니다. 'Room Object'는 'Patio Object'로 전송되고, 이는 다시 'Outside Object'로 전송됩니다. 'Patio Object'와 'Outside Object' 사이의 연결은 두 개의 Room 사이의 상위-하위 관계를 통해 만들어집니다.

Reverb Zone 전환 구역

AK::SpatialAudio::SetReverbZone API를 사용하면 Reverb Zone과 상위 Room 사이의 전환 구역을 지정할 수 있습니다. 이 전환 구역은 포털과 매우 유사한 기능을 합니다. 전환 구역은 Room의 지오메트리가 겹치지 않는 한 포털이나 다른 전환 구역과 겹칠 수 있습니다. 이러한 유형의 오버랩을 사용하면 Reverb Zone 간에 부드러운 크로스페이드를 만들 수 있습니다. Reverb Zone에 대한 전환 구역을 정의하려면 Reverb Zone Room에 한 개 이상의 '투명한' 표면이 있는 지오메트리가 있어야 합니다. 투명한 표면은 AkAcousticSurface::transmissionLoss 가 0으로 설정된 표면입니다. Reverb Zone의 전환 구역의 범위는 Room의 투명 삼각형 위치와 AK::SpatialAudio::SetReverbZone 에 전달된 in_transitionRegionWidth 매개변수에 의해 정의됩니다. 전환 구역은 각 삼각형을 중심으로 합니다. 한쪽 벽이 투명한 표면으로 구성된 Room을 생각해 보겠습니다. 이를 AK::SpatialAudio::SetReverbZone 을 호출하여 Reverb Zone으로 정의하고 in_transitionRegionWidth 를 5로 설정합니다. 전환 구역은 Game Object가 Reverb Zone 바깥쪽의 투명한 벽으로부터 5 단위 떨어져 있을 때 시작되고, Game Object가 Reverb Zone 안쪽의 벽을 지나 5 단위 떨어져 있을 때 끝납니다. 전환 구역은 투명한 삼각형으로만 정의되므로 전환 구역에 대한 사용자 정의 모양을 정의할 수 있습니다. Room 지오메트리 구조 정의에 대한 자세한 내용은 Room 지오메트리 설정하기 를 참조하세요.

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에 정의된 보조 버스의 이름.
    paramsRoom.RoomPriority = 1; // 'Outdoors'에 가장 낮은 순위를 정합니다.
    AK::SpatialAudio::kOutdoorRoomID, // Outdoor에는 특별히 예약된 ID가 있습니다.
    paramsRoom,
    "Outdoors");
  2. Reverb Zone의 모양을 정의합니다. 이 예시에서 사용할 모양은 단순한 상자입니다. 다음 샘플 코드는 표면과 삼각형을 정의하는 Geometry Set와 숲의 크기 및 위치를 정의하는 Geometry Instance를 생성합니다.
    AkGeometryParams geometryParams;
    // 지오메트리 세트에 대한 단위 크기 상자를 정의합니다.
    // 필요시 이 동일한 상자를 여러 개의 투명한 Room에 재사용할 수 있습니다.
    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}
    };
    // 단일 표면만 필요합니다.
    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을 만듭니다. AK::SpatialAudio::SetReverbZone 을 호출하여 Outdoors Room을 상위 Room으로 지정하고 전환 구역 너비를 설정합니다.
    paramsRoom.TransmissionLoss = 0.f; // 소리가 한 Room에서 다른 Room으로 방해받지 않고 전달되도록 합니다.
    paramsRoom.ReverbAuxBus = AK::SoundEngine::GetIDFromString("Forest_Reverb"); // Wwise Authoring에 정의된 보조 버스의 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과 감쇠(attenuation)

Reverb Zpme은 감쇠(attenuation)와 관련하여 Room의 동작과 속성을 상속하지만 다음과 같은 추가 고려 사항이 있습니다.

전달 손실

일반적으로 회절(diffraction) 경로는 전달 손실(transmission loss)을 수반하지 않습니다. 왜냐하면 전달 경로만이 표면을 통과할 수 있기 때문입니다. Reverb Zone에서 회절 경로는 AkRoomParams::TransmissionLoss 가 0보다 큰 Reverb Zone의 전환 구역을 통과하는 경우 변조 경로(wet path)와 룸 톤에 대한 예외가 발생합니다. 이런 일이 발생하면 같은 Room의 서로 다른 경로에서 전달 손실량이 달라질 수 있습니다. 이는 Voice Inspector에서 확인할 수 있습니다.

이 룸 톤의 예시에서는 Room에서 리스너에게 직접 전달되는 경로가 있습니다. 또한 포털을 통과하는 경로도 있습니다. 각 경로는 서로 다른 양의 전달 손실을 수반합니다.

직접 전달 경로에서의 전달은 리스너 공간과 이미터 공간의 전달 손실의 최대값으로서 Emitter-Listener (Direct) Connection 에서 설명한 방식대로 계산됩니다. 이러한 공간이 서로 다른 Reverb Zone 계층에 속하는 경우 전달 손실은 공간과 상위 공간 모두에서 최대가 됩니다.

회절 경로에서 경로가 전환 구역을 교차할 때마다 하위 공간의 전달 손실이 적용되며(AkRoomParams::TransmissionLoss로 지정), 최종 전달 손실은 경로를 따라 발견된 값의 최대값이 됩니다.

거리

Reverb Zone의 어떤 표면을 투명하게 할지(전송 손실이 0일지) 선택할 때는 주의해야 합니다. 이는 Reverb Zone에 있는 오브젝트와 상위 방 사이의 거리를 계산하는 데 영향을 미치기 때문입니다. Reverb Zone과의 거리는 가장 가까운 불투명 삼각형을 기준으로 계산됩니다.

일반적인 예시는 대규모 Reverb Zone의 바닥입니다. Reverb Zone의 바닥이 투명하고(표면 전송 손실이 0) 리스너가 벽에서 멀리 떨어진 위치에 있는 경우, 상위 공간과의 가장 가까운 거리는 바닥을 통과하게 되며, 이는 일반적으로 바람직하지 않습니다.

또 다른 일반적인 예는 다른 방으로 통하는 포털이 있는 Reverb Zone의 표면입니다. 포털이 연결된 표면은 일반적으로 불투명해야 합니다.

이 예시에서, Reverb Zone에서 강조 표시된 세 개의 표면이 불투명해져있습니다. 아래 표면은 바닥과 공유됩니다. 왼쪽 표면은 다른 공간과 공유하며 연결된 포털이 있습니다. 윗면은 천장이 덮인 발코니와 같은 것을 표현한 창의적인 선택입니다. 다른 모든 표면은 투명합니다.

Reverb Zone 배치 권장 사항

  • AK::SpatialAudio::SetReverbZone API 는 공간의 계층을 생성합니다. 상위-하위 관계는 AK::SpatialAudio::SetReverbZone 을 통해 직접 생성되고, 형제 관계는 두 개 이상의 Reverb Zone에 대해 동일한 상위 공간을 지정하여 생성됩니다.
  • 포털은 동일한 계층에 속한 공간을 연결하는 데 사용할 수 없습니다. 왜냐하면 Reverb Zone과 해당 상위 공간 간의 전환이 이미 전환 구역에 의해 정의되어 있기 때문입니다. 동일한 계층 구조 내에서 포털이 방을 연결하도록 하는 매개변수를 사용하여 AK::SpatialAudio::SetReverbZoneAK::SpatialAudio::SetPortal 을 호출하면 실패합니다.
  • Reverb Zone 전환 구역은 항상 상위 공간에 직접 연결되고 전환되며, 인접하거나 형제 공간에 연결하는 데 사용할 수 없습니다. 이러한 이유로 두 개의 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:494
AkVertIdx NumVertices
Number of vertices in Vertices.
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:429
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:514
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
3D vector for some operations in 3D space. Typically intended only for localized calculations due to ...
Definition: AkTypes.h:369
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를 시작해 보세요