btSoftBodyWorldInfo: параметры мира мягких тел

В Ammo.js управление физикой мягких тел осуществляется через специальную структуру btSoftBodyWorldInfo, которая хранит глобальные параметры среды, влияющие на все мягкие тела в сцене. Этот объект не является сценой сам по себе, но выступает как контейнер информации о мире: гравитации, разрешении столкновений, коэффициентах демпфирования и других физических характеристиках.


Создание и инициализация btSoftBodyWorldInfo

Объект создаётся следующим образом:

let worldInfo = new Ammo.btSoftBodyWorldInfo();

После создания необходимо указать ключевые параметры:

  1. Гравитация Свойство m_gravity задаёт вектор гравитации, который будет применяться ко всем мягким телам в мире:
worldInfo.m_gravity.setValue(0, -9.8, 0);

Здесь важно использовать метод setValue(x, y, z), а не напрямую присваивать объект btVector3, чтобы избежать ошибок памяти и некорректной интеграции с движком.

  1. Ширина ячеек сетки для коллизий (m_sparsesdf) В btSoftBodyWorldInfo используется структура SparseSDF для ускорения проверки столкновений. Для этого создаётся:
worldInfo.m_sparsesdf.Initialize();

Этот шаг позволяет оптимизировать взаимодействие мягких тел с миром и твёрдыми объектами.


Параметры столкновений и демпфирования

btSoftBodyWorldInfo хранит информацию, влияющую на динамику мягких тел:

  • m_sparsesdf – структура для быстрого поиска столкновений.
  • m_air_density – плотность воздуха, влияющая на аэродинамическое сопротивление:
worldInfo.m_air_density = 1.2; // кг/м³
  • m_water_density и m_water_offset – параметры для моделирования плавания в жидкости.
  • m_maxDisplacement – максимальное смещение узлов мягкого тела за один шаг симуляции.
  • m_defaultKDF – коэффициент демпфирования для мягких тел:
worldInfo.m_sparsesdf.m_kDF = 0.1; // демпфирование движения

Связь с btSoftBody

При создании мягкого тела необходимо передать ссылку на worldInfo, чтобы объект использовал глобальные параметры:

let softBody = Ammo.btSoftBodyHelpers.CreateFromTriMesh(
    worldInfo,
    verticesArray,
    indicesArray,
    numTriangles,
    true
);

Таким образом, все узлы тела будут учитывать глобальную гравитацию, демпфирование и другие настройки мира. Это ключевой момент: без передачи btSoftBodyWorldInfo симуляция будет некорректной.


Настройка точности интеграции

btSoftBodyWorldInfo содержит параметры интеграции, которые управляют стабильностью и скоростью симуляции:

  • m_sparsesdf – ускоряет расчёт столкновений.
  • m_numIterations – количество итераций на шаг симуляции для расчёта внутренних сил.
worldInfo.m_numIterations = 10;
  • m_solvIterations – количество итераций для решения контактов и столкновений мягкого тела с окружающей средой.

Чем выше эти значения, тем точнее симуляция, но сильнее нагрузка на 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);
  • viterations – количество итераций для расчёта скорости узлов.
  • piterations – количество итераций для расчёта давления между узлами.

Эти настройки тесно связаны с 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); // демпфирование давления

Рекомендации по производительности

  1. Использовать m_sparsesdf для крупных сцен с множеством мягких тел.
  2. Настраивать m_numIterations и m_solvIterations исходя из требований точности и производительности.
  3. Минимизировать частоту пересоздания btSoftBodyWorldInfo, так как это затратная операция.

Эта структура является фундаментом для всех мягких тел в Ammo.js и обеспечивает корректную и эффективную симуляцию взаимодействия с физическим миром.