Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Физика твердого тела и борьба с дискретностью   Найти похожие ветки 

 
Strech   (2005-04-01 08:32) [0]

Помогите решить простую задачу: Тело по инерции движется по горизонтальной поверхности с некоторой скоростью, сила трения придает телу отрицательное ускорение. Со школы помню V = V0 - a * dt. dt - время смены кадра (для 100 Гц монитора dt=0.01 сек). Так вот, если сила трения достаточно большая, то в момент остановки V0 < а * dt и при таких дискретных расчетах тело приобретает отрицательную скорость. Как с этим бороться?


 
Думкин ©   (2005-04-01 08:51) [1]

1. Ориентироваться на монитро - моветон.
2. выставить эпсилон - меньше его - ставить принудительно в 0 и ускорение тоже в 0.


 
Strech   (2005-04-01 08:55) [2]

>Думкин ©
1. про монитор я для примера написал, просто просчет очередного кадра синхронизирован с его отображением.
2. При изменении dt мы не получим реалистичность. В каких случаях все в 0 устанавливать?


 
megabyte-ceercop ©   (2005-04-01 09:06) [3]

Я физику в школе не учил (это правда, у нас, в нашей сельской школе такого предмета небыло :) пра-вда. ). Тут мне кажется, что воздействие силы трения зависит не только от свойств поверхностей, но и от скорости самого объекта.
Сам же говорил:
> придает телу отрицательное ускорение

А ведь не просто отрицательное, а отрицательное по отношению к скорости объекта.
Выходит что
V = V0 + ( a * dt * (-V0) )  .
Хотя если представить себе поведение объекта с такой формулой, то она подходит скорее к движению в среде :\

А формула


 
Strech   (2005-04-01 09:08) [4]

>Думкин ©
каким образом епсилон подобрать? Предположим если скорость меньше Eps, то тело останавливается, а если в той же задаче тело на очень скользкую поверхность попадает, то при скорости меньше Eps, тело остановится, но в реальности оно еще долго двигаться будет


 
Strech   (2005-04-01 09:09) [5]

>megabyte-ceercop ©
в учебнике физики написано, что трение не зависит от скорости


 
megabyte-ceercop ©   (2005-04-01 09:24) [6]

... продолжаем :) не ту кнопку надавил. :)

Так вот...

А формула

> V = V0 - a * dt


Это скорее воздействие на объект непрерывной, внешней, равномерно распределенной во времени и простанстве силы (формулировок я не знаю) один из примеров - гравитация.

dt - в формуле обязателен (не забываем что это не физика, а Game-физика) Думкина не слушай про монитор. :) Хотя я Димкина уважаю :) Даже видел его живим и говорящим :)
Я конечно согласен что на монитор как таковой ориентироваться нельзя, но вот учитывать время между итерациями необходимо (да, для вычисления этого самого времени, просто знать частоту развертки недостаточно, однако в данном случае допустим :).


 
megabyte-ceercop ©   (2005-04-01 09:29) [7]


> в учебнике физики написано, что трение не зависит от скорости


Я так и думал :\

Strech тебе формула нужна или код (если код, то delphi или C )?


 
Strech   (2005-04-01 09:31) [8]

>megabyte-ceercop ©
ну а дискретность то как победить?


 
Strech   (2005-04-01 09:32) [9]

код не важно на чем,
мне бы сам подход понять


 
megabyte-ceercop ©   (2005-04-01 09:44) [10]

Дискретность тут не причем :) Далай так:

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));    
   }


Если я правильно понял что подразумевается под словом эпсилон :)
то тут в качастве эпсилона взята величина этой самой силы трения (а это правильно :) )


 
megabyte-ceercop ©   (2005-04-01 09:49) [11]

И на счет борьбы с дискретностью.
Если тебе нужна картинка, на которой будет движение этого объекта демонстрироваться, то дискретность тут нейзбежна.

А если тебе просто нужно, зная вводные параметры, вычислить конечный результат по истечении какого-то времени, то подставь это время в качестве dt, и прогони одну итерацию по этому коду.


 
Strech   (2005-04-01 10:04) [12]

Такой подход я уже реализовал, но движение у меня не только прямолинейное, и сил побольше... короче, что-то не срослось :(


 
Думкин ©   (2005-04-01 10:05) [13]

> [4] Strech   (01.04.05 09:08)

Ну например 2*a*dt



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.057 c
9-1111931801
VolanD666
2005-03-27 17:56
2005.07.11
Пальма


1-1118494263
Pasha L
2005-06-11 16:51
2005.07.11
FILETIME


4-1115847544
NikNet
2005-05-12 01:39
2005.07.11
Как записать в реестр запрещенным администраторам?


1-1118668385
Erik1
2005-06-13 17:13
2005.07.11
Использование BinarySearch в DeCAL?


4-1115567113
vaxluk
2005-05-08 19:45
2005.07.11
запуск внешних программ