Хабрахабр

[Из песочницы] Новые рубежи в Физике

Здравствуй, уважаемый читатель! Представляю вашему вниманию перевод с английского языка статьи «Physics, The Next Frontier» авторства Chris Hecker.

В серии будет ещё три статьи, я буду выкладывать их по мере готовности. Я, начинающий Java-разработчик, столкнулся с тем, что материалы по созданию физического внутриигрового движка представлены лишь на английском языке, поэтому и была переведена данная статья. Приятного чтения!

Уже сегодня каждый создаёт (или по меньшей мере показывает скриншоты) 3D миров с картами текстур, и когда достаточно трудолюбивые люди собираются вместе для работы над одним проектом, каждый разработчик может отрисовывать миллиарды полигонов реалистичных текстур и теней в секунду. Нет никаких сомнений в том, что с каждым годом внутриигровая графика становится всё реалистичнее. Будет ли каждый разработчик с копией книги «Learn to Use 3D Hardware in 21 Days» в состоянии создать поистине впечатляющую игру? Говоря техническим языком, что же остаётся сделать для создания игры на высоком уровне?

Высококлассные разработчики продолжат поднимать планку во множестве различных технологий (таких как сложность графического интерфейса, искусственный интеллект и создание сетей). Отнюдь нет. Тем не менее, существует одна применимая ко всему технология, которая, по моему мнению, станет решающим фактором в ближайшем будущем: физика. Конечно, всё это очень важно, мы даже не можем серьёзно обсуждать любую из них без уточнения деталей.

Рассмотрим следующий пример: вы помните эти громадные вращающиеся шестерни в свободно распространяемых уровнях игры «Duke Nukem 3D»?

image

Рисунок 1. Скриншот из игры «Duke Nukem 3D»

Внезапно шестерни становятся чем-то большим, чем игровое украшение, сразу как одна из них отклоняется от заданного угла, и скатывается вниз по коридору за вами, в стиле Индиана-Джонса. Просто представьте, что их вращение описывалось бы не gif-анимацией, а реальным физическим движком. Физические двигатели делают подобные ситуации реальными. Или вообразите, что после выстрела по шестерне из ракетницы, она покатится вниз по коридору и раздавит вашего друга, подкравшегося сзади, чтобы убить вас!

Любая магия в графике в мире не позволит игроку погрузиться в игровой процесс, если он будет взаимопроникать в другого игрока, или в стены уровня, или если не будет чувствоваться масса и момент массы. Физическая симуляция – это то, что делает мир цельным: благодаря ей «здесь» находится именно здесь, если вы понимаете, о чём я. Согласно эпической книге «Disney Animation: The Illusion of Life» авторства Frank Thomas и Ollie Johnston, аниматоры компании «Disney», даже просто вешая постер в студии, должны всё время задавать себе вопрос: «Есть ли в их рисовке масса, глубина и баланс?» Оригинальные аниматоры в компании «Disney» обнаружили, что это ощущение масс – как раз то, что отделяет хорошую анимацию от плохой.

Несомненно, именно это удерживает вашу машину от падения за край игрового мира, благодаря нему ваши персонажи не улетают в космос, когда прыгают, и это отбрасывает вашу лодку в сторону, когда рядом взрывается ракета. Но уже сегодня почти каждая игра имеет физический двигатель, не так ли? Они справляются лишь с задачей по удержанию машины от падения за край мира, но их возможностей недостаточно, чтобы вывести игру на новый уровень – где остов машины, потерпевшей крушение, может взорваться прямо на трассе, вызвав крен стен и других машин. Тем не менее, большинство физических двигателей в современных играх довольно слабые.

Я полагаю, что многие разработчики игнорируют эти возможности, потому что они не понимают математику, описывающую физику, или были слишком заняты созданием карт текстур, чтобы выучить ее. Часто игнорируемые физические возможности включают в себя практически всё: от простых эффектов вращения (вызванных удалением от центра), до появления в игре существ с искусственным интеллектом – не таких, что завязаны на статической анимации – а таких, что могут вызывать новые физические взаимодействия. Первая статья позволит позаботится о формальностях. Натиск аппаратных средств для работы с 3D позаботится о последнем, а я начинаю новый цикл статей. К концу нашего цикла, вы сами сможете создать физический двигатель, который вызовет у игроков ощущение полного погружения в игровой процесс, или благодаря невероятному реализму, или же – занимательному, но стойкому сюрреализму.

