Войти
ПрограммированиеФорумФизика

Физика в правильном порядке, как?

#0
11:43, 31 июля 2020

Доброго времени суток.

В данный момент пытался сделать физику так:

1. Изменяем скорости тел.
2. Вызываем коллайдер.
3. Вызываем солвер.
4. Изменяем позиции тел.

При таком порядке при больших скоростях тел на одном из кадров заметны визуальные проникновения. Единственный способ, который я придумал чтобы это исправить - коллайдер должен работать не с текущими "реальными" координатами, а с координатами "будущего" - координаты плюс скорости. Но такой подход гробит работу солвера.

Как сделать правильно?


#1
14:35, 31 июля 2020

Google continuous Collision detection

#2
14:44, 31 июля 2020

Возможно инфа отсюда пригодится https://gamedev.ru/code/forum/?id=251919

#3
16:41, 31 июля 2020

Если не хочешь делать CCD, то можешь для тела хранить капсуль, длинна которого равна пути, пройденому за кадр. И эти капсули колизить.

#4
19:45, 31 июля 2020

Я не очень понял тебя, но если нужно изменение скорости то В принципе можно так
game.canvas.bind_all('<KeyPress-Right>', self.turn_left)
def turn_left(self, evt):
          if self.y == o:
                  self.x = self.x + 2

Пайтон взял просто как пример, функции взаимодействия есть в каждом языке програмирования

#5
5:48, 1 авг. 2020

Меня все не так поняли, ну сам виноват, надо подробнее было объяснить проблему.
Подробно:

Шар падает сверху на бокс под действием гравитации, бокс огромный, скорость шара такова что за кадр он пролетает расстояние меньше своего радиуса, поэтому никакого туннелирования нет и о CCD речь не идет.

Кадр 1.
Скорость шара изменилась, отработал коллайдер, не нашел пересечений, так как пересечение возникнет только в следующем кадре, нет контакта (джойнта) поэтому солвер не запустился:

Изображение

Далее, раз пересечений нет, скорость шара не меняется, позиция шара обновляется и в конце кадра все выглядит так:

Изображение

Кадр 2

Во втором кадре коллайдер находит пересечение, создает контакт, солвер корректно отрабатывает его, обнуляет скорость шара и выталкивает его, к концу второго кадра все выглядит так:

Изображение


Ну так вот, из-за первого кадра на краткий мог будет видно что шар проник в бокс.
Интересует, как вы избегаете такого, как у вас построена физика?

#6
5:52, 1 авг. 2020

MikeNew
> Интересует, как вы избегаете такого, как у вас построена физика?
Передвинь рисование сразу после разрешения коллизий.

И да, выталкивать на полную не стоит, могут быть проблемы.
#7
8:44, 1 авг. 2020

}:+()___ [Smile]
> Передвинь рисование сразу после разрешения коллизий.

То есть:

1. Изменяем скорости.
2. Коллайдер.
3. Солвер.
4. Рисуем.
5. Изменяем позиции.

Вообще ничего не изменилось.
Посмотрю, как изменяется координата Y шара на каждом этапе в каждом случае.

#8
(Правка: 16:00) 15:59, 1 авг. 2020

MikeNew
> Вообще ничего не изменилось.

1. Обновляем скорости и позиции (силовой шаг физдвижка).
2. Коллайдер.
3. Солвер (с изменением скоростей и позиции).
4. Рисуем.

#9
7:32, 2 авг. 2020

}:+()___ [Smile]
> 1. Обновляем скорости и позиции (силовой шаг физдвижка).
> 2. Коллайдер.
> 3. Солвер (с изменением скоростей и позиции).
> 4. Рисуем.
Спасибо, вот так все отлично работает, никаких провалов.
Пипец, чувствую себя тупым, мог бы и сам допереть если бы подольше подумал.

#10
18:36, 2 авг. 2020

MikeNew
А разве не логичнее сначала сдвинуть тела, потом вызывать коллайдер и солвер?

#11
15:18, 3 авг. 2020

Aslan
> А разве не логичнее сначала сдвинуть тела, потом вызывать коллайдер и солвер?
Логичнее.
Сознаю свою вину, меру, степень, глубину.

#12
18:28, 3 авг. 2020

MikeNew

Мы на тебя все так надеялись, а ты всех подвел )
ПрограммированиеФорумФизика