Вот как вы можете это сделать:
Приближенное движение
Каждому физическому объекту нужны эти векторы:
- Положение : где находится объект.
- Скорость : как меняется его положение.
- Ускорение : как меняется его скорость.
Итак, интуитивно, вы должны делать такие вещи каждый кадр с каждым физическим объектом a
:
a.speed += a.acceleration
a.position += a.speed
Подводные камни : это известно как метод интеграции Эйлера . Это приближение лучше для небольших скоростей и ускорений и с небольшими временными шагами. В игре это обычно так. Но если объект движется очень быстро к тонкой стене или прямо к другому движущемуся объекту, он может пропустить столкновение с этим объектом, когда его положение увеличивается на достаточно большую величину, чтобы полностью пересечь его. Если у вас есть быстро движущиеся объекты, вам может потребоваться постоянное обнаружение столкновений, чтобы избежать этого.
коллизия
Столкновение может быть аппроксимировано такой последовательностью:
- Обнаружение : обнаружено, что два тела пересекаются.
- Разрешение : положение каждого тела изменяется, чтобы они больше не пересекались.
- Физика : скорость каждого тела изменяется с учетом импульса, трения и восстановления (бодрости).
Это называется дискретным обнаружением столкновений, как это происходит в отдельные моменты времени. Каждый шаг заслуживает внимания:
Шаг 1: обнаружение столкновений (вещи сталкиваются?)
Для двух кругов : просто убедитесь, что их центры больше, чем сумма их радиусов друг от друга.
Для двух прямоугольников : проверьте, находятся ли какие-либо их угловые координаты внутри другого прямоугольника.
Для всего, что связано с более сложными полигонами , вам понадобится Теорема о разделяющей оси , которая является темой для другого вопроса.
Подводные камни : Есть действительно много других типов столкновений, которые вы можете рассмотреть. Некоторые из них действительно сложны: выпуклые многоугольники могут пересекаться несколько раз !
Шаг 2: Разрешение столкновений (Раздвигая их.)
Простым методом разрешения коллизий является перевод с минимальным проникновением , используя значения, полученные из обнаружения коллизий. По сути, это включает в себя перемещение объектов друг от друга с минимально возможным расстоянием перемещения.
В качестве примера рассмотрим столкновение окружность-окружность, когда одна из окружностей зафиксирована на месте. Вектор минимального смещения имеет то же направление, что и разница между их векторами средней точки. Его длина - это разница между суммой их радиусов и расстоянием между центрами.
Эта идея легко обобщается на другие формы.
Подводные камни : Если оба сталкивающихся объекта являются подвижными, вам, возможно, придется переместить оба из них на некоторую долю от общего расстояния, чтобы получить правдоподобное приближение их движения. Очевидно, им придется двигаться в разных направлениях.
Шаг 3: Физика столкновений (Другие изменения.)
Наиболее очевидная вещь, которая имеет место, состоит в том, что один или два объекта изменяют направление, то есть поворачивает вектор скорости. Это довольно легко реализовать.
Подводные камни : объекты могут быть эластичными , но они могут не быть , в этом случае общая энергия в системе уменьшается. Вам может понадобиться сопротивление из-за сопротивления воздуха. Трение (особенно статическое трение ), как известно, сложно реализовать .
Некоторые выводы
Имитация реальности экспоненциально сложнее, чем больше, если вы хотите имитировать. Вы попадаете в минное поле бесчисленных крайних случаев, невероятно сложных формул и постоянно растущих стопок исследовательских работ.
Если ваши потребности просты или вы хотите учиться, попробуйте.
Если ваши потребности сложны или вам не нравится математика, попросите физический движок замаскировать детали для вас. Box2D и Bullet довольно популярны в играх.