Помогите немного с физикой

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Помогите немного с физикой

Сообщение d3drm » 13.01.2005 (Чт) 4:54

У меня такая трабла... С физикой все время тугова-то было, но это нужно позарез. Мне нужно, чтобы объект падал как в реальном мире - с ускорением и все такое. Просто вниз. Только сделать это так, чтобы независимо от показателя FPS все происходило одинаково всегда. И вообще алгоритм падения, чтобы он был правильный, мне не совсем ясен. Есть гравитационная постоянная, да. Само ускорение. Ну масса... Пусть она равна 1. Тогда a = g. И что мне с ускорением делать? Простая кибенематика, а все равно траблы...
ХЎ

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.01.2005 (Чт) 7:03

Уравнение движения по прямой: x=x0+v0*t+at^2/2
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 14.01.2005 (Пт) 3:39

пасибо.

ну а вообще у меня так сделано:

pos - позиция предмета, вектор

gravity - приращение к переменной падения
fall - сама эта переменая падения

вначале gravity = 1 (допустим), fall = 0

в цикле я делаю примерно так:

gravity = gravity * 1.01
fall = fall - gravity

pos.y = pos.y + fall


итого получается что объект падает. если сделать fall равным больше 0 то объект немного подлетит, но вскоре замедлит движение и будет падать. Но с разным fps в цикле все это работает по разному. Как мне сделать поправку на fps? например используя api gettickcount (получение миллисекунд с запуска windows).
ХЎ

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.01.2005 (Пт) 6:32

Приведённое уравнение как раз вычисляет координату от времени. Используй-таки его.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

D'alex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 144
Зарегистрирован: 08.05.2004 (Сб) 20:11
Откуда: Moscow

Сообщение D'alex » 14.01.2005 (Пт) 18:39

fall = fall - gravity *(поправка по FPS)

pos.y = pos.y + fall *(поправка по FPS)

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 14.01.2005 (Пт) 21:34

Static Sub vTIMER(Interval As Single)
Dim tmr As Single
If Timer > tmr + Interval Then
tmr = Timer
gravity = gravity * 1.01
fall = fall - gravity
pos.y = pos.y + fall
End If
End Sub

Помойму зависимость от фпс ставить нельзя
тк они рассчитываются раз в секунду

D'alex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 144
Зарегистрирован: 08.05.2004 (Сб) 20:11
Откуда: Moscow

Сообщение D'alex » 14.01.2005 (Пт) 22:34

Bonesnapper писал(а):тк они рассчитываются раз в секунду

Извини не понял - кто они рассчитываются раз в секунду?
Если ты про FPS - то я не предлагал умножать на него...
Я предлагал вычислить поправку на FPS т.е "разница времени
между прошедшим и текущим кадром" и умножить на нее...
Последний раз редактировалось D'alex 14.01.2005 (Пт) 22:42, всего редактировалось 1 раз.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 14.01.2005 (Пт) 22:35

спасибо всем, щас буду пытаца понять =)
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 16.01.2005 (Вс) 17:41

GSerg дал верную формулу (как-никак закон Ньютона :wink: ).
Однако вычисления d3drm в третьем посте гораздо проще, но, как уже было сказано, при фиксированном FPS. Вопрос - где его взять?
Дело в том, что даже вариант GSerg не без недостатков. Предположим, что в результате, например, свопа винта, программа тормознула на секунду. За это время игровой предмет может пролететь сквозь стену. В прошлом кадре он еще до нее не долетел, а в этом уже за стеной. Пытаться коллизить на позицию объекта, а участок пути? Представьте, что предмет сложной формы, летит по кривой (гравитация) и вращается. Коллизия становится неразрешимой задачей. Разрабатывая физику для AoS я нашел другой путь. Исходя из размеров предметов и максимальной скорости, вычислил необходимую частоту обработки физики. Получилось 256 FPS. Далее 1/256 я принял за единицу - таким образом значительно упростились формулы. Далее меряю время с прошлого кадра, делю на 1/256, беру целую часть - столько раз в цикле вызываю просчет физики. Чтобы не накапливалась ошибка от округления - дробную часть запоминаю и прибавляю к времени следующего кадра. Рядом я создал ветку с физ. демкой, созданной по подобному принципу.

D'alex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 144
Зарегистрирован: 08.05.2004 (Сб) 20:11
Откуда: Moscow

Сообщение D'alex » 17.01.2005 (Пн) 0:08

Извини не понял... т.е "необходимую частоту обработки физики"
которую ты расчитал для своего проекта нужно изменять в зависимости от конкретной ситуации(проекта) и подгонять самому в зависимости от масштаба обьектов данного проекта?

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 17.01.2005 (Пн) 2:49

D'alex писал(а):Извини не понял... т.е "необходимую частоту обработки физики"
которую ты расчитал для своего проекта нужно изменять в зависимости от конкретной ситуации(проекта) и подгонять самому в зависимости от масштаба обьектов данного проекта?

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

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 17.01.2005 (Пн) 10:30

D'alex
Извини не понял... т.е "необходимую частоту обработки физики"
которую ты расчитал для своего проекта нужно изменять в зависимости от конкретной ситуации(проекта) и подгонять самому в зависимости от масштаба обьектов данного проекта?

Так. Поясню. Допустим у меня автосимулятор, максимальная скорость - 200 км/ч. При 256 FPS для физики, машина может войти в стену при столкновении на максимальной скорости на 200000/3600/256=0.217 то есть на 22 см. С учетом того, что в следующем кадре машина отлетит от стены, я посчитал, что это будет не заметно. На меньших скоростях и проникновение будет меньше.
Естественно, даже при маленьких скоростях не стоит снижать FPS для физики ниже 30-40 FPS, будет заметно подергивание. В демке с шарами 100 FPS.

D'alex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 144
Зарегистрирован: 08.05.2004 (Сб) 20:11
Откуда: Moscow

Сообщение D'alex » 17.01.2005 (Пн) 17:12

Спасибо буду переваривать...

D'alex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 144
Зарегистрирован: 08.05.2004 (Сб) 20:11
Откуда: Moscow

Сообщение D'alex » 17.01.2005 (Пн) 17:12

Спасибо буду переваривать...


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 22

    TopList