Физика = математика, вы не можете отделить одно от другого и иметь прекрасно выполненную работу. Предупреждение! То есть, то не абстрактная математика для математики. Перед тем, как это отпугнет вас, позвольте заметить, что математика, описывающая физику, не только элегантная и прекрасная, она также имеет и прикладной характер. Мы создаем уравнения из физической модели, и взамен уравнения говорят нам, как модель ведёт себя во времени. Каждое уравнение, которое мы используем имеет действительный физический смысл.

Грандиозное предприятие

Физика – это широкое научное поле. Мы же в действительности заинтересованы в её небольшом разделе под названием «динамика», а если точнее, «динамика твёрдых тел». Динамику можно определить в терминах родственного раздела – кинематики (учении о движении во времени). Кинематика не заостряет своё внимание на том, что вызывает движение или как тела оказались там, где они есть, она просто описывает движение. Динамика же наоборот описывает силы и массы, которые способствуют значениям из кинематики изменяться во времени. Как далеко улетит мячик для бейсбола, если время полета составит 10 секунд, а его начальная скорость 50 километров/час, а траектория – прямая линия – это проблема кинематики; как далеко улетит мячик для бейсбола в гравитационном поле земли, если я ударю по нему битой – это проблема динамики.

Форма твёрдого тела не меняется по ходу симуляции – тело скорее деревянное или металлическое, чем желеобразное. Часть динамики, описывающая твердые тела, имеет отношение к ограничениям, которые мы добавляем для симулируемых объектов. Это позволит нам упростить наши уравнения без потери качества интересного динамического поведения тел. Мы можем создать сочленённые фигуры, например, человека, построив каждую часть фигуры из твёрдого тела и создав связки между ними, но мы не будем рассчитывать на гнущиеся под силовым напряжением кости или подобные эффекты.

Мы начнём наше путешествие с изучения основ программирования компьютера для описания движения плоского твердого тела под действием сил. Даже при том, что мы рассмотрим такую небольшую часть динамики, динамика твердого тела потребует серию статей для объяснения сути. к. Я настойчиво повторяю «программирование компьютера, т. Я говорю «плоское твердое тело», потому что мы будем разбираться лишь с двухмерным миром на протяжении следующей статьи и далее. в дополнение к уравнениям, которые мы напишем для кинематики и динамики, мы также научимся, как решать эти уравнения используя вычисления с числами с плавающей точкой, что жизненно важно знать каждому программисту». В будущих статьях мы научимся описывать эффект вращения, обработку соприкосновений тел, и, конечно, как делать всё это в трёхмерном мире. Принципы – а по факту больше, чем просто уравнения – возможно переложить также и на трёхмерный мир, но определенно все гораздо проще в двумерном, поэтому мы будем учиться там, пока не почувствуем себя уверенно для выхода в трехмерное пространство. Давайте начнём! Что ж, хватит слов!

Работа с производной

Это может оказаться для вас сюрпризом, но вы в действительности не можете сдвинуть объект, просто надавив на него. Я знаю, вы думаете, что я не прав, доказывая мне обратное тем, что выбрасываете этот журнал в мусорку за то, что я написал такой вздор, но это правда! Лишь оказание давления на журнал никогда напрямую не повлияет на его позицию в пространстве. В действительности, оказание давления даже не влияет напрямую на его скорость. То, на что в действительности влияет оказание давления – так это на ускорение журнала, и фактически это одно из самых важных заключений в истории науки.

В действительности все эти величины очень тесно связаны (как вы вероятно знаете): скорость – это показатель изменения координаты тела со временем, а ускорение – это показатель изменения скорости. Для того, чтобы использовать этот факт с целью сделать что-нибудь интересное, нам сначала необходимо поговорить о связи позиции тела со скоростью и ускорением. Если вы понимаете это, то мы идём дальше. Первичный инструмент для изучения изменений этих величин во времени – это вычисления. Мы будем использовать лишь простые скалярные и векторные вычисления (производные и интегралы), но не будет лишним, если вы знакомы с математикой в целом. Я полагаю, вы хорошо разбираетесь в математике. Для справки: моя любимая книга о вычислениях – это «Calculus with Analytic Geometry by Thomas and Finney».

