Я пытаюсь настроить 3D-звуки с помощью FMOD в игре, в которой используется Ogre. Слушатель звука прикреплен к камере, которая движется по сплайну. У меня есть звуки шагов, прикрепленные к плееру, и громкость должна определяться тем, насколько далеко плеер находится от камеры.
Звуки шагов действуют так, как если бы слушатель звука не двигался со своего начального положения. В начале уровня шаги громкие, а по мере удаления от начала они становятся тише, пока вы их больше не слышите. Если вы вернетесь к началу, они станут громче. Однако положение узла сцены слушателя звука обновляется и синхронизируется с камерой.
В коде ошибка FMOD генерируется каждый кадр в следующей строке:
result = m_system->set3DListenerAttributes(0, &pos, &vel, &forward, &up);
результат всегда возвращает FMOD_ERR_INVALID_HANDLE со следующей строкой ошибки: «Был использован недопустимый дескриптор объекта». Я не могу понять, почему эта ошибка генерируется. Все FMOD_VECTOR, передаваемые в качестве параметров, инициализируются, и я, кажется, правильно настраиваю систему. Код разбросан по разным классам, но вот важные моменты:
// Initialise FMOD system
result = m_system->init(4093, FMOD_INIT_3D_RIGHTHANDED, 0);
result = m_system->set3DSettings(1.0f, 1.0f, 1.0f);
// Create sound
FMOD_MODE mode = FMOD_SOFTWARE;
if(a_positional)
{
mode |= FMOD_3D;
}
FMOD_CREATESOUNDEXINFO info;
memset(&info, 0, sizeof(FMOD_CREATESOUNDEXINFO));
info.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
r = sys->_getFMODSystem()->createSound(a_file.c_str(), mode, &info, &retVal);
// Update sound listener
FMOD_VECTOR pos, vel, forward, up;
pos.x = m_sceneNode->getParentSceneNode()->_getDerivedPosition().x;
pos.y = m_sceneNode->getParentSceneNode()->_getDerivedPosition().y;
pos.z = m_sceneNode->getParentSceneNode()->_getDerivedPosition().z;
vel.x = 0;
vel.y = 0;
vel.z = 0;
forward.x = 0;
forward.y = 0;
forward.z = 1;
up.x = 0;
up.y = 1;
up.z = 0;
result = m_system->set3DListenerAttributes(0, &pos, &vel, &forward, &up);
// FMOD error: (36) An invalid object handle was used.
Любые идеи относительно того, почему «результат» возвращает эту ошибку? Я предполагаю, что это причина, по которой 3D-звуки воспроизводятся неправильно.