Expand description
Минимальный двухтельный решатель контактов (sequential impulse) для клиентского предсказания — порт src/lib/rigidBody.js (срез tank-battle 2026-08): предсказанный актор, динамика карты и стены живут в одной симуляции, поэтому нарисованные тела не выдавливают друг друга. Это приближение Rapier, а не его копия: остаток расхождения прячет реконсиляция игрового предиктора.
Здесь же — материальные свойства контакта (MAP_SURFACE,
combine_surfaces) и масс-инерционные свойства прямоугольного тела
(box_mass_properties): их обязаны видеть одинаково обе стороны, иначе
реплика тихо разъедется с хостом.
Body::x/y — ЦЕНТР бокса, не «угол объекта» снапшота
(см. client::collision::box_center_from_origin).
Статика (стена) — inv_mass: 0.0, inv_inertia: 0.0.
Structs§
- Body
- Тело клиентской реплики.
- Mass
Properties - Обратные масса и момент инерции прямоугольного тела.
- Surface
- Материальные свойства поверхности.
Constants§
- MAP_
SURFACE - Поверхность геометрии карты (стены и динамика) — те же дефолты
коллайдеров, с которыми хост строит карту (
map.rs).
Functions§
- apply_
contact_ impulse - Нормальный импульс с отскоком плюс кулоновское трение по касательной.
Итерируется решателем (sequential impulse) по всем контактам шага.
Мутирует скорости обоих тел, позиций не трогает.
Нормаль контакта направлена ОТ тела
a. - box_
mass_ properties - Обратные масса и момент инерции прямоугольника. Нулевая плотность или габарит дают статику (нулевые обратные величины), а не деление на ноль.
- combine_
surfaces - Комбинирует материальные свойства двух тел в параметры контакта.
Rapier сводит коэффициенты правилом среднего
(
CoefficientCombineRule::Average) — реплика делает так же. - integrate
- Один шаг интеграции тела. Порядок обязан совпадать с шагом игрового предиктора: позиция интегрируется скоростью ДО демпфирования, хранится задемпфированная скорость. Порядок эмпирический, повторяет Rapier.
- separate_
bodies - Разводит тела на глубину проникновения пропорционально обратным массам.
Вызывается ОДИН раз на контакт за шаг: повторное применение той же глубины
на каждой итерации решателя расталкивало бы тела кратно числу итераций.
Нормаль контакта направлена ОТ тела
a.