DirectX & Visual Basic

Трёхмерный звук

При помощи DirectSound Вы можете легко реализовать в своём приложении эффект трёхмерного звука, а также эффект Доплера.

Инициализация

Как Вы помните, ранее для воспроизведения звука мы пользовались объектами класса DirectSoundSecondaryBuffer8. Для придания звучанию "трёхмерности" используем объект такого же класса, но созданный с флагом DSBCAPS_CTRL3D.

'ds - инициализированный объект класса DirectSound8
'dsbSource - объект класса DirectSoundSecondaryBuffer8
Dim BufferDesc As DSBUFFERDESC
BufferDesc.lFlags = DSBCAPS_CTRL3D

Set dsbSource = ds.CreateSoundBufferFromFile(App.Path + "\Sound1.wav", BufferDesc)

Далее поставим в соответствие обычному буферу буфер "трёхмерный".

'ds3dBuffer - объект класса DirectSound3DBuffer8
Set ds3dBuffer = dsbSource.GetDirectSound3DBuffer

Звук у нас уже есть. Но надо же его кому-то и слушать? Теперь хитрым образом инициализируем объект класса DirectSound3DListener8.

'dsPrimaryBuffer - объект класса DirectSoundPrimaryBuffer8
'ds3dListener - объект класса DirectSound3DListener8
Dim pBufferDesc As DSBUFFERDESC
pBufferDesc.lFlags = DSBCAPS_PRIMARYBUFFER Or DSBCAPS_CTRL3D
Set dsPrimaryBuffer = ds.CreatePrimarySoundBuffer(pBufferDesc)

Set ds3dListener = dsPrimaryBuffer.GetDirectSound3DListener

Инициализация необходимых объектов закончена.

Использование

Теперь необходимо настроить объекты классов DirectSound3DBuffer8 и DirectSound3DListener8, после чего можно воспроизводить звук методом Play класса DirectSoundSecondaryBuffer8.

Ниже пречислены основные методы объекта DirectSound3DBuffer8.

Метод Описание
SetPosition

Устанавливает точку пространства, в которой будет воспроизведён звук. Последний параметр - одна из двух констант:

DS3D_DEFERRED
Настройки не применяются, пока приложение не запустит метод DirectSound3DListener8.CommitDeferredSettings.

DS3D_IMMEDIATE
Настройки вступают в действие немедленно.

GetPosition Работает в паре с предыдущим методом.
SetVelocity

Устанавливает координаты вектора скорости буфера (это не двигает точку пространства, где расположен буфер, а только используется эффектом Доплера). Параметры этого метода совпадают с параметрами метода SetPosition.

GetVelocity

Работает в паре с предыдущим методом. Далее методы, начинающиеся с "Get" приводится не будут, т.к. все они соответствуют какому-то методу, начинающемуся с "Set".

SetConeAngles

Устанавливает пару целых чисел - углы в градусах, задающие конусы, которые будут определять, как будет слышен звук в различных точках пространства (см. рис.).

SetConeOrientation

Устанавливает координаты вектора, который вместе с двумя вышеупомянутыми углами задаёт конус.

SetConeOutsideVolume

Устанавливает громкость за пределами конуса (первый параметр - целое число, громкость измеряется в сотых долях децибела).

SetMinDistance

Устанавливает значение минимального расстояния (см. рис.) - вещественное число. Значение по умолчанию - 1.

SetMaxDistance

Устанавливает значение максимального расстояния. Значение по умолчанию - 109.

Здесь приведён рисунок, на котором показано, что из себя представляют конусы, параметры которых задаются методами SetConeAngles и SetConeOrientation.

Звук без направления имеет одинаковую громкость в любой точке на заданном расстоянии. Ориентированный звук громче в некотором направлении. Звук внутри внутреннего конуса такой, каким бы он был, если бы не было никаких конусов (громкость зависит только от расстояния). Громкость звука снаружи внешнего конуса меньше нормальной громкости звука. На сколько - задаётся методом SetConeOutsideVolume. Параметр этого метода должен быть отрицательным числом (0 - значение по умолчанию - нормальная громкость). По умолчанию все источники звука являются неориентированными (значения углов, задающих конусы - по 360 градусов). Значение громкости звука между конусами является промежуточным и уменьшается с увеличением угла.

Следующий рисунок иллюстрирует понятия минимального и максимального расстояния для звуков. На рисунке изображены зависимости от расстояния громкостей звуков, которые издают пчела и самолёт.

При приближении к источнику звука звук становится громче. Громкость звука увеличивается во столько раз, во сколько уменьшилось расстояние. Минимальное расстояние - расстояние, на котором звук слышен с той громкостью, с которой он был записан. При дальнейшем уменьшении расстояния громкость звука не увеличивается. Максимальное расстояние - такое расстояние, на котором громкость звука становится самой маленькой и дальше не уменьшается.

Осталось настроить объект DirectSound3DListener8. Далее будут перечислены основные его методы.

Метод Описание
SetPosition

Устанавливает координаты слушателя в трёхмерном пространстве.

SetVelocity

Устанавливает координаты вектора скорости слушателя в трёхмерном пространстве.

SetOrientation

Устанавливает ориентацию слушателя в пространстве. Параметры метода - координаты векторов, задающих соответственно направления "вперёд" и "вверх" для слушателя.

SetRolloffFactor

Устанавливает, как громкость звука будет уменьшаться с увеличением расстояния до его источника. Параметр метода - вещественное число в диапазоне то 0.0 до 10.0, значение 1.0 означает такое уменьшение громкости звука, какое имеет место в реальном мире, 0.0 означает, что громкость звука с увеличением расстояния не изменяется.

SetDopplerFactor

Метод этот практически повторяет предыдущий за тем отличием, что устанавливает он силу эффекта Доплера, который проявляется, если слушатель и источник звука двигаются относительно друг друга.

SetDistanceFactor

Устанавливает количество метров в единице измерения, используемой в DirectSound. Параметр - вещественное число, значение по умолчанию - 1.0.

Вот, пожалуй, и всё. Если хотите посмотреть, как некоторые из вышеупомянутых эффектов реализуются на практике, то Вы можете скачать с сайта игру "Пинг-понг".

Hosted by uCoz