https://bbs.125.la/search.php?mo ... mit=yes&kw=FMOD 不知道功能全不全,也可以自己封装一下 FMOD,下面是c++例子 [C++] 纯文本查看 复制代码 #include <fmod.hpp>
#include <iostream>
#include <cmath> // for std::sqrt
// 计算两点之间的欧几里得距离
float calculateDistance(float x1, float y1, float z1, float x2, float y2, float z2) {
return std::sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1));
}
int main() {
// 初始化 FMOD 系统
FMOD::System* system = nullptr;
FMOD::System_Create(&system);
system->init(32, FMOD_INIT_NORMAL, nullptr);
// 加载声音
FMOD::Sound* sound = nullptr;
system->createSound("example.mp3", FMOD_3D, nullptr, &sound);
// 创建通道
FMOD::Channel* channel = nullptr;
FMOD_VECTOR listenerPos = { 0.0f, 0.0f, 0.0f }; // 听众位置
FMOD_VECTOR soundPos = { 10.0f, 0.0f, 0.0f }; // 声音源初始位置
system->playSound(sound, nullptr, true, &channel);
// 设置声音的 3D 属性
channel->set3DAttributes(&soundPos, nullptr); // 设置声音位置
channel->set3DMinMaxDistance(1.0f, 100.0f); // 设置最小和最大距离
channel->set3DDopplerScale(1.0f); // 设置多普勒效应比例(可选)
// 主循环
bool isRunning = true;
while (isRunning) {
// 模拟声音源移动(例如,沿 X 轴移动)
soundPos.x += 0.1f;
if (soundPos.x > 20.0f) soundPos.x = -20.0f; // 循环移动
// 更新声音的 3D 属性
channel->set3DAttributes(&soundPos, nullptr);
// 计算距离(可选,仅用于演示)
float distance = calculateDistance(listenerPos.x, listenerPos.y, listenerPos.z, soundPos.x, soundPos.y, soundPos.z);
std::cout << "Distance: " << distance << " units" << std::endl;
// 更新 FMOD 系统
system->update();
// 模拟退出条件(例如,按下某个键)
// 这里省略了实际的键盘输入处理
}
// 释放资源
sound->release();
system->close();
system->release();
return 0;
} |