버전

menu_open
Wwise SDK 2021.1.14
통합 세부사항 - 3D 위치 지정

사운드는 선택적으로 위치를 할당하고 게임에서 등록한 오브젝트에 Event를 전달해서 Wwise 내에 재생됩니다. 따라서 이러한 게임 오브젝트는 방사체 가 됩니다. 시뮬레이션 된 3D 환경의 방사체와 리스너 의 상대 좌표는 사운드 패닝과 다른 속성들을 나르는데 사용할 수 있습니다. 이는 청각과 시각적 경험이 신뢰할만한 3D 환경에서 플레이어를 몰입하도록 도와줍니다.

Wwise에서 디자이너는 사운드를 수동으로 플레이어가 구축한 스피커를 따라다닐지(Speaker Panning), 게임 오브젝트 위치 기반으로 따라다닐지(3D Spatialization) 선택할 수 있습니다. 추가적으로 감쇠 곡선과 거리 또는 각도 기반의 사운드 속성(볼륨, 필터링 등)을 수정할 수 있는 설정을 할당할 수도 있습니다.

게임 오브젝트의 위치 설정

위치 정보를 요구하는 사운드의 모든 게임 오브젝트에 대해서 AK::SoundEngine::SetPosition() 함수를 호출합니다. 또한, 리스너 게임 오브젝트에 대해서도 이 함수를 호출해줘야 합니다. 게임 오브젝트의 위치가 변경될 때마다 매번 위치를 설정해줘야 합니다.

AkGameObjectID in_GameObjectID, // 게임 오브젝트 식별자
const AkSoundPosition & in_Position // 설정할 위치
);

첫 번째 매개 변수는 게임 오브젝트의 ID입니다. 더 많은 정보는 통합 세부사항 - 게임 오브젝트 를 참고하세요.

두 번째 매개 변수는 게임 오브젝트의 위치와 방향을 나타내는 벡터가 포함된 AkTransform 구조체입니다. Wwise 사운드 엔진에서 X, Y, Z를 정의하는 방법에 관한 정보는 X-Y-Z 좌표 시스템 을(를) 참고하세요.

참고: AK::SoundEngine::SetPosition() 함수를 여러 번 호출한 다음 AK::SoundEngine::RenderAudio() 함수를 호출하면, 마지막으로 설정한 값을 사용하게 됩니다.

리스너의 위치 따라가기

방사체의 위치를 자동으로 리스너의 위치로 유지하도록 하려면, 매 프레임마다 명시적으로 리스너의 위치와 같은 값으로 게임 오브젝트의 위치를 설정해줘야 합니다. 리스너 게임 오브젝트에 Event도 전달할 수 있습니다.

단일 게임 오브젝트에 대해 복수의 위치 설정하기

각 게임 오브젝트에 대해 단일 3D 위치만을 허용하는 AK::SoundEngine::SetPosition() 함수를 사용하는 대신, AK::SoundEngine::SetMultiplePositions() 함수를 사용할 수 있습니다. 이 메소드는 단일 게임 오브젝트에 대해서 복수의 3D 좌표 설정을 허용합니다.

AkGameObjectID in_GameObjectID, ///< 게임 오브젝트 식별자
const AkSoundPosition * in_pPositions, ///< 적용할 위치에 대한 배열
AkUInt16 in_NumPositions, ///< 제공된 배열에 지정된 위치의 개수
MultiPositionType in_eMultiPositionType ///< \ref AK::SoundEngine::MultiPositionType
);
);

MultiPositionType는 신중히 선택해야 합니다. 이 함수는 생성하려는 효과의 종류나 상황에 따라 달라집니다.

  • MultiPositionType_MultiSources() 함수를 사용하면 동시에 같은 사운드를 방출하는 복수의 오브젝트를 시뮬레이션하도록 서로 다른 볼륨이 추가됩니다. 이 함수는 다양한 상황에서 유용할뿐만 아니라, 완전히 같은 사운드를 방출하는 수많은 오브젝트와도 잘 작동합니다. 그러나 사운드가 서로 너무 가까울 때는 특정 문제를 일으킬 수도 있습니다. 문제는 볼륨을 추가했을 때, 복수의 사운드가 정확히 같은 단계에서 재생되어 클리핑 될 가능성이 높아지는 점입니다.
  • MultiPositionType_MultiDirections() 함수를 사용하면, 각각의 스피커에 재생되는 볼륨의 크기는 각 방향에 대해서 최대가 됩니다. 이 함수는 게임의 다양한 상황을 시뮬레이션하는데 사용할 수 있습니다. 예를 들어, 동시에 같은 사운드를 방출하는 복수의 오브젝트뿐만 아니라 뚫린 벽이나 구역 사운드를 포함합니다. 그러나 사운드를 방출하는 두 개 이상의 오브젝트가 아주 근접해 있을 때 게임 플레이어가 사운드가 커질 것을 예상하려면, MultiPositionType_MultiSources 함수를 사용해 해당 사운드를 추가해야 합니다.
  • The MultiPositionType_SingleSource() 함수는 SetMultiplePositions() 와 함께 사용하면 안됩니다. 이 함수는 첫 번째 수신된 위치만 사용하기 때문입니다.

단일 게임 오브젝트에 대해 복수의 위치를 생성하여 다음과 같이 다양하고 많은 사운드 효과를 시뮬레이션할 수 있습니다.

구역 사운드

Spread와 거리 기반의 Volume Attenuation의 값으로 적절하게 결합된 MultiPositionType_MultiDirections() 옵션을 사용해서 구역 사운드를 시뮬레이션할 수 있습니다. 해당 메소드를 사용할 때, 위치의 개수가 추가로 볼륨을 증가시키지 않도록 해줘야 합니다. 이 메소드를 사용해 구역 사운드를 재생성하여 현실감 있는 감쇠로 여러 방향에서 오는 단일 사운드를 가질 수 있습니다.

다음 예제에서 검은색 점은 사운드의 초기 위치를, 검은색 원은 감쇠와 확산에 대한 최소 거리, 핑크색 원은 최대 반경을 나타냅니다.

도표: 복수의 위치로 구역 사운드의 샘플

파란색 부분은 게임에서 호수를 나타냅니다. 호수에서 내뿜는 환경 사운드는 4개의 위치로 사운드를 사용해 시뮬레이션 됩니다.

리스너가 A 위치에 있을 때 호수의 사운드가 모든 방향에서 출력되어야 합니다. 이는 모든 스피커로 출력되도록 사운드를 분산시키는 적절히 높은 확산 값을 설정해서 달성할 수 있습니다.

리스너가 B 위치에 있을 때 최대 감쇠 거리에 놓이게 됩니다. 이는 아무런 호수 사운드를 듣지 못하거나 최대 감쇠로 희미한 사운드만 듣게 되는 걸 의미합니다. 거대한 호수를 시뮬레이션 하는 데 있어서 복수의 위치를 사용하기 때문에, 사운드는 항상 올바른 방향에서 들리게 됩니다.

리스너가 C 위치에 있을 때 스피커의 넓은 각도(~180도)로 호수 사운드를 듣게 되나, 리스너가 호수로부터 특정 거리만큼 떨어져 있어서 해당 사운드는 약해지게 됩니다. 이러한 상황에서 리스너는 여전히 감쇠 반경 내에 있어서 호수 사운드는 최대 레벨로 줄지 않게 됩니다.

이러한 기술을 사용하여 여러 개의 사운드 위치를 겹치게 해서 어떠한 종류의 오브젝트 모양이든 재생성할 수 있습니다. 그러나 각각의 새로운 위치의 추가로 볼륨을 계산하는 데 있어서 더 많은 CPU의 사용이 요구된다는 점에 유의하세요.

같은 구역에 같은 사운드를 방출하는 여러 개의 오브젝트

예를 들어 복도가 있는 하나의 레벨에서 벽에 연달아 있는 횃불들에 의해 빛을 비춘다고 가정해봅니다. 해당 횃불들은 전부 다 같은 모양에 완전히 똑같은 사운드를 재생하게 됩니다. 만약 횃불 각각에 대해 따로따로 Play Event를 발송하면(20개라고 가정하고) 눈에 띄게 많은 CPU와 메모리를 소비하게 됩니다. 또한, 사운드가 스트리밍될 경우, 잠재적으로 여러 개의 복사된 스트림을 가질 수 있습니다. 이는 I/O 접근을 증가시킬 수 있습니다.

이러한 상황에서 SetMultiplePositions() 사용하는 것은 훌륭한 성능향상을 하게 됩니다. 또한, 동시에 모든 사운드를 손쉽게 제어하도록 해주며 등록이 필요한 게임 오브젝트의 개수를 줄여줍니다.

게임에서 이와 같은 시나리오를 생성하려면 MultiPositionType_MultiSources()MultiPositionType_MultiDirections() 중 하나를 사용하면 됩니다.

일반적으로 MultiPositionType_MultiSources() 좀 더 정확하지만, 위치가 다른 것과 너무 가까우면 문제가 될 수도 있습니다. 복수의 사운드를 시뮬레이션하도록 하나의 음성만 재생될 때 Wwise는 서로 다른 위치의 볼륨을 추가한다는 점을 명심하세요. 이는 볼륨이 0dB로 되는 결과를 가져올 수 있습니다. MultiPositionType_MultiDirections() 조금 적은 CPU를 사용하며, 단순히 최대 볼륨을 받아 각각의 스피커를 통해 이를 재생합니다. MultiPositionType_MultiDirections() 볼륨을 더하지 않아, 클리핑이 없는 걸 보장해서 더욱더 알맞게 될 수 있습니다.

사운드에 대해서 복수의 위치를 가짐에도 불구하고 사운드 엔진에 의해 재생되는 음성은 여전히 하나만 있습니다. 이는 모든 사운드가 범위를 벗어나서 하나의 가상 음성만 처리됨을 의미합니다.

단일 음원의 서로 다른 채널을 다양한 위치로 출력하기

자동차 한 대의 스피커에서 스테레오로 녹음된 음악이 흘러나오는 경우를 가정해봅시다. 즉, 이는 곧 이미터(emitter)가 됩니다. 아래 보이는 그림에서처럼, 왼쪽과 오른쪽 이미터에서 각각 이 음악의 스테레오 음원 파일의 왼쪽 입력 채널과 오른쪽 입력 채널이 출력될 수 있습니다.

이 경우, SetMultiplePositions() 오버로드를 AkChannelEmitter 와 함께 사용하면 입력 채널을 유연하게 할당할 수 있습니다. AkChannelMask 는 이미터 위치가 왼쪽과 오른쪽 중 어느 입력 채널을 사용할 지를 지정합니다. 따라서 만약 음원의 왼쪽 채널과 오른쪽 채널의 오디오 콘텐츠가 다를 경우, 리스너는 현재 위치에 따라 이들의 차이를 들을 수 있습니다.

그림: 단일 멀티채널 음원이 서로 다른 위치에 각각 다른 채널을 어떻게 방출하는 지 보여줌
참고:
위 그림에서 자동차의 왼쪽과 오른쪽 리스너는 왼쪽 이미터(빨간색)와 오른쪽 이미터(파란색)가 단일 출력 채널로 조합된 소리를 듣게 되며, 이는 보라색 영역으로 표시됩니다. 이미터들의 실제 조합은 감쇠 거리와 감쇠 곡선의 설정 내용에 따라 달라집니다. 예를 들어, 자동차의 오른쪽에서 일정 거리에 있는 리스너에게는 왼쪽 스피커보다 오른쪽 스피커 소리가 더 크게 들리며, 감쇠가 더 크게 됩니다. 오른쪽 리스너의 거리가 어느 정도 멀어지면 왼쪽 스피커의 소리가 아예 들리지 않을 수도 있습니다.

뚫린 공간으로부터 들리는 사운드 시뮬레이션하기 (Sound Relocalization, 사운드 재지역화)

사운드가 부분적으로 방해 또는 차단되면, 실제로 위치한 곳보다는 서로 다른 방향으로부터 들리게 나타날 것입니다. 이러면 원하는 효과를 생성하도록 여러 위치에서 사운드의 위치를 정할 수 있습니다.

예를 들어, 사운드의 출력 경로가 빌딩에 의해서 차단되었다고 가정해봅시다. 다음 그림을 참고하세요. A 오브젝트의 실제 위치를 사용하는 대신에 A'와 A'' 두 개의 다른 위치를 사용하는 게 더욱 현실감 있는 사운드가 될 것입니다. 이렇게 하려면 SetObjectObstructionAndOcclusion() 사용해서 같은 방해와 차단 매개 변수가 모든 위치에 적용되게 됩니다. 또는, SetMultipleObstructionAndOcclusion() 사용해서 고유한 방해 및 차단 값을 각각의 사운드 위치에 지정할 수도 있습니다.

수치: 두 개의 다른 위치를 사용해 사운드의 위치 재설정

파괴된 환경을 시뮬레이션할 때 사운드가 임의의 다양한 위치로부터 들리는 상황에서도 이러한 접근법이 잘 동작합니다. 사운드의 위치를 다시 지역화할 때, MultiPositionType_MultiDirections() 메소드를 사용하는 게 좋습니다.

X-Y-Z 좌표 시스템

Wwise 사운드는 왼손 좌표계를 요구합니다. 방사체의 위치와 좌표는 리스너의 기준 좌표계에 상대적이긴 하나, 기본값은 다음과 같습니다.

  • X: 오른쪽을 가리키는 벡터
  • Y: 위쪽을 가리키는 벡터
  • Z: 앞쪽을 가리키는 벡터
Wwise 사운드 엔진에서 X, Y, Z축의 방향

3D 위치의 통합에 대한 예제로 3D 위치 지정 예제 를 참고하세요.

참고
MultiPositionType
Definition: AkTypes.h:776
AkUInt64 AkGameObjectID
Game object ID
Definition: AkTypes.h:70
AKRESULT
Standard function call result.
Definition: AkTypes.h:132
uint16_t AkUInt16
Unsigned 16-bit integer
Definition: AkTypes.h:58
AKSOUNDENGINE_API AKRESULT SetMultiplePositions(AkGameObjectID in_GameObjectID, const AkSoundPosition *in_pPositions, AkUInt16 in_NumPositions, MultiPositionType in_eMultiPositionType=MultiPositionType_MultiDirections)
AKSOUNDENGINE_API AKRESULT SetPosition(AkGameObjectID in_GameObjectID, const AkSoundPosition &in_Position)
Position and orientation of game objects.
Definition: AkTypes.h:346

이 페이지가 도움이 되었나요?

지원이 필요하신가요?

질문이 있으신가요? 문제를 겪고 계신가요? 더 많은 정보가 필요하신가요? 저희에게 문의해주시면 도와드리겠습니다!

지원 페이지를 방문해 주세요

작업하는 프로젝트에 대해 알려주세요. 언제든지 도와드릴 준비가 되어 있습니다.

프로젝트를 등록하세요. 아무런 조건이나 의무 사항 없이 빠른 시작을 도와드리겠습니다.

Wwise를 시작해 보세요