我正在尝试在使用 Ogre 的游戏中使用 FMOD 设置 3D 声音。声音侦听器连接到在样条曲线上运行的相机。我在播放器上附加了脚步声,音量应由播放器与相机的距离决定。
脚步声的作用就好像声音听者没有从其起始位置移动一样。在关卡开始时,脚步声很响,当你离开开始时,它们会变得更安静,直到你再也听不到它们了。如果你跑回到起点,它们会变得更响亮。但是,声音侦听器的场景节点的位置正在更新并与相机保持同步。
在代码中,以下行的每一帧都会生成一个 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 声音无法正确播放的原因。