В Ammo.js управление физикой мягких тел осуществляется через специальную структуру btSoftBodyWorldInfo, которая хранит глобальные параметры среды, влияющие на все мягкие тела в сцене. Этот объект не является сценой сам по себе, но выступает как контейнер информации о мире: гравитации, разрешении столкновений, коэффициентах демпфирования и других физических характеристиках.
Объект создаётся следующим образом:
let worldInfo = new Ammo.btSoftBodyWorldInfo();
После создания необходимо указать ключевые параметры:
m_gravity задаёт
вектор гравитации, который будет применяться ко всем мягким телам в
мире:worldInfo.m_gravity.setValue(0, -9.8, 0);
Здесь важно использовать метод setValue(x, y, z), а не
напрямую присваивать объект btVector3, чтобы избежать
ошибок памяти и некорректной интеграции с движком.
worldInfo.m_sparsesdf.Initialize();
Этот шаг позволяет оптимизировать взаимодействие мягких тел с миром и твёрдыми объектами.
btSoftBodyWorldInfo хранит информацию, влияющую на динамику мягких тел:
worldInfo.m_air_density = 1.2; // кг/м³
worldInfo.m_sparsesdf.m_kDF = 0.1; // демпфирование движения
При создании мягкого тела необходимо передать ссылку на worldInfo, чтобы объект использовал глобальные параметры:
let softBody = Ammo.btSoftBodyHelpers.CreateFromTriMesh(
worldInfo,
verticesArray,
indicesArray,
numTriangles,
true
);
Таким образом, все узлы тела будут учитывать глобальную гравитацию, демпфирование и другие настройки мира. Это ключевой момент: без передачи btSoftBodyWorldInfo симуляция будет некорректной.
btSoftBodyWorldInfo содержит параметры интеграции, которые управляют стабильностью и скоростью симуляции:
worldInfo.m_numIterations = 10;
Чем выше эти значения, тем точнее симуляция, но сильнее нагрузка на CPU.
btSoftBodyWorldInfo позволяет глобально задавать силы, действующие на мягкие тела:
let gravity = new Ammo.btVector3(0, -9.8, 0);
worldInfo.m_gravity = gravity;
Дополнительно можно модифицировать параметры демпфирования узлов:
softBody.get_m_cfg().set_viterations(10);
softBody.get_m_cfg().set_piterations(10);
Эти настройки тесно связаны с worldInfo, так как демпфирование и силы действуют в рамках глобальных параметров.
worldInfo.m_water_density = 1000; // плотность воды кг/м³
worldInfo.m_water_offset = 0.0; // уровень воды в сцене
worldInfo.m_air_density = 1.225;
softBody.get_m_cfg().set_aeromodel(1); // 1 – линейная модель аэродинамики
softBody.get_m_cfg().set_kDF(0.05); // демпфирование линейной скорости узлов
softBody.get_m_cfg().set_kDP(0.01); // демпфирование давления
Эта структура является фундаментом для всех мягких тел в Ammo.js и обеспечивает корректную и эффективную симуляцию взаимодействия с физическим миром.