Pull to refresh

Comments 21

Жду не дождусь почитать про «Модульность (материалы, масса и силы)» :)
Box2d — не всегда хороший вариант. Автор статьи пытается описать аркадный движок с боксами и окружностями. Этот аркадный движок в определенных ситуациях будет имеет превосходящую производительность по сравнению с box2d
Как человек писавший физический движок, скажу: «До реалистичности ОЧЕНЬ далеко».

В статье рассматриваются центральные удары, а в реальности далеко не так. Хорошим примером нецентральных ударов является касательное столкновение двух окружностей разных радиусов с разными скоростями.
В результате такого упрощения (только центральные удары) приведенные алгоритмы иногда будут отрабатывать совершенно не предсказуемо. Например, при столкновении тела будут не отталкиваться друг от друга, а наоборот лететь в одном направлении.

И последнее: ситуацию ААВВ-окружность гораздо проще свести к комбинации случаев ААВВ-ААВВ и окружность-окружность. Алгоритм будет проще и быстрее.
И последнее: ситуацию ААВВ-окружность гораздо проще свести к комбинации случаев ААВВ-ААВВ и окружность-окружность. Алгоритм будет проще и быстрее.

Как это? Как можно свести нахождение точки пересечения окружности с прямой к пересечению прямых и(или) пересечению окружностей?
Очень просто: угловое столкновение считать столкновением окружность-окружность, а не угловое AABB-AABB. Отследить угловое столкновение тоже просто — растояние между центрами объекта будет равно полдиоганали прамоугольника+радиус окружности
Но нас не интересует только лишь факт столкновения. Для факта столкновения ясно дело что смотрят сначала пересечение AABB. Нам надо еще точку касания, нормали (тот самый Manifold). И вот для вычисления этой инфы хочешь не хочешь придется пересекать окружность и линию.
Как вычислить точную область пересечения? Ни факт столкновения, а область пересечения. Столкновение — это всегда небольшое пересечение геометрий (тот самый Manifold). Поэтому, я полагаю, пересечь квадрат с кругом придется. Но, конечно, после теста AABB-AABB.
Еще раз перечитал статью, и так не понял зачем вам область пересечения (?)

У вас только центральные удары. Соответственно, импульсы передаются центрам масс вне зависимости от области пересечения.
Тут либо вы должны использовать физику для нецентральных ударов (т.е. все выше описанное неправильно), либо не заниматься вычислением области пересечения.
Даже если центральные, область пересечения имеет массу применений. Например другая физика отталкивания (мячики у меня резиновые, с силой отталкивания пропорциональной площади пересечения). Я кстати не понял зачем автор формулами тут закидал. Какую бы точную реализацию физики он не выбрал — она все равно не будет исчерпывающей.

Замечательная статья, спасибо!


а вектор (a, b) считается нормализованным (длина вектора равна нулю)

Хм-м, наверное, всё же единице?

Про симуляцию физики. Я как-то задумался, а как реализовать движение точки по экрану с произвольной скоростью, не используя абсолютные координаты. Ну то есть вот летит электрон, тут быстрее, тут медленнее, нигде ведь не записаны его (x, y, z). Как это запрограммировать?
Пришел к выводу, что логично подходит нечто вроде квантовых вероятностей. В текущей ячейке пространства вероятность уменьшается, в соседней увеличивается. Увеличилось до максимума, здесь начинает падать, увеличивается в следующей. Меняя скорость изменения вероятности можно менять скорость движения точки.
Какие-то рассуждения уровня РенТВ. Непонятно, чего вы хотите этим добиться и зачем.
В смысле, зачем? А зачем люди думают о том, как что-то устроено?
Пятиминутка придирок конкретно к коду. Какой-то C++ тут не очень.

1) Зачем передавать объекты в функции копированием, а не, скажем, константной ссылкой? см. float Distance( Vec2 a, Vec2 b ) и void ResolveCollision( Object A, Object B )

2) Зачем копировать объекты из «многообразия», опять же вместо создания ссылки? см. AABB abox = A->aabb

3) Разве в С++ уже есть операция возведения в степень через ^? см. (a.x — b.x)^2 + (a.y — b.y)^2

4) Проверять floating-point значения на равенство вместо допуска (epsilon) плохая идея. см. if(d != 0) или if(n == closest) (тут как минимум отсутствует указание допуска)

5) Зачем копировать вектор если значения потом затираются, а до этого не используются? см. Vec2 closest = n

6) Что за тип real? см. real d =

7) Зачем дважды вычислять сумму квадратов компонентов вектора (dot product с собой), первый раз при проверке LengthSquared(), а второй сразу же после этого при взятии Length()? см. if(n.LengthSquared( ) > r) и float d = n.Length( )
Зачем вообще искать проникновение AABB-AABB? В узкой фазе любого физ. движка AABB уже не используется, ибо зачастую в узкой фазе имеем дело уже с вращающимися объектами…
Отличная статья. Свободное время в отпуске определено.

Огонь, спасибо большое! 🔥

Очень полезная информация! ❤️

Sign up to leave a comment.

Articles