Параметры конструктора WorldConfig

В библиотеке Oimo.js объект WorldConfig отвечает за конфигурацию физического мира, в котором происходят все симуляции. Он управляет базовыми параметрами физического движка, такими как точность интеграции, сила гравитации, поведение столкновений и ограничения производительности. Грамотная настройка WorldConfig позволяет добиться баланс между производительностью и реализмом моделирования.

Создание WorldConfig

Объект создается с помощью конструктора:

let config = new OIMO.WorldConfig({
    timestep: 1/60,
    iterations: 8,
    broadphase: 2,
    worldscale: 1,
    random: true,
    gravity: [0, -9.8, 0]
});

Каждое поле имеет важное значение и может быть настроено индивидуально.


Основные параметры

timestep

Определяет шаг симуляции, то есть интервал времени между обновлениями физического мира.

  • Тип: number
  • Значение по умолчанию: 1/60 (секунд)
  • Рекомендации: Меньшие значения увеличивают точность и стабильность симуляции, но снижают производительность. Для игр стандартный выбор — 1/60 или 1/120.
config.timestep = 1/120; // более точная симуляция

iterations

Количество итераций для решения ограничений (constraints) и столкновений на один шаг симуляции.

  • Тип: integer
  • Значение по умолчанию: 8
  • Влияние: Чем больше итераций, тем точнее обработка столкновений и поддержание связей между телами.
  • Рекомендации: Для сложных конструкций (например, механизмы или цепи) стоит увеличивать до 10–15.
config.iterations = 12;

broadphase

Метод предварительного поиска потенциальных столкновений.

  • Тип: integer

  • Значение по умолчанию: 2

  • Возможные значения:

    • 0 — Brute Force (проверка всех объектов, низкая эффективность при большом количестве тел)
    • 1 — Sweep and Prune (оптимизация по осям)
    • 2 — Dynamic AABB Tree (наиболее эффективный для динамических сцен с большим количеством объектов)
config.broadphase = 2; // оптимально для динамических сцен

worldscale

Масштаб мира, который влияет на расчёт физических сил и гравитации.

  • Тип: number
  • Значение по умолчанию: 1
  • Использование: Если объект симулируется в меньших или больших единицах, корректировка worldscale помогает поддерживать физическую реалистичность.
config.worldscale = 0.1; // уменьшение масштаба мира

random

Параметр, определяющий использование случайной генерации при распределении тел и столкновений для повышения стабильности.

  • Тип: boolean
  • Значение по умолчанию: true
  • Использование: true улучшает стабильность симуляции при множественных столкновениях, false может ускорять расчёты в предсказуемых сценах.
config.random = false;

gravity

Вектор гравитации в мире.

  • Тип: Array<number> из трех элементов [x, y, z]
  • Значение по умолчанию: [0, -9.8, 0]
  • Особенности: Значения определяют ускорение объектов по соответствующим осям. Изменение гравитации позволяет моделировать летающие или невесомые среды.
config.gravity = [0, -20, 0]; // усиленная гравитация

Дополнительные аспекты настройки

  1. Баланс производительности и точности

    • Большие iterations и маленький timestep повышают реалистичность, но требуют больше ресурсов.
    • Оптимизация broadphase особенно критична при сотнях и тысячах тел.
  2. Стабильность симуляции

    • Включение random уменьшает вероятность “зацикливания” при множественных столкновениях.
    • При изменении worldscale необходимо корректировать массу и размеры объектов для сохранения физической корректности.
  3. Интеграция с другими объектами Oimo.js

    • WorldConfig используется при создании экземпляра мира:

      let world = new OIMO.World(config);
    • Все динамические тела и constraints наследуют параметры конфигурации, что позволяет централизованно управлять симуляцией.


Примеры практических настроек

Для игр с быстрыми объектами:

let fastGameConfig = new OIMO.WorldConfig({
    timestep: 1/120,
    iterations: 10,
    broadphase: 2,
    worldscale: 1,
    gravity: [0, -9.8, 0]
});

Для стабильной сцены с множеством мелких объектов:

let stableConfig = new OIMO.WorldConfig({
    timestep: 1/60,
    iterations: 12,
    broadphase: 1,
    worldscale: 1,
    random: true,
    gravity: [0, -9.8, 0]
});

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