Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Волгоградец

Оценить эту запись

Эксперименты с физикой. Часть 2.

Запись от Волгоградец размещена 30.03.2010 в 11:04

Итак, продолжаем... Как вы конечно же помните, в предыдущем уроке я рассказал как создать простую симуляцию пружины. Также мы увидели, что эту пружину легко вывести из строя, изменив всего 1-2 параметра. Сегодня мы немного протюнингуем нашу модель - а именно, поменяем интегратор. Отныне, в этом уроке и далее я буду применять интегратор Верле. В нем, для расчета позиции не используется скорость, а текущая позиция рассчитывается исходя из позиции в предыдущем шаге и ускорения. Выглядит он так:

Код:
x(t + dt) = 2 * x(t) - x(t - dt) + a(t) * dt * dt
Не пугайтесь - все очень просто: положение в следующем шаге зависит от положения в текущем шаге, умноженного на два, минус положение в предыдущем шаге и плюс ускорение, умноженное на квадрат времени шага.
Мы немного упростим выражение. Т.к. шаг времени я принял равным 1 (см. первый урок), получаем:

Код:
newPos = 2 * currPos - prevPos + accel
Видите, здесь нет скорости! Упростим еще немного: как вы помните, у нас был класс Drag, симулирующий силу воздушного сопротивления. Уберем его и добавим коэффициент в наш интегратор:

Код:
newPos = (2 - drag) * currPos - (1 - drag) * prevPos + accel
Все. Наш интегратор готов. Выкидываем из проекта ненужные классы (Drag и EulerIntegrator), в классе Particle убираем position и добавляем два новых свойства - prevPosition и currPosition. Удаляем сеттер свойства velocity (временно, потом он нам пригодится в немного измененном виде), а геттер будет возвращать нам разницу между текущей позицией и предыдущей - логично ведь? Соответственно убираем из проекта появление свойства particle.position. Вместо него ставим particle.currPosition. Запускаем и наслаждаемся. Теперь можно безболезненно менять параметры жёсткости пружины, ее демпфирующий коэффициент, массу частицы. Симуляция будет вести себя намного более стабильно (однако, если постараться и ее можно вывести из равновесия - установив в интегратор значение коэффициента воздушного сопротивления в 0 - так что стараемся держать его больше 0 - значение 0.05 дает неплохие результаты).

В следующей серии мы создадим более интересные вещи, нежели просто пружина. Так что оставайтесь на связи.

tutorial 2.zip
Всего комментариев 2

Комментарии

Старый 30.03.2010 19:17 Zik. вне форума
Zik.
 
Аватар для Zik.
Оперативно)
Старый 31.03.2010 18:36 shaman4d вне форума
shaman4d
 
Аватар для shaman4d
Ждем!
 

 


Часовой пояс GMT +4, время: 23:36.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.