Аудио пространственный SDK
Аудио пространственный модуль SDK предоставляет инструменты управления для изменения способа передачи звука из источника звука в окружающее пространство. Это расширение нативного аудио плагина SDK.
Встроенный панорамирование источников звука является простой формой пространственной локализации. Он принимает источник и регулирует усиление левого и правого уха на основе расстояния и угла между слушателем и источником звука. Это обеспечивает простые указания направленности для проигрывателя на горизонтальной плоскости.
Unity Audio Spatializer SDK и пример реализации
Ради гибкости и поддержки пространственной обработки звука в Unity есть открытый интерфейс — Audio Spatializer SDK, расширяющий Native Audio Plugin SDK. Стандартный паннер Unity можно заменить более совершенным и дать ему доступ к важным метаданным об источнике и слушателе, нужным для расчёта.
Для примера нативного аудио-плагина пространственности см. Unity Native Audio Plugin SDK. Плагин поддерживает только прямую Head-Related Transfer Function (HRTF), и предназначен только для примерных целей.
Вы можете использовать простой reverb, включенный в плагин, для маршрутизации аудиоданных из плагина spatializer в плагин reverb. Фильтрация HRTF основана на модифицированной версии набора данных KEMAR. Для получения дополнительной информации о наборе данных KEMAR, см. документацию и файлы измерений MIT Media Lab.
Если вы хотите изучить набор данных, полученных от человека, обратитесь к набору данных IRCAM.
Инициализация Unity Аудио Спейсалайзера
Unity применяет пространственные эффекты непосредственно после того, как Audio Source декодирует аудиоданные. Это создает поток аудиоданных, в котором каждый источник имеет свой отдельный экземпляр эффекта. Unity только обрабатывает аудио из этого источника с соответствующим экземпляром эффекта.
Чтобы разрешить плагину работать в качестве пространственного эффекта, вам нужно установить флаг в битовом поле описания эффекта:
definition.flags |= UnityAudioEffectDefinitionFlags_IsSpatializer;
Если вы установите флаг UnityAudioEffectDefinitionFlags_IsSpatializer, Unity распознает плагин как пространственный во время фазы сканирования плагина. Когда Unity создает экземпляр плагина, он выделяет структуру UnityAudioSpatializerData для члена spatializerdata структуры UnityAudioEffectState.
Чтобы использовать пространственный эффект в проекте, выберите его в настройках Project (меню: Изменить > Project Настройки > Аудио):
Затем, в окне Inspector для источника звука, который вы хотите использовать с плагином spatializer, включите Спасиализировать:
Вы также можете включить пространственный анализ для источника звука через скрипт C#, используя свойство AudioSource.spatialize.
В приложении с большим количеством звуков, вы можете включить пространственный эффект только на близлежащих звуках и использовать традиционный панорамирование на удаленных звуках, чтобы уменьшить нагрузку CPU на поток микширования для эффектов пространственного эффекта.
Если вы хотите, чтобы Unity передавал пространственные данные в плагин аудиомиксера, который не является пространственным, вы можете использовать следующий флаг в битовом поле описания:
definition.flags |= UnityAudioEffectDefinitionFlags_NeedsSpatializerData;
Если плагин инициализируется с флагом UnityAudioEffectDefinitionFlags_NeedsSpatializerData, то он получает структуру UnityAudioSpatializerData, но только поле listenermatrix является действительным. Дополнительную информацию о UnityAudioSpatializerData см. в разделе Метаданные эффекта пространственного расширения.
Чтобы остановить Unity от применения расстояния от имени плагина пространственности, используйте следующий флаг:
definition.flags |= UnityAudioEffectDefinitionFlags_AppliesDistanceAttenuation;
Флаг UnityAudioEffectDefinitionFlags_AppliesDistanceAttenuation указывает Unity, что пространственный модуль обрабатывает применение уменьшения расстояния. Более подробную информацию об уменьшении расстояния см. в разделе Кривые уменьшения и слышимость.
Метаданные эффекта пространственности
В отличие от других аудиоэффектов Unity, которые работают на смеси звуков, Unity применяет пространственные эффекты непосредственно после того, как Аудио Источник декодирует аудиоданные. Каждый экземпляр эффекта пространственных эффектов имеет свой экземпляр UnityAudioSpatializerData, в основном связанный с данными об Аудио Источнике.
struct UnityAudioSpatializerData
{
float listenermatrix[16]; // Matrix that transforms sourcepos into the local space of the listener
float sourcematrix[16]; // Transform matrix of the Audio Source
float spatialblend; // Distance-controlled spatial blend
float reverbzonemix; // Reverb zone mix level parameter (and curve) on
// the Audio Source
float spread; // Spread parameter of the Audio Source (0..360 degrees)
float stereopan; // Stereo panning parameter of the Audio Source (-1: fully left, 1: fully right)
// The spatializer plugin may override the distance attenuation to
// influence the voice prioritization (leave this callback as NULL
// to use the built-in Audio Source attenuation curve)
UnityAudioEffect_DistanceAttenuationCallback distanceattenuationcallback;
float minDistance; // The minimum distance of the Audio Source.
// This value may be useful for determining when to apply near-field effects.
float maxDistance; // The maximum distance of the Audio Source, or the
// distance where the audio becomes inaudible to the listener.
};
Структура содержит поля, соответствующие свойствам компонента Audio Source в Inspector: Spatial Blend, Reverb Zone Mix, Спред, Stereo Pan, Minimum Distance, и Maximum Distance.
Структура UnityAudioSpatializerData содержит полные матрицы преобразования 4x4 для Audio Listener и Audio Source. Матрица listener инвертирована, так что вы можете умножить две матрицы, чтобы получить относительный вектор направления. Матрица listener всегда ортонормирована, так что вы можете быстро вычислить обратную матрицу.
Аудио система Unity предоставляет только необработанный источник звука в качестве стерео сигнала. Сигнал является стерео, даже если источник является моно или многоканальным, а Unity использует up- или down-миксирование, в зависимости от необходимости.
Матричные конвенции
Поле sourcematrix содержит копию матрицы преобразования источника звука. Для источника звука по умолчанию на GameObject, который не вращен, матрица является матрицей перевода, где позиция кодируется в элементах 12, 13 и 14.
Поле listenermatrix содержит обратную матрицу преобразования AudioListener.
Вы можете определить вектор направления от AudioListener к источнику звука, как показано ниже, где L — listenermatrix и S — sourcematrix:
float dir_x = L[0] * S[12] + L[4] * S[13] + L[ 8] * S[14] + L[12];
float dir_y = L[1] * S[12] + L[5] * S[13] + L[ 9] * S[14] + L[13];
float dir_z = L[2] * S[12] + L[6] * S[13] + L[10] * S[14] + L[14];
Позиция в (L[12], L[13], L[14]) на самом деле является отрицательным значением того, что вы видите в окне Unity Inspector для матрицы камеры. Если бы камера также была повернута, вам также пришлось бы сначала отменить эффект вращения. Чтобы инвертировать матрицу Трансформация-Вращение, транспонируйте верхнюю левую матрицу вращения 3x3 L и вычислите позиции, как показано ниже:
float listenerpos_x = -(L[0] * L[12] + L[ 1] * L[13] + L[ 2] * L[14]);
float listenerpos_y = -(L[4] * L[12] + L[ 5] * L[13] + L[ 6] * L[14]);
float listenerpos_z = -(L[8] * L[12] + L[ 9] * L[13] + L[10] * L[14]);
Для примера кода для плагина Audio Spatializer, см. строку 215 в файле Plugin_Spatializer.cpp.
Кривые затухания и слышимость
Если вы не указываете флаг UnityAudioEffectDefinitionFlags_AppliesDistanceAttenuation, как указано в разделе Инициализация Unity Аудио пространственности, аудиосистема Unity по-прежнему контролирует уменьшение расстояния. Unity применяет уменьшение расстояния к звуку до того, как он вступает в стадию пространственности, и позволяет аудиосистеме знать приблизительную слышимость источника. Аудиосистема использует приблизительную слышимость для динамической виртуализации звуков на основе важности, чтобы соответствовать определенному пользователем Максимальному количеству реальных голосов.
Unity не извлекает информацию о звучании из фактических измерений уровня сигнала, но использует комбинацию значений, которые он считывает из дистанционно управляемой кривой затухания, свойства Объем и применяемых затуханий миксера.
Кривую затухания можно переопределить напрямую или взять значение, вычисленное кривой Audio Source, за основу для изменения. Чтобы переопределить или изменить значение, используйте обратный вызов в UnityAudioSpatializerData структура, как показано ниже:
typedef UNITY_AUDIODSP_RESULT (UNITY_AUDIODSP_CALLBACK* UnityAudioEffect_DistanceAttenuationCallback)(
UnityAudioEffectState* state,
float distanceIn,
float attenuationIn,
float* attenuationOut);
Также можно использовать простую пользовательскую логарифмическую кривую, как показано ниже:
UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK SimpleLogAttenuation(
UnityAudioEffectState* state,
float distanceIn,
float attenuationIn,
float* attenuationOut)
{
const float rollOffScale = 1.0f; // Similar to the one in the Audio Project Settings
*attenuationOut = 1.0f / max(1.0f, rollOffScale * distanceIn);
return UNITY_AUDIODSP_OK;
}
Использование C# скриптов из Unity API
Существуют два метода на Audio Source, которые позволяют устанавливать и получать параметры от эффекта spatializer: SetSpatializerFloat и GetSpatializerFloat. Эти методы работают аналогично SetFloatParameter и GetFloatParameter методы в общем интерфейсе нативных аудиоплагинов. Однако SetSpatializerFloat и GetSpatializerFloat принимают индекс к параметру, который они должны установить или прочитать, SetFloatParameter и GetFloatParameter ссылка на параметры по названию.
Логическое свойство AudioSource.spatializer связано с параметром Спасиализировать в окне Inspector Unity для Audio Source. Это свойство определяет, как Unity создаёт и освобождает экземпляр эффекта пространственной обработки в зависимости от плагина, выбранного в Audio Project Settings.
Если создание вашего эффекта пространственной обработки очень ресурсоёмко — по памяти или другим ресурсам проекта, — имеет смысл выделять такие эффекты из заранее подготовленного «пула», чтобы Unity не создавала новый экземпляр спатиализатора при каждом использовании. Если сохранять привязки интерфейса плагина Unity лёгкими и выделять аудиоэффекты динамически, можно избежать пропусков кадров и других проблем с производительностью.
Известные ограничения примера плагина
Из-за быстрого алгоритма конвекции быстрые движения вызывают некоторые артефакты молнии, которые можно устранить с помощью перекрывающихся буферов конвекции или перекрестного выцветания.
Код также не поддерживает наклон головы слушателя, независимо от того, прикреплен ли слушатель непосредственно к персонажу игрока или к камере, расположенной в другом месте.