Расположение твердого тела в двумерном мире – это очевидно пара координат X и Y, которыми обозначаются координаты пространства какой-то заданной точки тела. Координата, скорость и ускорение – это величины кинематики, которые беспокоят нас в этой статье. Векторное исчисление – это просто скалярное исчисление каждого элемента вектора, поэтому производная от координаты X – это скорость тела по X, и так далее. Производная для вектора координат – это вектор скорости, и он показывает нам, в каком направлении движется точка (и тело, если мы игнорируем вращение, что и происходит сейчас) и как быстро она движется. Пусть координата тела – это вектор r, а скорость – это вектор v или вектор r со штрихом. Введём следующие обозначения. Получаем уравнение:

$$display$$ \over {dt}} = v = r'$$display$$

Уравнение 1

Ускорение определяется по аналогии. Если же мы продифференцируем вектор скорости по времени, это покажет, как вектор координаты изменяется со временем. Это первая производная от скорости или вторая производная от вектора координаты:

$$display$${{d^2 r} \over {dt^2}} = r'' = {{dr'} \over {dt}} = {{dv} \over {dt}} = v'=a$$display$$

Уравнение 2

Интеграл от ускорения даст нам скорость, а дважды проинтегрировав ускорение, мы получим координату.

Как мы дальше увидим, мы будем обращаться к интегрированию много раз в нашем коде для симуляции и будем рассчитывать новую позицию для нашего твёрдого тела для каждого кадра. Эти взаимосвязи в кинематике показывают, что мы можем найти ускорение объекта, мы можем проинтегрировать его по времени, чтобы получить скорость и координату. Ура анимации!

Условимся, что мы хотим найти изменение координаты с конца последнего кадра по время текущего кадра для отрисовки текущей позиции. Здесь представлен простой пример для одномерного мира, который мы можем аналитически проинтегрировать. Будем использовать время, прошедшее с окончания последнего кадра, как переменную t (в элементе интегрирования dt). Дальше скажем, что ускорение нашего твердого тела было равно 5 условных единиц/секунду^2.

$$display$$v( t ) = ∫adt =∫5dt=5t + C$$display$$

Уравнение 3

Мы обнаружили константу интегрирования, C, которая равна исходной скорости в начале периода интегрирования (при t = 0). Приведенные выше уравнения показывают, что скорость – это функция от времени, прошедшего с последнего кадра.

$$display$$v( 0) = 5(0)+C$$display$$

$$display$$v_0={C}$$display$$

Уравнение 4

$$display$$v( t )=5t+ v_0{}$$display$$

Теперь проинтегрируем наше уравнение скорости, чтобы найти координату (снова не забываем о константе интегрирования):

$$display$$r( t) =∫v(t)dt=∫5t+v_0 dt= {{5}\over {2} }t^2+v_0 t+r_0$$display$$

Уравнение 5

Входная переменная – время, а значение функции – текущая позиция. Исходя из Уравнения 5, мы можем найти текущую позицию лишь по данному ускорению, если мы знаем исходные координату и скорость (которые мы возьмём из последнего кадра) и прошедшее время. Мы также будем указывать время в Уравнении 4, чтобы подсчитать конечную скорость для того, чтобы мы могли использовать это в качестве исходного условия для следующего кадра.

Да прибудет с вами сила

Теперь у нас появилось осознание, что необходимо правильно задать ускорение для интегрирования уравнений кинематики, чтобы получить анимацию. Выход динамики на сцену. Помните, как я сказал, что надавливая на что-либо, вы напрямую влияете лишь на ускорение тела? Что ж, «оказание давления» – это лишь эвфемизм для словосочетания «приложить силу» – одной из двух ключевых величин в динамике – и теперь мы можем обратиться к Ньютону, чтобы узнать, как силы влияют на ускорения. Второй закон Ньютона связывает силу F с производной массы – второй величины динамики – помноженную на скорость. Произведение массы на скорость называется «импульс тела», обозначается p:

$$display$$F = p'= {{dp}\over {dt}}={{d(mv)}\over {dt}}= mv'=ma$$display$$

Уравнение 6

Масса – это константа для скоростей, с которыми мы сейчас работаем, это вытекает из производной в Уравнении 6, и мы получили известное уравнение F=ma (хотя я уверен, что Ньютон изначально определял силу через производную от импульса).

Для заданной силы данной материальной точки ускорение находится делением силы на массу. Если бы мы имели дело только с материальными точками, Уравнение 6 – это то, что нам нужно в динамике. Тем не менее, мы имеем дело с твёрдыми телами с массой, распределенной по определенной площади (объёме, когда речь идет о трёхмерном мире), поэтому нам надо еще поработать. Это дает нам ускорение, которое поможет решить уравнение движения из примера выше.

Мы определим полный импульс, pT, для твердого тела, как сумму импульсов всех точек, которые составляют тело (я использую верхнюю индексацию, т. к. Для начала рассмотрим твёрдое тело, как набор точечных масс. хочу яснее показать, какие количественные величины принадлежат данным точкам):

$$display$$p^T =\sum_{i} {m^i v^i}$$display$$

Уравнение 7

Вектор, направленный к центру масс – это линейная сумма векторов, направленных изо всех точек масс твёрдого тела, поделённая на массу всего тела, M: Мы можем значительно упростить анализ динамики твёрдого тела, введя понятие центра масс (CM).

$$display$$r^{CM} ={\sum_{i } {m^i r^i}\over{M}}$$display$$

Уравнение 8

Используя определение центра масс, мы можем упростить Уравнение 7, умножив обе части Уравнения 8 на M, продифференцируя их, и затем подставив результат в Уравнение 7:

$$display$${{d(Mr^{CM})} \over {dt}} = {\sum_{ i} { } {{ d (m^i r^i)\over dt }}} = {\sum_{ i} { } { m^i v^i }} = p^T$$display$$

Уравнение 9

Теперь посмотрим на левую часть уравнения: это скорость в центре масс, помноженная на массу всего тела. Правая часть Уравнения 9 – это полный импульс по определению в Уравнении 7. Переносим правую часть влево и получаем:

$$display$$p^T = {{d(Mr^{CM})}\over {dt}} = Mv^{CM} $$display$$

Уравнение 10

Далее все конечные итоги вычислений представляют собой нахождение интегралов для всего тела, но центр масс существует и значительно упрощает нахождение полного импульса из Уравнения 10, потому мы можем не переживать – для нахождения линейного импульса мы можем рассматривать тело как материальную точку с заданными скоростью и массой. Из Уравнения 10 следует, что линейный импульс равен общей массе, помноженной на скорость, направленной из центра масс, поэтому нет нужды в суммировании в Уравнении 7 для того, чтобы найти импульс, если мы знаем массу тела и направление вектора скорости центра массы.

По аналогии, полная сила – это производная полного импульса, поэтому концепция центра масс может быть использована и для упрощения уравнения силы:

$$display$$F^T = p^T = Mv'^{CM}=Ma^{CM}$$display$$

Уравнение 11

Мы делим силу (читай гравитацию) на M для того, чтобы найти ускорение центра масс, а затем интегрируем ускорение по времени для того, чтобы получить скорость и координату тела. Если кратко, то из Уравнения 11 следует, что мы можем рассматривать все силы, взаимодействующие с твёрдым телом, как если бы их вектор суммы оказывал воздействие на точку центра масс, в которой содержится масса всего тела. мы игнорируем эффекты вращения до следующей статьи, мы уже имеем все уравнения, которые нам необходимы для описания динамики твёрдого тела. Т.к. Это всплывёт, когда мы будем иметь дело с линейным импульсом и центром масс, и мы просто приложим силы к CM, чтобы найти ускорение центра масс. Отметим, что Уравнение 11 не содержит информации о том, куда направлены силы, приложенные к телу. Когда мы подсчитаем вращение тела под действием этих сил в следующей статье, мы увидим, как используется координата приложения силы.

Ода радости

На данном этапе мы можем рассмотреть другой пример аналитического интегрирования, используя Уравнение 11 для нахождения ускорения центра масс вместо произвольно выбранной величины = 5. Тем не менее, перед нами стоит серьезная проблема, т. к. аналитическое интегрирование обычно не имеет прикладного значения, потому что оно слишком сложное, поэтому мы остановится на так называемом численном интегрировании обыкновенных дифференциальных уравнений (ОДУ). Ого, теперь это звучит, как настоящая математика! Как только вы выучите это, будет самое время поднять планку. К счастью, численное интегрирование ОДУ – это не так трудно, как может показаться на первый взгляд! Для того, чтобы понять, что же это значит, перейдем от слов к делу!

Это многословно, но вот пример для изменяющейся во времени силы в одномерном мире: F = 2t, F – это зависимая величина, а t – независимая. Итак, дифференциальное уравнение – это такое уравнение, в котором содержатся производные зависимых величин в добавок к самой функции, независимым переменным и параметрам. Пусть уравнение силы зависит только от скорости нашего тела. Значение F определяется лишь самой F. Вернёмся к примеру в одномерном мире, что если F = -v означает, что сила трения приводит к замедлению нашего тела пропорционально скорости? Сила сопротивления воздуха увеличивается по мере увеличения скорости самолёта. мы решаем уравнение следующим образом: F = ma = -v и, разделив на m, мы получим (помните, что ускорение – это производная скорости): У нас есть проблема, т. к.

$$display$$a = {{dv}\over {dt}} = {-v\over m}$$display$$

Уравнение 12

Это дифференциальное уравнение, (уравнение скорости содержит производную скорости в Уравнении 12) называется обыкновенным дифференциальным уравнением, потому что содержит лишь обычные производные зависимых величин (в противоположность частным производным, которые составляют дифференциальные уравнения в частных производных [УЧП], о которых мы не будем говорить).

Как мы ранее интегрировали dv/dt для нахождения v в условиях данного уравнения? Теперь перейдем к следующей части нашей фразы: интегрирование.

Дифференциальные уравнения так часто можно встретить в физике, потому нередко показатель изменения количественной величины зависит от самой величины. Это покажется невероятным, но почти каждое уравнение в физике – дифференциальное, поэтому ОДУ были отлично изучены. Другие примеры из физики: охлаждение (показатель потери тепла зависит от текущей температуры) и радиоактивный распад (скорость распада зависит от того, как много присутствует радиоактивного материала). Например, мы уже отметили, что торможение (величина изменения скорости), включая скорость сопротивления воздуха, зависит от скорости.

Я говорю это, потому что теория аналитического интегрирования дифференциальных уравнений, даже самых простых, огромная и довольно запутанная. Конечное слово в нашей фразе – численное – наше спасение. Далее я опишу простой численный интегратор, основанный на методе Эйлера, и доработаю его в следующей статье. Хотя, по иронии судьбы, интегрирование ОДУ численными методами компьютера – в действительности относительно просто понять.

Например, если у нас есть линейное уравнение y = 5x, то dy/dx = 5 означает, что наклон – это константа, равная 5 для любого x, и, как можно предположить, это прямая. Почти все численные интеграторы, но никакой другой также явно, как метод Эйлера, базируются просто на старом определении вычислений через первую производную наклонной: dy/dx определяет наклон y в зависимости от x. В этом случае dy/dx = 2x, а это функция, для определения новой наклонной для каждой координаты x. Немного более трудный пример – это парабола y = x2. Я изобразил y = x2 на Рисунке 2:

image

Рисунок 2. y = x2

Обратите внимание на то, что угол вектора наклонной равен значению тангенса угла касательной в данной точке. В дополнение к этому я также изобразил штриховкой направление вектора наклонной, решив уравнение dy/dx = 2x + C для всех x. Каждая из этих парабол получается благодаря использованию различных констант интегрирования, которые содержатся в уравнении dy/dx = 2x + C. Отметьте также, что существует множество различных парабол, которые удовлетворяют углу множества касательных, отличающихся лишь сдвигом по оси y. Если я выберу другую константу, например, 1, у меня получится уравнение y = 2x + 1. Парабола, которую я изобразил, имеет константу интегрирования, равную 0. Это означает, что есть аналогичная парабола со сдвигом на 1 единицу вверх по оси y.

Итак, если вы хотите решить уравнение касательной, вам нужно просто следовать направлению вектора в каждой точке, меняя направление в соответствие с изменением направления векторного поля. Теперь задумайтесь о том, что если вы не знаете поле векторов на Рисунке 2, определенное параболой, то просто сядете в лужу. Сами того не осознавая, вы проинтегрировали уравнение векторного поля. Вы удивитесь от того, что по прошествии некоторого времени, вы увидите, что двигаетесь по параболической траектории (или по участку параболы), в зависимости от того, где вы начали. Вы нашли конкретную параболу (в зависимости от того, где вы начали, или от начальных условий), используя лишь уравнение производной (просчитывая dy/dx по мере движения в векторном поле).

Для дифференциального уравнения типа dy/dx = f(x, y), нахождение производной dy/dx как касательной к f(x, y) описывает угол наклона касательной для каждой координаты на графике x, y. Проделать то же самое для реального дифференциального уравнения также просто. Рисунок 2 показывает векторное поле для Уравнения 12, нашего уравнения сопротивления воздуха, со скоростью по вертикальной оси и временем по горизонтальной (я произвольно выбрал m = 1 для этого графика). Если вы изображаете график векторного поля, заданного dy/dx = f (x, y), вы можете следовать этому по аналогии с параболой, путем нахождения производной в каждой точке и следовании в этом направлении.

image

Рисунок 3. dv/dt = -v/m

Можно заметить, что если вы выберете начальную позицию в графике (которая зависит от начальной скорости в уравнении), по прошествии времени скорость будет стремиться к нулю, т. к. Он также показывает одну из множества возможных кривых. Вы также можете увидеть, как уменьшение величины скорости зависит от текущего значения скорости – чем быстрее двигаетесь, тем быстрее она уменьшается. сила трения тормозит тело. Это становится очевидно, когда из Уравнения 12 следует то же самое.

Алгоритм Эйлера для численного интегрирования просто следует векторному полю в соответствие с начальной позицией через нахождение производной уравнения (-v/m для нашего примера с силой трения) для определения наклона в текущей точке, и затем просто продвигается шаг за шагом во времени, в зависимости от неизменяемой величины h, по линии наклона. Численное интегрирование похоже на то, что мы делали на графике. Затем подсчитывается новая позиция для определения нового наклона через определенный временной промежуток:

$$display$$y_{n+1} ≈ y_{ n } + {h(dy_{ n })\over dx}$$display$$

Или точнее для нашего уравнения сопротивления воздуха:

$$display$$v_{ n+1 } ≈v_{ n }+{h( -v_{n})\over m}$$display$$

реальный вектор скорости (а поэтому и кривая решения) изгибается с отклонением в каждой точек, и алгоритм Эйлера немного отступает от угла наклона. Очевидно, что метод Эйлера дает небольшую погрешность с каждым временным шагом, т. к. Обсудим это подробнее в будущем. Но если временной шаг, h – довольно малые величины, погрешность стремится к нулю.

Вы можете спросить, как мы собираемся интегрировать скорость, чтобы получить координату. Это все, что нужно знать о численном интегрировании методом Эйлера. Получим два связанных дифференциальных уравнения (еще одна наша победа): Мы просто используем снова метод Эйлера для интегрирования dr/dt = v, так же, как интегрировали dv/dt = a, по аналогии.

$$display$$v_{n+1} ≈ v_n+hv'=v_n+{h F_n\over M }$$display$$

$$display$$r_{ n+1 } = r_n + hr_n'= r_n+hv_n$$display$$

Для метода Эйлера все равно, как выглядит приложенная сила, т. к. Это дает нам альтернативный алгоритм для вычисления координаты после действия какой-либо произвольно-приложенной силы на наш объект (что может зависеть от скорости, как мы увидели, или времени, или даже позиции нашего тела и других тела, или ото всего сразу!). Эйлера интересует величина воздействия силы на массу, как наклонной, и всё.
У меня закончилось место, поэтому у меня нет возможности привести ссылки. вы можете просчитать ее в любой момент времени. В следующий раз я посоветую различные замечательные книги, и мы разберёмся, как просчитывать вращение твёрдых тел.

Если приложить силу, он ответит на e-mail checker@bix.com. И хотя его тело не такое твердое, как хотелось бы, у Chris Hecker – динамическая личность.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть