![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Физика твердого тела и борьба с дискретностью
Strech © (2005-04-01 08:32:00)Помогите решить простую задачу: Тело по инерции движется по горизонтальной поверхности с некоторой скоростью, сила трения придает телу отрицательное ускорение. Со школы помню V = V0 - a * dt. dt - время смены кадра (для 100 Гц монитора dt=0.01 сек). Так вот, если сила трения достаточно большая, то в момент остановки V0 < а * dt и при таких дискретных расчетах тело приобретает отрицательную скорость. Как с этим бороться?
Думкин (2005-04-01 10:05:00) [1]> [4] Strech (01.04.05 09:08)
Ну например 2*a*dt
Strech (2005-04-01 10:04:00) [2]Такой подход я уже реализовал, но движение у меня не только прямолинейное, и сил побольше... короче, что-то не срослось :(
megabyte-ceercop (2005-04-01 09:49:00) [3]И на счет борьбы с дискретностью.
Если тебе нужна картинка, на которой будет движение этого объекта демонстрироваться, то дискретность тут нейзбежна.
А если тебе просто нужно, зная вводные параметры, вычислить конечный результат по истечении какого-то времени, то подставь это время в качестве dt, и прогони одну итерацию по этому коду.
megabyte-ceercop (2005-04-01 09:44:00) [4]Дискретность тут не причем :) Далай так:
C++:
if (V0 >0) //определяем направление движения объекта
{
if ((V0 - (a*dt)) <= 0) //если вектор скорости меньше, чем вектор воздействия трения или равен ему,
V = 0; //то останавливаем объект
else
V = ((V0 - (a*dt)); //иначе высчитывам воздействие трения
}
else
{
if ((V0 + (a*dt)) >= 0) //тоже самое, но для противоположной скорости объекта
V = 0;
else
V = ((V0 + (a*dt));
}
Если я правильно понял что подразумевается под словом эпсилон :)
то тут в качастве эпсилона взята величина этой самой силы трения (а это правильно :) )
Strech (2005-04-01 09:32:00) [5]код не важно на чем,
мне бы сам подход понять
Strech (2005-04-01 09:31:00) [6]>megabyte-ceercop ©
ну а дискретность то как победить?
megabyte-ceercop (2005-04-01 09:29:00) [7]
> в учебнике физики написано, что трение не зависит от скорости
Я так и думал :\
Strech тебе формула нужна или код (если код, то delphi или C )?
megabyte-ceercop (2005-04-01 09:24:00) [8]... продолжаем :) не ту кнопку надавил. :)
Так вот...
А формула
> V = V0 - a * dt
Это скорее воздействие на объект непрерывной, внешней, равномерно распределенной во времени и простанстве силы (формулировок я не знаю) один из примеров - гравитация.
dt - в формуле обязателен (не забываем что это не физика, а Game-физика) Думкина не слушай про монитор. :) Хотя я Димкина уважаю :) Даже видел его живим и говорящим :)
Я конечно согласен что на монитор как таковой ориентироваться нельзя, но вот учитывать время между итерациями необходимо (да, для вычисления этого самого времени, просто знать частоту развертки недостаточно, однако в данном случае допустим :).
Strech (2005-04-01 09:09:00) [9]>megabyte-ceercop ©
в учебнике физики написано, что трение не зависит от скорости
Strech (2005-04-01 09:08:00) [10]>Думкин ©
каким образом епсилон подобрать? Предположим если скорость меньше Eps, то тело останавливается, а если в той же задаче тело на очень скользкую поверхность попадает, то при скорости меньше Eps, тело остановится, но в реальности оно еще долго двигаться будет
megabyte-ceercop (2005-04-01 09:06:00) [11]Я физику в школе не учил (это правда, у нас, в нашей сельской школе такого предмета небыло :) пра-вда. ). Тут мне кажется, что воздействие силы трения зависит не только от свойств поверхностей, но и от скорости самого объекта.
Сам же говорил:
> придает телу отрицательное ускорение
А ведь не просто отрицательное, а отрицательное по отношению к скорости объекта.
Выходит что
V = V0 + ( a * dt * (-V0) ) .
Хотя если представить себе поведение объекта с такой формулой, то она подходит скорее к движению в среде :\
А формула
Strech (2005-04-01 08:55:00) [12]>Думкин ©
1. про монитор я для примера написал, просто просчет очередного кадра синхронизирован с его отображением.
2. При изменении dt мы не получим реалистичность. В каких случаях все в 0 устанавливать?
Думкин (2005-04-01 08:51:00) [13]1. Ориентироваться на монитро - моветон.
2. выставить эпсилон - меньше его - ставить принудительно в 0 и ускорение тоже в 0.