Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.034 c
14-1118227771
DmitMal
2005-06-08 14:49
2005.07.11
Delhi 6 и Delphi 2005


1-1118568996
xenos
2005-06-12 13:36
2005.07.11
Как зашить ехе внутрь другого exe?


14-1118239342
Андрей Жук
2005-06-08 18:02
2005.07.11
Как переконвертить wav с 8 KHz?


1-1118520083
81Ton
2005-06-12 00:01
2005.07.11
работа с окнами


9-1111856084
$SerG$
2005-03-26 19:54
2005.07.11
Maya есть у кого?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский