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.
'result'がこのエラーを返す理由に関するアイデアはありますか?それが3Dサウンドが正しく再生されない理由だと思います。