@s2sk

Солвер (расталкивание объектов) физического движка?

Есть три вектора (3D) -

acceleration
velocity
position

Обновляю позицию так -

position += (velocity * time);
velocity += (accerelation * time);


При столкновении получаю -

вектор нормали столкновения

И глубину столкновения я так понял можно посчитать из предыдущих координат объекта до столкновения, и настоящих при столкновении.

Теперь вопрос - как вытолкать объект обратно и при этом уменьшить его velocity исходя из всех этих данных?

Сейчас я попробовал просто отразить вектор velocity относительно вектора нормали столкновения - получил эффект прыгающего мячика туда и обратно (первый объект у меня просто плоскость и второй объект кубик который я заспавнил на высоте и вот он падает (падает из-за того что я устанавливаю acceleration.Z на -9.8), вектор velocity отражается он опять взлетает на высоту, потом опять падает и так до бесконечности). А мне надо чтобы этот кубик упал, вытолкнул себя из плоскости (вытолкнул на столько, на сколько успел пересечь плоскость) и лежал на поверхности дальше (пока наклон поверхности не учитываю).

Знаю, форум не по геймдеву, но может кто-то расскажет подробно что и как делать.
  • Вопрос задан
  • 170 просмотров
Пригласить эксперта
Ответы на вопрос 3
Griboks
@Griboks
Необходимо ввести такой параметр как упругость. Иногда его называют bounce material. Он показывает кпд столкновения с поверхность. Проще говоря, упругость определяет долю энергии, оставшуюся у объекта после коллизии.

Сейчас у вас 100% упругость - абсолютно упругие тела. Но в реальности такого не бывает. Таким образом, скорость отскока должна уменьшиться пропорционально упругости сталкивающихся тел. Затем она ещё раз уменьшиться и ещё раз... А потом достигнет интервала дискретизации - тело остановится.

Ещё нужно учесть сопротивление среды. Сама по себе скорость тела в свободном полёте должна уменьшаться (не учитывая 9.8). Это задаётся вязким трением.

Короче говоря,
  1. провести честную симуляцию
  2. или интерполяцию между двумя положениями и найти наиболее близкое к соприкосновению поверхностей.
Ответ написан
Комментировать
DirecTwiX
@DirecTwiX
"display: flex;" уже предлагали?
Про упругость верно сказали. Но есть упростить, то при столкновении скорость менять не как
v2 = -v1

а
v2 = -k*v1, где 0<=k<=1


k = 0 - абсолютно неупругое столкновение (мяч прилипнет)
k = 1 - абсолютно упругое (будет бесконечно прыгать)
Ответ написан
Комментировать
jamakasi666
@jamakasi666
Просто IT'шник.
Навероное тут нехватает параметра массы или хотябы трения а лучше сразу обоих. На худой конец хотябы какойто коэффициент гашения accerelation.
Сейчас у вас абсолютно линейный мир в "сферическом вакуме".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы