Лекция #22. Реализация физики на основе интегрирования Верлета. [Лекторы - new, Joric]
Автор: Cote-Duke
Disclaimer: некоторые опечатки поправлены, некоторые реплики передвинуты.
[23:04:11] <new> В общем сразу скажу, что лекция в большенстве своего объёма построена на материалах статьи Advanced Character Physics
[23:04:29] <new> автор Thomas Jakobsen (http://www.gamasutra.com/resource_guide/20030121/jacobson_01.shtml)
[23:04:57] <new> её перевод может быть найден в формате DOC здесь http://www.l1f.nm.ru/download/AdvancedCharacterPhysics.rar
[23:05:09] <new> автор перевода Антон Ткачёв
[23:05:23] <new> остальные ссылки в конце лекции
[23:05:51] <new> Цель лекции рассказать основы бодробнее, чем в оригинальной статье
[23:06:44] <new> приобщить "новичков" к физике на основе этого метода и показать что физика может быть проста в реализации
[23:07:41] <new> Основой структуры данного метода является система частиц
[23:08:20] <new> в привычной формулировке для каждой частицы системы хранится её текущее положение и скорость
[23:08:33] <new> pos_new = pos + vel*dt
[23:08:33] <new> vel_new = vel + accel*dt
[23:08:33] <new> Это простое объединение Эйлера
[23:10:14] <new> таким образом считается положение и скорость на новом шаге(pos_new и vel_new) через предыдущий (pos и vel)
[23:10:50] <new> Метод с использованием интегрирования Верлющей, т.е.
[23:10:57] <new> pos_new = 2*pos - pos_last + a*dt*dt
[23:10:57] <new> pos_last = pos
[23:12:18] <new> где (pos_last-pos) является аналогом скорости при постоянном времени шага
[23:14:09] <new> то-есть pos + (pos-pos_last)*1(ед. времета предпологает хранение предыдущей и текущей координаты для получения следуени) + a*dt*dt
[23:15:36] <new> таким образом система не зависит от явного значения скорости и становится более стабильной
[23:16:07] <new> уже исходя из написанного выше можно написать простую систему частиц
[23:16:13] <new> http://www.everfall.com/paste/id.php?8nblk7hk1mhg
[23:18:22] <new> функция AccumulateForces накапливает силовые состовляющие для каждой частицы, пока что это действует только сила гравитации
[23:18:56] <new> функция Verlet() делает то, что описано выше
[23:19:06] <new> сразу упомяну об оптимизации
[23:21:11] <new> здесь можно использовать 3 массива (pos_new, pos и pos_last) и не менять местами значения в массивах, а менять местами сами массивы
[23:24:37] <new> Сразу же можно собрать и посмотреть в действии простую систему частиц, добавив несколько частиц с разными положениями и предыдущими положениями (pos_last = pos-vel), где vel - желаемая вами скорость частицы
[23:28:01] <new> и ограничив координаты частиц кубом http://www.everfall.com/paste/id.php?dcvzxmlkhad2
[23:29:41] <new> теперь запустив систему мы должны увидеть как частицы летят по параболе и при ударе в стенку вооброжаемого куба перестают перемещаться в сторону норамали
[23:30:04] <new> причём не отменяя перемещения в остальных направлениях
[23:32:00] <new> Теперь добавим связь между частицами.
[23:34:21] <new> Под связью будем понимать обсолютно нерастяжимый стержень с определённой длиной
[23:36:31] <new> То-есть если "связаны" 2 частицы, то условием связи будет |part1.pos-part2.pos| = constrain.length
[23:40:00] <new> таким образом необходимо будет найти длину вектора, отнять её от длины связи
[23:40:33] <new> (длину вектора (part1.pos-part2.pos) )
[23:41:47] <new> получим расстояние, на которое надо переместить партиклы на встречу друг к другу (или друг от друга)
[23:42:38] <new> делим это расстояние на длину вектора - получаем какая это часть от исходного вектора
[23:44:21] <new> если это найденное значение =diff, а сам вектор delta, то партиклы нужно переместить на +0.5*delta*diff и -0.5*delta*diff
[23:46:52] <new> http://www.everfall.com/paste/id.php?kg654bsepuy5
[23:48:03] <new> для нахождения длины вектора необходимо находить квадратный корень
[23:49:33] <new> Даже при не большой точности вычисления квадратного корня система не выйдет из равновесия
[23:49:46] <new> из-за не явного хранения скорости
[23:51:21] <new> используя формулу Тейлора (находим только функцию 1-го порядка ряда)
[23:53:03] <new> можно упростить всё выражение http://www.everfall.com/paste/id.php?45hmot1k5g80
[23:54:17] <new> restlength нам известна заранее, по этому можно кешировать значение restlength*restlength
[23:54:36] <_Winnie> а где-то можно будет увидеть программу-демонстрашку целиком ? с примитивным выводом на GLUT или даже может быть вообще без графики, которую легко самому прилепить?
[23:55:02] <new> да, в конце лекции будут полезные ссылки
[23:55:15] <new> хотя давайте сейчас
[23:55:35] <new> я покурить схожу - вы пока посмотрите, ато нудно как-то получается...
[23:55:50] <new> Полезные ссылки:
[23:55:50] <new> "Advanced Character Physics" (Thomas Jakobsen) http://www.gamasutra.com/resource_guide/20030121/jacobson_01.shtml
[23:55:50] <new> "Продвинутая физика персонажей" перевод предыдущей (Антон Ткачёв) <в DOC формате> http://www.l1f.nm.ru/download/AdvancedCharacterPhysics.rar
[23:55:50] <new> "Простой метод Верлетной интеграции с поправкой времени" (Джонатан "одинокий носок" Даммер) http://1wd.ru/ru/fm/translat/tcv-rus.htm
[23:55:50] <new> Демки с исходниками http://www.members.lycos.co.uk/olivierrenault/
[23:55:50] <new> Convex hull (физика со схожими принцыпами) http://www.rowlhouse.co.uk/jiggle/
[23:56:03] <_Winnie> new а то что ты сказал - это только для стержня или может быть применено для произвольной системы между частицами?
[23:56:22] <_Winnie> *произвольной системы связей между
[23:57:05] <new> То, что написано выше, приминимо только для нерастяжимых стержней
[23:57:07] <Innochenti> э, стоп. В Jiggle совершенно другой подход.
[23:58:04] <new> Innochenti там схожий принцып в том смысле, что выпуклые объекты выталкиваются из объектов, в которые они попали
[23:58:07] <Innochenti> там физика по след. документу Eran Guendelman - Nonconvex Rigid Bodies with Stacking.pdf
[23:58:12] <new> и только в том
[23:58:44] <new> ну да, не пояснил
[23:59:19] <new> _Winnie но система легко расширяется для реализации любых связей
21 апреля 2006 (Обновление: 11 июня 2006)
Комментарии [1]