close

Вход

Забыли?

вход по аккаунту

Рубан Артем Андреевич. Применение метода Верле для моделирования физических процессов в играх

код для вставки
3
4
АННОТАЦИЯ
Выпускная квалификационная работа на тему «Применение метода
Верле для моделирования физических процессов в играх» содержит 53
страниц текста, рисунков – 27, формул – 19, использованных источников –
15.
В настоящий момент подобные методы моделирования востребованы в
связи с нарастающей популярностью веб-приложений и браузерых игр.
Ключевые слова: физический движок, метод Верле, методы реализации.
Предмет исследования. Содержание программного обеспечения для
применения метода Верле для моделирования физических процессов.
Объект исследования. Физический движок, использующий метод Верле для
реализации физических процессов.
Цель работы. Моделирование физических процессов в играх с помощью
метода Верле.
Результаты работы. В выпускной квалификационной работе разработан
скрипт на языке программирования JavaScript, позволяющий
продемонстрировать применение метода Верле на примере двойного
маятника.
Работа имеет теоретическое и практическое значение, т.к с помощью
разработанной программы можно наглядно продемонстрировать
особенности применения метода Верле, и его практическое применение в
играх.
5
ABSTRACT
Graduation qualifying work on the theme «Application of the Verlet method for
modeling physical processes in games» contains 53 pages of text, figures 27,
formulas – 19, of sources used - 15.
Key words: physics engine, method Verlet, methods of implementation.
The subject of the study. The contents of the software for the application of the
Verlet method for modeling physical processes and the possibility of its
application.
The object of study. A physics engine that uses the Verle method to implement
physical processes.
The purpose of the work. Modeling physical processes in games using the Verlet
method.
The result of the work. In graduation qualifying work, a script was developed in the
JavaScript programming language, which allows demonstrating the application of
the Verlet method to the example of a double pendulum.
The work is of theoretical and practical importance, because with the help of the
developed program you can clearly demonstrate the features of the application of
the Verlet method, and its practical application in games.
6
Содержание
Введение ................................................................................................................... 5
Глава 1. Моделирование физических процессов. ............................................. 9
1.1 Физический движок. Основные понятия и виды .............................. 9
1.2 Основные методы реализации физических процессов… ................. 25
Глава 2. Применение метода Верле в играх ...................................................... 37
2.1 Применение метода Верле .................................................................. 37
2.2 Программная реализация метода…..................................................... 46
Заключение ............................................................................................................ 49
Список литературы ............................................................................................... 50
Приложение ........................................................................................................... 52
7
ВВЕДЕНИЕ
Обоснование выбора темы и её актуальность
Игровой движок — программное ядро комплексной программной
системы (игры), содержащее базовую функциональность игры, но, при этом,
не включающее код, специфичный для геймплейной функциональности
конкретной игры.
В современных моделях игрового программирования игровые движки
используются в качестве механической основы игр. Игровые движка состоят
из
множества
функционал
компонентов-модулей,
в
виде
отображения
которые
и
реализуют
обработки
игровой
графики,
звука,
искусственного интеллекта и пр. В дальнейшем остаётся только наложить на
движок
контент,
который
будет
уже
соответствовать
конкретно
разрабатываемой игре. Модульный дизайн игровых движков позволяет
игрокам и программистам легко заменять его части, модифицировать их с
целью создания новых игр с новыми моделями, улучшенной графикой,
звуками, иным сценарием, изменять существующий материал и добавлять
новые функции. Благодаря сему на базе существующих движков было
создано и создаётся большое множество новых игр, при этом количество
прилагаемых
усилий
для
их
создания
оказывается
значительно
сокращённым.
Для того, чтобы пояснить актуальность игровых движков, легче всего
привести описание того в чём же состоит их практическая польза.
Прежде всего, использование движка значительно упрощает процесс
разработки игр. Обычно для реализации достаточно тривиальной задачи
вывода изображения на экран или проигрывания нескольких звуков
одновременно с учётом их модификации в зависимости от местоположений
игрового
персонажа
и
источников
звуков,
используются
сотни
библиотечных функций, сложно переплетённых между собой. Посредством
8
игрового движка подобная конструкция упрощается в пару функций,
объединяющих в себе все предыдущие, более того подобные функции в
процессе разработки и эксплуатации движка проходят оптимизацию по мере
работы программистов над ними. Это позволяет разработчикам работать над
игрой более абстрактно, не задумываясь о низкоуровневых представлениях
компонентов движка и том, как они работают и как связаны между собой.
Всё что нужно знать при использовании движка — это то, как его
использовать, знания о том, как он работает, можно опустить, это сокращает
время разработки игры ровно на время разработки движка (часто сам движок
может составлять 80% сложности всего проекта), на котором бы работала
разработанная игра. К тому же игровой код написанный с использованием
игрового движка выглядит более организованным и более управляемым, что
снижает количество возникающих программных ошибок.
Использование игрового движка может сделать вашу игру более
переносимой. Хорошо спроектированный игровой движок сможет запускать
ваши игры под управлением других библиотек или даже других платформ. В
текущий момент с наличием на рынке нескольких операционных систем, а
также тенденцией к разработке игр не только для компьютеров, но и для
мобильных устройств, это более чем актуально. Отсутствие подобной
универсальности игровых движков можно было наблюдать в недалёком
прошлом, когда многие игры и приложения оставались эксклюзивами
исключительно для некоторых платформ и операционных систем, в то время
как для всего остального они оставались недоступны.
Исходя из вышеперечисленного можно прийти к выводу, что
технология игровых движков играет очень важную роль в современной
игровой индустрии и построении систем графической симуляции чего-либо
вообще.
Поэтому
исследование
устоявшихся
особенностей
движков
современного уровня, а также проверенных практикой принципов их
проектирования и реализации, является актуальной темой как таковой.
9
Степень разработанности проблемы
Метод численного интегрирования Верле издавна использовался для
вычисления траекторий частиц. Сам метод был впервые использован ещё в
1791 году французским астрономом Жаном-Батистом-Жозефом Деламбром.
В 1907 норвежский математик и физик Карл Штёрмер использовал его для
моделирования движения частиц в магнитном поле, поэтому иногда этот
метод называют методом Штёрмера.
Современное название этот алгоритм получил от имени французского
физика Лу Верле, который в 1967 году использовал его в моделировании
молекулярной динамики. В последнее время метод Верле применяется и в
разработке компьютерных игр.
Применение данного метода находят в реализации на игровых, так и на
научных движках, позволяя создавать симуляцию движения различных
частиц.
Предмет исследования
Содержание программного обеспечения для применения метода Верле
для моделирования физических процессов.
Объект исследования
Физический движок, использующий метод Верле для реализации
физических процессов.
Цель работы
Целью данной дипломной работы является моделирование физических
процессов в играх с использованием метода Верле.
Основные задачи исследования
Для достижение поставленной цели, необходимо решить следующие
задачи:
1. Моделирование физических процессов в играх;
2. Изучение применимости метода Верле в играх.
Теоретическое и практическое значение работы
10
С
помощью
продемонстрировать
разработанной
особенности
программы
применения
можно
метода
Верле,
наглядно
и
его
практическое применение в играх и научной деятельности.
Структура работы
Работа состоит из введения, двух глав, заключения, списка литературы
и демонстрации метода. Во введении дано представление о физических
движках, сформулирована цель и задачи, необходимые для рассмотрения
моделирования физических процессов в играх с помощью метода Верле.
В первой главе дается понятие физических движков, описываются основные
методы реализации физических процессов, метод Верле, использование в
играх, его модификации и алгоритмы.
В второй главе мы рассматриваем применимость метода Верле в играх, даем
описание используемой библиотеки, и реализуем данный метод на примере
двойного маятника.
В заключении подводятся итоги выполненной работы. Список литературы
содержит основные источники, которые использовались при написании
дипломной работы.
11
ГЛАВА 1. МОДЕЛИРОВАНИЕ ФИЗИЧЕСКИХ ПРОЦЕССОВ
1.1. Физический движок. Основные понятия и виды
Подавляющее большинство физических движков может (с различным
успехом) симулировать физику твердого тела (Rigid body simulation).
Твердое тело — это тело, которое не меняет свою форму (к ним можно
отнести кирпич, стол, стену и т.д.). На данный момент подавляющее
большинство игр использует именно физику твердого тела, главным образом
потому, что с приемлемой производительностью может обсчитываться лишь
физика твердого тела. Для представления объема твердых тел, в зависимости
от движка, могут использоваться как различные примитивные тела
(прямоугольники, сферы, цилиндры, конусы и т.д.), так и более сложные
(карты высот, выпуклые многогранники или невыпуклые многогранники).
Если используются только примитивные тела, более сложные тела
описываются с помощью аппроксимации примитивами. Для описания
свойств твердых тел используется понятие материала, который описывается
параметрами: коэффициент трения (может быть два: коэффициент трения
покоя, который показывает, как тяжело сдвинуть тело, и коэффициент
трения движения, который показывает, как тяжело удерживать тело в
движении), упругость (сколько энергии остается после столкновения с
другим телом).
Помимо этих параметров, могут быть и другие. Твердое тело также
имеет массу. Движение твердых тел описывается при помощи линейной,
угловой скорости и ускорения. Хотя движки позволяют устанавливать эти
параметры
непосредственно,
воздействия
на
тела,
как
правило,
осуществляют при помощи приложения либо физических сил (влияют на
ускорения тел), либо импульсов (влияют на скорости).
Физический движок, physics engine — компьютерная программа,
которая производит симуляцию физических законов реального мира в
виртуальном мире с той или иной степенью аппроксимации. Чаще всего
12
физические движки используются не как отдельные самостоятельные
программные продукты, а как составные компоненты (подпрограммы)
других программ.
Все физические движки условно делятся на два типа: игровые и
научные.
Первый тип используется в компьютерных играх как компонент
игрового движка. В этом случае он должен работать в режиме реального
времени, то есть воспроизводить физические процессы в игре с той же самой
скоростью, в которой они происходят в реальном мире. Вместе с тем от
игрового физического движка не требуется точности вычислений. Главное
требование — визуальная реалистичность, — и для его достижения не
обязательно проводить точную симуляцию. Поэтому в играх используются
очень
сильные
аппроксимации,
приближенные
модели
и
другие
программные “трюки”.
Научные
физические
движки
используются
в
научно-
исследовательских расчётах и симуляциях, где крайне важна именно
физическая точность вычислений. Вместе с тем скорость вычислений не
играет существенной роли.
Современные физические движки симулируют не все физические
законы реального мира, а лишь некоторые, причём с течением времени и
прогресса в области информационных технологий и вычислительной
техники список “поддерживаемых” законов увеличивается.
физические движки могут симулировать следующие физические
явления и состояния:

динамика абсолютно твёрдого тела,

динамика деформируемого тела,

динамика жидкостей,

динамика газов,

поведение тканей,

поведение верёвок (тросы, канаты и т.д.).
13
Физический
пространство,
движок
которое
позволяет
можно
создать
наполнить
некое
телами
виртуальное
(виртуальными
статическими и динамическими объектами), и указать для него некие общие
законы взаимодействия тел и среды, в той или иной мере приближенные к
физическим, задавая при этом характер и степень взаимодействий
(импульсы, силы, и т. д). Собственно, расчёт взаимодействия тел движок и
берёт на себя. Когда простого набора объектов, взаимодействующих по
определённым законам в виртуальном пространстве, недостаточно в силу
неполного приближения физической модели к реальной, возможно
добавлять (к телам) связи. Рассчитывая взаимодействие тел между собой и
со средой, физический движок приближает физическую модель получаемой
системы к реальной, передавая уточнённые геометрические данные средству
отображения (рендереру).
Основные понятия при работе с физическими движками
Тело
Тело (англ. body) — объект игровой физики, который определяется:
его формой (есть простые формы: шар, куб, цилиндр; есть сложные
формы, набор которых в разных движках может различаться);
неким набором параметров (масса, упругость, коэффициент трения,
инертность по осям).
Связь
Связь (соединение; англ. joint) — ограничения объектов игровой
физики, каждое из которых может накладываться на одно или два тела.
[править]
Взаимодействие
Как правило, физический движок и решает проблему взаимодействия
тел. Тем не менее, может появиться необходимость использования
14
собственного
алгоритма
взаимодействия,
и,
как
правило,
движки
предоставляют такую возможность.
Известные физические движки
Игровые проприетарные
Havok — некогда самый популярный и распространённый физический
движок, используемый в более чем в 100 играх. На данный момент немного
уступил своему конкуренту;
PhysX — основной конкурент Havok, единственный в мире
физический движок, имеющий аппаратную поддержку (см. Физический
процессор). Покупка Ageia компанией nVidia привела к переименованию
движка в nVidia PhysX. На данный момент PhysX занимает первое место по
популярности среди физических движков;
Игровые свободные
Bullet Physics Library — самый популярный на данный момент
свободный физический движок;
Open Dynamics Engine — второй по популярности среди свободных
физических движков;
Tokamak — физический движок с открытым исходным кодом.
Newton Game Dynamics — изначально проприетарный, а с февраля
2011 года — свободный физический движок.
Ныне несуществующие
NovodeX — физический движок, приобретённый компанией Ageia и
преобразованный в PhysX.
Meqon — физический движок, приобретённый компанией Ageia и
интегрированный в состав её движка PhysX.
Ipion Virtual Physics — физический движок, приобретённый компанией
Havok и интегрированный в состав её движка Havok Physics;
Karma — коммерческий движок от ныне закрытой компании
MathEngine, интегрирован в Unreal Engine 2.0/2.5.
15
19 апреля 2013 года была опубликован физический движок Verlet.js,
который позволяет моделировать системы частиц, объединённые гибкими
связями. Он представляет собой библиотеку, которая распространяется в
свободном доступе. Данный движок сразу начал набирать популярность изза своих специфических особенностей.
HTML5 вместе с CSS3 и JavaScript дают разработчику широкие
возможности создания игр с использованием 3D, анимации, Canvas,
математики, цветов, звука,
WebGL.
Одно из наиболее очевидных
преимуществ HTML5 заключается в его независимости и от платформы, и в
общем случае от аппаратной начинки.
При детальном рассмотрении можно выявить предоставляемые
движками дополнительные возможности: упрощение некоторых часто
встречающихся задач или подгрузка ресурсов, оформленный ввод, физика,
звук, bitmap’ы (таких, конечно же, немного). Есть и довольно слабо
оформленные движки, а есть и те, которые предоставляют в пользование
разработчику редактор 2D уровней и инструменты отладки.
Предполагается, что большинство движков служат для сокращения
временных затрат на разработку полноценной игры. Однако многие
разработчики предпочитают создавать свой проект полностью с нуля, чтобы
лучше представлять его устройство. Существует немного JavaScript-HTML5
движков, которые действительно чего-то стоят, однако и у них может быть
один большой недостаток: они более не поддерживаются или близки к
прекращению поддержки. Поэтому, выбирая движок, остановите свой выбор
на
тех
продуктах,
поддержка
которых
будет
длиться
достаточно
продолжительное время.
Известные игровые браузерные движки
Crafty - Легкий модульный игровой движок, включающий множество
функций: анимацию, управление событиями, перерисовку регионов,
16
отслеживание пересечений и столкновений, спрайтовую графику и многое
другое (рис. 1). Поддерживает все браузеры, в т.ч. IE9 [8].
Рисунок 1 – Главная страница Crafty
Quintus - игровой HTML5-движок, разработанный, чтобы быть
модульным и легковесным, с четким JavaScript-подобным интерфейсом. Для
того, чтобы реализовать основные особенности ООП-игрового движка в
HTML5-движке, в Quintus в некотором отношении схож с jQuery, а также
поддерживает
плагины,
управление
событиями
и
гибкую
модель
наследования, чтобы упростить повторное использование реализованных
функций(Рис 2).
Рисунок 2. Пример демонстрации работы движка.
17
gameQuery - плагин jQuery, упрощающий разработку игры за счет
использования
реализованных
игровых
компонентов.
Благодаря
особенностям реализации совместим со множеством браузеров, в т.ч. их
мобильными версиями.
lycheeJS - Игровая библиотека JavaScript, которая предлагает готовое
решение для проектирования и реализации HTML5 Canvas и WebGL или
нативных OpenGL игр внутри браузера или стационарных платформ.
Оптимизирован для Google Chrome.
The Render Engine - Кросс-браузерный опенсорсный движок,
написанный полностью на JavаScript. Созданный с нуля для того, чтобы
быть максимально гибким, он имеет обширный API и использует самые
новые инструменты современных браузеров.
CSS Game Engine - Для формирования страницы используются
JavaScript и CSS. Вместе они работают достаточно уверенно и слаженно.
Разработан для новичков, обучающихся азам программирования видеоигр.
gTile - Браузерный движок на чистом JavaScript и DHTML. В gTile
плиточная графика была выбрана за ее простоту и доступность. Упор в
реализации был сделан на высокий уровень интерактивности и поведении
игровых объектов. Меньшее внимание было уделено графике. А потому
движок подойдет больше для создания текстовых РПГ, а графических
возможностей должно хватить для изображения локаций.
ClanFx - основан на JavaScript и CSS и использует плиточную
графику. Работает на данный момент в Firefox, Epiphany и Opera. Среди
реализованных
фич:
анимированные
спрайты,
эффекты
заклинаний,
постройки, плитки/текстуры и базовый искусственный интеллект(Рис 3.).
18
Рисунок 3. Реализация возможностей ClanFx.
Cocos2D - Портированный с iPhone графический 2D HTML5движок на JavaScript. Позволяет быстро создавать 2D игры и графические
приложения, которые могут работать на всех современных устройствах без
установки дополнительных плагинов (Рис 4).
Рисунок 4. Реализация на примере игры Mario.
CopperLicht - WebGL библиотека и JavaScript 3D движок для создания
браузерных игр и 3D приложений. Использует WebGL Canvas,
поддерживаемый современными браузерами и способный поддерживать
рендеринг 3D моделей, используя аппаратное ускорение без плагинов.
19
LimeJS - HTML5 движок для разработки игр с поддержкой сенсорного
ввода. LimeJS создан с использованием Closure Library, созданной Google, и
в нем уже реализованы классы и функции для отслеживания времени,
событий, обработки форм и анимации. Также фреймворк поддерживает
спрайтовые листы (т.е. все используемые изображения могут быть
помещены в один файл)(Рис 5.).
Рисунок 5. Главная страница движка LimeJS
PixiJS – это библиотека, реализующая быстрый и простой механизм
визуализации. Она может работать в сочетании с рядом других игровых
библиотек на JavaScript и выполнять визуализацию на основе canvas и
WebGL(Рис 6.).
Рисунок 6. Базовый пример возможности движка.
20
Phaser – HTML5 игровой движок с открытым исходным кодом. Для
рендера используется PixiJS, так что он может рендерить в canvas или
WebGL(Рис 7).
Рисунок 7. Пример реализации физики
В сегодняшних играх физика рудиментарна и различные ошибки
заметны только при игре с большим лагом – задержкой связи при игре по
сети, а в недалеком будущем (для которого уже существует практически все)
уровень моделирования окружающей действительности резко
поднимется[11].
Рисунок 8. Создание модели персонажа
22
Виртуальный мир станет почти настоящим, дерево будет гореть (если
его поджечь), плавать на поверхности воды, создавая волны, раскалываться
на части под ударами топора, каждый предмет можно будет толкнуть,
перетащить, бросить, поставить на другой и выбить из-под третьего. И
предметов таких, причем самых разных, будет огромное количество. Тут и
важны будут все те мелочи, на которые пока не обращают внимания ни
разработчики, ни игроки.
Итак, дискретная физическая модель работает следующим образом:
мир развивается по тактам, в момент X задаются исходные данные для всех
предметов, после чего код, ответственный за это, определяет новые их
положения, подсчитанные для момента X+1 (разумеется, "1" не означает
"одну секунду", или "один час", это просто некий отрезок времени, иногда
фиксированной длины в несколько сотых долей секунды, иногда –
переменной).
Казалось бы, легче всего взять текущую скорость, учесть ускорение,
по стандартной формуле просчитать новое положение, перенести туда наш
движущийся объект и уже там, на новом месте, бороться с возможными
осложнениями. Например, если этот объект – пуля, которая при очередном
такте попала в человека, надо тело этого человека зрительно повредить. А
если человек вошел внутрь стены, нужно его оттуда вытащить.
Но при этом возникает ряд проблем. Рассмотрим простейший
пример: кубик падает на плоскость (или пуля летит в игрока). Если кубик
маленький, скажем, с ребром в 1 сантиметр, скорость большая (два
сантиметра в секунду), а плоскость имеет нулевую толщину, то кубик может
даже за один такт пролететь ее насквозь: в начале он еще ее не коснулся, а в
конце уже находится за ней и снова ничего не касается. Чего в реальной
жизни не бывает. Из этого можно сделать вывод: простейшие методы
вычислений иногда не работают. Нужно честно просчитывать весь путь тела
на каждом шагу и реагировать на различные столкновения и взаимодействия
на пути. Это задача более сложная и ресурсоемкая, ведь для такого просчета
23
надо определить точный момент столкновения одного сложного тела с
другим (именно самих тел, а вовсе не их упрощенных оболочек).
В
основе
современных
реализаций
лежат
такие
мощные
математические модели, основанные на таких глубоких физических знаниях,
что человеку несведущему разобраться трудно, если вообще возможно.
Для начала поделим все объекты на две большие группы:
пружинные каркасы и твердые тела. Пружинные каркасы представляют
собой группу точек, связанных пружинами - связями, пытающимися
сохранить свою первоначальную длину. На каждом шаге моделирования
рассчитываются все силы, действующие на все точки каркаса. В результате
мы получаем новое состояние тела. Обычно такой принцип моделирования
используют для создания мягких тел и поверхностей, например, тканей,
резины и т.п. Твердые тела представлены всего одной точкой, но тут
появляется достаточно сложное вращательное движение. Такой метод, как
понятно из его названия, используется для представления твердых тел, не
изменяющих свою форму. Естественно, оба метода можно использовать
одновременно.
Теперь поделим на части методы моделирования твердых тел. Тут
существует два основных метода: импульсная модель и модель, основанная
на ограничениях. Импульсная модель наиболее проста, здесь надо только
найти столкновения объектов (впрочем, это приходится делать в каждом
методе) и приложить к ним силы, высчитанные по закону сохранения
импульса. Такой метод очень удобен, если между телами нет каких-нибудь
связей, хотя и их тоже можно реализовать на импульсах, правда, не совсем
точно и правильно. Поэтому для систем, содержащих множество связей
различной сложности, был придуман другой метод - ограничения. Метод,
построенный на ограничениях, - это пример системного подхода к
моделированию
физики.
Все
соединения
и
контакты
описываются
математически как ограничения и добавляются в общую систему уравнений.
Решив эту систему, мы получим новое состояние для каждого тела. Этот
24
метод удобен в первую очередь тем, что с его помощью можно создавать
любые ограничения. Эти возможности получили наибольшее применение в
технологии Rag Doll.
Словосочетание Rag Doll переводится на русский язык как
"тряпичная кукла". Начнем наше описание данной сравнительно новой
технологии сразу с практической части. Если мысленно перенестись в не
очень далекое прошлое (примерно в 2000 год), то можно вспомнить, что в
большинстве экшенов тела поверженных врагов (или монстров) лежат очень
неестественно: они погружаются по пояс то в стену, то в дверь, то они
повиснут над лестницей, как будто лежат на невидимых столах... Но
вернемся в наши дни. Подавляющее большинство современных шутеров
показывают
гибель
вражеских
солдат
очень
реалистично:
убитые
прислоняются к ближайшим стенам или картинно скатываются с лестниц
потому что используют технологию Rag Doll(Рис 9).
Рисунок 9. Ранний пример использования физики Ragdoll
Суть идеи заключена в том, что строится иерархия физических тел,
соединенных подвижными связями. Их расположение и соединения
напоминают расположение костей скелета для скелетной анимации. Затем
эта группа объектов объединяется со скелетом персонажа, чтобы совместить
физическую и графическую сущность человечка (или другого существа).
Как только персонаж умирает, "физический скелет" принимает позу
неудачливого бойца и загружается в физический движок. Теперь все
движения "куклы" обусловлены физическими законами, тело упадет на
землю так, как это было бы в жизни(Рис 10).
25
Рисунок 10. Шариковое соединение
Для
изображения
умирающего
персонажа
использовался
набор пререндеренных анимаций, этот способ характеризуется низкими
затратами
центрального
процессора.
Когда
мощности
компьютеров
возросли, стало возможным создание симуляций физики в реальном времени
с некоторыми ограничениями. На данном этапе Ragdoll представлял собой
набор твёрдых
тел,
каждое
из
которых
соответствует кости в
системе скелетной анимации графического движка, связанных вместе с
помощью системы ограничений. Она определяет на какие углы каждое тело
может
отклоняться
от
соседнего,
чтобы
изображение
оставалось
реалистичным.
Интересно отметить, что нет абсолютно никакой разницы, какой
метод моделирования использовать, - главное, чтобы он смог правильно
смоделировать все необходимые нам тела и соединения.
Несложно догадаться, что все это требует затраты огромных
ресурсов памяти и процессора. А ведь в современных компьютерных играх
помимо физики надо рассчитывать просто горы информации: графика (хотя
она почти полностью лежит на видеокарте, но все-таки затраты
производительности
процессора
требуются
немалые),
искусственный
интеллект, интерфейс и многое другое. Но при повышении реалистичности
физики повышаются и требования к компьютеру, т.е. все более и более
сложные физические модели требуют от системы все больше ресурсов. Что
26
же делать? Когда-то давно подобная проблема возникла в области графики.
Тогда судьбу центрального процессора облегчили, добавив принципиально
новое устройство - 3D-ускоритель, процессор которого (видеокарта) взял на
себя значительную часть вычислений, связанных с расчетами в области
построения 3D-картинки. Теперь похожая ситуация повторяется и с
физикой. Поэтому, для того чтобы снять с процессора обязанность
рассчитывать медленную физику, в ближайшем будущем планируется
повсеместное введение физического процессора. Первые реализации уже
появились, но они еще не очень распространены, да и игр с их поддержкой
совсем немного. Но все-таки эта технология рано или поздно приобретет
ничуть не меньшее признание, чем аппаратное ускорение трехмерной
графики. Первое "физическое ядро", разработанное сравнительно молодой
компанией Ageia, называется PhysX. По заявлениям разработчиков,
сделанным на конференции GDC, он позволяет честно смоделировать в
реальном времени систему из 50 000 тел (это против 10-50 тел
современными программными способами!) без особых потерь в скорости
выполнения программы.
Нельзя забывать и о том, как создаются виртуальные аналоги
физических тел. Для уже неоднократно упомянутых ящиков и бочек все
довольно просто: достаточно задать их геометрию и указать, из какого
материала они сделаны. К примеру, автомобиль или человека таким методом
не соорудишь. Ведь автомобиль - это отнюдь не ящик, а весьма сложная
система из тысяч деталей, каждая из которых (даже если оставить в стороне
подробности)
влияет
на
его
физические
характеристики.
Авторам
автосимуляторов приходится моделировать двигатель (и, разумеется, детали
его внутреннего устройства: разный момент на разных оборотах, инерцию
при торможении и т.п.), коробку передач (не до отдельных шестеренок, но с
реальными
передаточными
числами),
рессоры
(с
нелинейной
характеристикой, как у настоящих), амортизаторы (они сильно влияют на
управляемость), рулевое управление, колеса, резину на них и многое другое.
27
В итоге обнаруживается, что для любого сложного с точки зрения физики
объекта создание его виртуального аналога - задача не рутинная, а
требующая серьезнейшего программирования и очень долгой отладки и
настройки.
Физический движок - библиотека, которая рассчитывает физические
взаимодействия между объектами игрового мира (симулируется физика,
описываемая законами Ньютона). Физические движки, используемые при
разработке игр, как правило, не симулируют физические процессы игрового
мира со 100% точностью, а лишь производят достаточно точную
аппроксимацию физических законов. Современные игровые физические
движки состоят из двух частей: подсистемы определения столкновений и
подсистемы расчета физических взаимодействий.
Подсистема определения столкновений
Основные два параметра подсистемы определения столкновений:
скорость работы и точность определения столкновений. Недостаточная
точность приводит к появлению разных артефактов, таких как перекрытие
объектов,
неопределенность
столкновений
при
существенно
разных
размерах и скоростях объектов и т.д. Для ускорения работы подсистемы
столкновений используют различного рода разбиения пространства на
подпространства, такие как quadtree (рекурсивное деление пространства на
четыре подпространства) или осtree (деление на восемь подпространств), для
снижения количества проверок столкновений. Системы столкновений
работают дискретно - столкновения рассчитываются через определенные
промежутки времени. Итак, такого рода системы могут приводить к тому,
что столкновения с участием быстро движущихся объектов не фиксируются
- для борьбы с подобного рода артефактами некоторые системы
столкновений поддерживают так называемый continuous collision detection
(CCD) (системы непрерывного отслеживания столкновений). Суть метода
continuous collision detection заключается в том, что проверка столкновений
28
между двумя объектами производится не между ними самими в дискретные
моменты времени, а между вытянутыми объемами, которые представляют
движение объектов в течение всего временного шага.
Подсистема симуляции
Подсистема симуляции, помимо скорости работы, характеризуется
таким параметром, как стабильность симуляции. Этот параметр влияет
непосредственно на достоверность самой физической симуляции: если
симуляция
нестабильна,
видны
разные
артефакты,
например
подергивающиеся объекты. Симуляция дискретна, то есть программист
извне задает шаг времени, который необходимо рассчитать. От размера
этого шага и зависит стабильность симуляции. Соответственно, чем
больший размер шага позволяет устанавливать движок, тем лучше.
1.2. Основные методы реализации физических процессов
Физика в играх является огромным фактором в обеспечении реализма,
от гонок в автомобиле вокруг Laguna Seca до снайпинга ничего не
подозревающих врагов на Battlefield, вы можете найти физику почти везде!
Тем не менее, нет никакой серебряной пули, когда речь заходит о
моделировании физики реального мира. Существует несколько способов
выбора, и каждый метод имеет свои плюсы и минусы, поэтому
разработчикам необходимо определить, когда и где эти методы должны
использоваться в определенных ситуациях. Эти методы обычно разбиваются
на несколько разных категорий в зависимости от уровня точности, который
дает каждый (это связано с количеством шагов, которые требуется для
вычисления производной) [9]:
 Интегрирование первого порядка
 Интегрирование второго порядка
29
 Интегрирование высшего порядка
Прежде чем углубляться в какие-либо методы интегрирования, важно
перечислить основные ньютоновские уравнения движения:
F=m*a
a=F/m
Где F – сила, m – масса, a – ускорение.
Далее, чтобы понять, что ускорение является производной от скорости,
а положение является производной ускорения. В терминах исчисления это
можно представить так:
dv/dt = a
dx/dt = v
Интегрирование первого порядка
Явный метод Эйлера
Это один из простейших методов численного интегрирования, который
используют разработчики игр, однако он не самый точный. Этот метод
работает, беря начальное положение и скорость и вычисляя следующую
позицию и скорость по истечении заданного времени, это повторяется с
использованием значения временного шага, например, 0,5 секунды (это будет
представлено «dt» на протяжении всей статьи). После вычисления первых
значений мы используем их для вычисления следующих значений. Вот
простое уравнение для демонстрации:
+1 =  + ( ∗ )
Используя приведенное выше уравнение, чтобы найти скорость, мы
теперь находим положение следующим образом:
+1 =  + ( ∗ )
Где X – это заданная позиция объекта. Однако, этот метод не является
одним из самых точных методов интегрирования. Мы всегда будем получать
30
значение ошибки, которое зависит от значения размера шага (в этом случае
0,5 с). Значение ошибки - это разница между фактическим решением и
оценкой, общее правило заключается в том, что значение ошибки
увеличивается, поэтому это означает, что существует практический предел
для того, когда мы можем использовать этот метод, особенно с меньшим
количеством времени. Мы можем уменьшить значение временного шага, это
приблизит оценки к реальному решению, однако это нецелесообразно, если
мы сделаем шаг размером 0,01 в течение 10 секунд, это означает, что будут
тысячи вычислений, что компьютер должен будет обрабатывать, тем самым
замедляя вычислительную скорость. Важно отметить, что независимо от
того, насколько вы уменьшаете значение шага времени, значение ошибки
все равно будет увеличиваться с течением времени.
Подводя
итог,
этот
метод
Эйлера
отлично
подходит
для
концептуального понимания для других методов интеграции, однако он не
очень точен, если мы не уменьшаем размеры шага, которые, как мы теперь
знаем,
вызывают
увеличения
проблему
значение
увеличения
ошибки
количества
увеличивается.
Эйлер
вычислений
в
и
основном
используется, когда воздействие значения ошибки не будет иметь
решающего влияния на то, что произойдет дальше. Например, бегущий
персонаж,
затем
совершающий,
когда
персонаж
приземляется,
он
продолжает спринт.
Неявный метод Эйлера
Этот метод отличается от предыдущих методов Эйлера, потому что он
вычисляет производную, а затем перескакивает назад, чтобы использовать
эту производную для вычисления следующей оценки, неудивительно, что
другое имя, которое имеет этот метод Эйлера, - «назад Эйлер». Вот как
рассчитывается скорость:
+1 =  + (+1 ∗ )
31
Как только скорость была рассчитана, следующим шагом будет
вычисление позиции:
+1 =  + (+1 ∗ )
Несмотря на то, что это еще один метод интегрирования первого
порядка, это означает, что все еще будет эта ошибка, он чрезвычайно
стабилен даже при больших шагах времени, однако один из компромиссов
заключается в том, что он более сложный, потому вам придется вычислить
обновленное ускорение и скорость, потому что у вас не будет этих значений.
Это означает, что это более медленный метод для интегрирования.
Однако этот метод не идеален для любых жестких движений тела, хотя
этот метод является чрезвычайно точным и, несмотря на то, что он быстрее,
чем методы интегрирования более высокого порядка, он по-прежнему
занимает слишком много времени, чтобы его можно было использовать
таким образом. Этот метод используется для множества вещей в играх,
таких как пружины, вычисления трения, перетаскивания и изменения
ускорения.
«Полунеявный» метод Эйлера (Симплектический Эйлер)
Этот метод является промежуточной средой между явным Эйлером и
неявным, поэтому называется «Полу-неявным». Причина, по которой
существует этот промежуточный метод, связана с тем, как она вычисляет как
скорость, так и положение в определенное время. Этот метод вычисляет
скорость с использованием явного метода Эйлера, где мы вычисляем
скорость с использованием ускорения с предыдущего временного шага:
+1 =  + ( ∗ )
Следующим шагом в этом процессе является вычисления позиции, и
это делается с использованием неявного метода, где мы вычисляем позицию
с использованием недавно обновленного значения скорости:
+1 =  + (+1 ∗ )
32
Одним из преимуществ полу-неявного метода является то, что он
намного более стабилен, чем явный. Это означает, что он дает оценку,
которая ближе к фактическому решению, однако она по-прежнему является
лишь оценкой, поэтому она по-прежнему страдает от значения ошибки.
Другим преимуществом этого метода численного интегрирования является
то, что, хотя он более точен, чем явный метод Эйлера, его довольно легко
интегрировать, что делает его более быстрым для реализации, чем методы
более высоких порядков.
Подводя итог, этот метод чрезвычайно популярен среди разработчиков
игр благодаря своей простоте и улучшенной стабильности над явным
Эйлером. Этот метод, в основном, используется для расчета «движения
твердого тела»(Рис 11).
Рисунок 11. Пример физики в madden
Интегрирования второго порядка
Интегрирование Верле (французское произношение: [vɛʁlɛ]) - это
численный метод, используемый для интегрирования уравнений движения
Ньютона. Он часто используется для расчета траекторий частиц в
33
симуляциях молекулярной динамики и видеоиграх. Интеграл Верле
обеспечивает большую стабильность, чем гораздо более простой метод
Эйлера, а также другие свойства, которые важны в физических системах,
таких как обратимость во времени и свойства сохранения области. Поначалу
может
показаться
естественным
просто
вычислить
траектории
с
использованием интегрирования Эйлера[15]. Однако такая интегрирование
страдает от многих проблем, о чем говорилось при интеграции Эйлера.
Стабильность метода в значительной степени зависит от равномерной
скорости обновления или способности точно определять позиции за
небольшую временную дельта в прошлое.
В методе молекулярной динамики молекула рассматривается как
система взаимодействующих частиц. Это означает, что атомы, из которых
состоит молекула, считаются шариками, взаимодействующими между собой
по законам классической механики. Межатомное взаимодействие делят на
валентное(ковалентное)
и
не
валентное.
Валентное
взаимодействие
возникает между атомами одной молекулы в результате обобществления
валентных электронов парой соседних атомов, то есть в результате
образования химической связи, и является причиной существования молекул.
К таким взаимодействиям относят растяжение химической связи, изменение
валентного угла, вращение атомных групп вокруг одинарных химических
связей. Энергия каждого из этих типов взаимодействий аппроксимируется
своей формулой
Физическое моделирование, т. е. моделирование движения персонажей,
основанное на законах физики (а точнее — механики), изучается достаточно
давно. Точные методы моделирования движения известны в физике уже
давно. Однако для игр и систем виртуальной реальности, точность — не
самое главное достоинство (хотя хорошо, когда она есть).
Метод Верле относится к детерминистическим методам. Это означает,
что состояние в следующий момент времени dt+t целиком определенно
текущим состоянием t.
34
Метод численного интегрирования Верле издавна использовался для
вычисления траекторий частиц. Сам метод был впервые использован ещё в
1791 году французским астрономом Жаном-Батистом-Жозефом Деламбром.
В 1907 норвежский математик и физик Карл Штёрмер использовал его для
моделирования движения частиц в магнитном поле, поэтому иногда этот
метод называют методом Штёрмера.
Современное название этот алгоритм получил от имени французского
физика Лу Верле, который в 1967 году использовал его в моделировании
молекулярной динамики. В последнее время метод Верле применяется и в
разработке компьютерных игр.
Сердцем симуляции (т. е. имитации физического процесса при помощи
компьютерной системы) является система частиц. Обычно, при реализации
такой системы предполагается, что каждая частица имеет две основные
характеристики: координату (положение, position) и скорость .
Тогда, новые значения координат ′ и скорости ′ вычисляются по
формулам:
′ = + ∆,
′ = + ∆
Где ∆ – шаг по времени, а  – ускорение, вычисленное в соответствии
с 2-м законом Ньютона  = m (где  – суммарная сила, действующая на
частицу). Приведенные формулы реализуют простейший метод численного
интегрирования – Метод Эйлера.
Мы рассмотрим другое описание частицы, в котором скорость не
используется: вместо хранения положения и скорости каждой частицы, мы
будем сохранять текущее положение частицы  и ее положение на
предыдущем шаге интегрирования  ∗. Предполагая шаг интегрирования
постоянным, получим следующие формулы для вычисления новых значений:
′ = 2−  ∗+ ∆ 2 ,
 ∗= 
35
Этот способ численного интегрирования называется методом Верле и
активно используется в молекулярной динамике.
Метод Верле опирается на приближенную формулу вычисления
второй производной
−  ∗
′ − 
−

 ′ − 2+  ∗ = 
∆
∆
=
=
∆2
∆
∆2
2∆
Такое приближение не является самым точным (есть и более
совершенные методы численного интегрирования), зато оно устойчиво и
работает быстро. Уменьшая коэффициент 2 до, скажем, 1.99, мы тем самым
вводим силу сопротивления, рассеивающую энергию системы. Отметим
также, что  −  ∗ - это расстояние, пройденное за последний шаг
интегрирования (∆).
В конце шага интегрирования текущее положение каждой частицы 
сохраняется
в
переменной  ∗ для
соответствующей
использования на следующем шаге. Если частиц в системе много, то вместо
копирования
их
координат
удобно
использовать
перенаправление
указателей.
Ограничения
Самая известная вещь, которая теперь проще из-за использования
интеграции Верле, а не Эйлера, заключается в том, что ограничения между
частицами очень просты. Ограничение - это соединение между несколькими
точками,
которое
каким-то
образом
их
ограничивает,
возможно,
устанавливая их на определенном расстоянии или сохраняя их отдельно, или
убедитесь, что они ближе определенного расстояния. Часто физические
системы используют пружины между точками, чтобы держать их в местах,
где они должны быть. Однако использование пружин бесконечной
жесткости между двумя точками обычно дает наилучшие результаты в
сочетании с алгоритмом Верле. Вот как:
36
Переменная ()

это позиции точек i в момент
времени t, а ̃()
 - неограниченные позиции (т. е. точка позиции перед
применением ограничений) точек i в момент времени t, переменные d
являются временными (они добавляются для оптимизации, поскольку
результаты их выражений требуются несколько раз), а r - расстояние,
которое должно быть между двумя точки. В настоящее время это одно
измерение; однако он легко расширяется до двух или трех. Просто найдите
дельта (первое уравнение) каждого измерения, а затем добавьте квадрат
дельта в внутреннюю часть квадратного корня из второго уравнения
(теорему Пифагора). Затем дублируйте последние два уравнения для числа
измерений[1]. Здесь вербальность упрощает ограничения - вместо того,
чтобы сказать, что скорость будет соответствовать точкам, которые в
конечном итоге удовлетворят ограничение, вы можете просто расположить
точку, где она должна быть, и интеграл Верле позаботится об остальном.
Однако
проблемы
возникают,
когда
несколько
ограничений
располагают вершину. Один из способов решения этой проблемы - циклично
перебирать все вершины в симуляции, так что в каждой вершине ослабление
ограничения
последней
вершины
уже
используется
для
ускорения
распространения информации. Либо используйте мелкие временные шаги
для моделирования, используйте фиксированное количество шагов решения
ограничения на шаг времени, либо разрешайте ограничения, пока они не
будут удовлетворены определенным отклонением.
При аппроксимации ограничений локально до первого порядка это то
же самое, что и метод Гаусса-Зейделя. Для малых матриц известно, что
37
разложение линейных аппроксимаций происходит быстрее. Большие
системы можно разделить на кластеры (например, каждый ragdoll = cluster).
Внутри кластеров используется метод линейных аппроксимаций, между
кластерами используется метод Гаусса-Зейделя. Матричный код может быть
повторно
использован:
аппроксимирована
зависимость
локально
в
сил
первом
от
позиций
порядке,
и
может
быть
интегрирование
вербальных связей может быть сделана более неявной.
Для больших матриц сложных решений для разреженных матриц,
любая собственная интеграция Верле должна конкурировать с ними.
Использование (кластеров) матриц обычно не является более точным или
стабильным, но решает конкретную проблему: сила на одной вершине листа
ткани должна достигать любой другой вершины с небольшим количеством
временных шагов, даже если тонкая сетка используется для ткани и не
формирует звуковую волну.
Другим
способом
решения
голономных
ограничений
является
столкновение
является
использование алгоритмов ограничения.
Реакция столкновений
Одним
из
способов
реагирования
на
использование системы на основе штрафов, которая в основном применяет
заданную силу к точке при контакте. Проблема в том, что очень сложно
выбрать переданную силу. Используйте слишком сильную силу, и объекты
станут неустойчивыми, слишком слабыми и объекты будут проникать друг в
друга. Другой способ - использовать реакции столкновения проекций,
которые принимают точку нарушения и пытаются переместить его на
кратчайшее возможное расстояние, чтобы вывести его из другого объекта[3].
Интеграция
Верле
автоматически
обрабатывала
бы
скорость,
передаваемую при столкновении в последнем случае, однако обратите
внимание, что это не гарантируется таким образом, что это согласуется с
38
физикой столкновений (т. е. Изменения в импульсе не гарантируются
реалистично), вместо неявного изменения термина скорости вам нужно
будет явно контролировать конечные скорости сталкивающихся объектов
(путем изменения записанной позиции с предыдущего шага времени). Двумя
простейшими методами решения новой скорости являются совершенно
упругие столкновения и неупругие столкновения. Несколько более сложная
стратегия,
которая
предлагает
больше
контроля,
будет
включать
использование коэффициента реституции.
Метод скорости Верле
Как упоминалось выше, в стандартном/позиционном методе Верле,
одна из проблем такого типа метода интегрирования состоит в том, что,
поскольку мы приближаемся к скорости, скорость не очень точная. Одним
из способов повышения точности скорости является использование этого
метода, метода скорости
Верле[3]. Этот метод разбивает процесс
вычисления на четыре шага, мы вычисляем скорость дважды, один раз на
пол шага и снова после вычисления следующего ускорения:
Шаг 1)
+1/2 =  +  ∗ /2
Шаг 2)
+1 =  + +1/2 ∗ 
Шаг 3)


Шаг 4)
+1 =
+1 = +1/2 + +1 ∗ /2
Однако, делая это, метод теряет часть своей эффективности, хотя это
означает, что мы можем использовать метод Верле в ситуациях, когда нам
нужно будет моделировать физику со скоростью, которая быстро возрастает
и быстро уменьшается, например, гоночная игра. В дополнение к этому, этот
метод можно использовать во всех тех же ситуациях, что и стандартный
39
метод Верле, но с большей точностью. Этот метод является одним из
наиболее распространенных из рассмотренных двух методов Верле[10].
Существует множество различных методов интегрирования, которые
можно использовать для моделирования физики в игровых мирах, однако,
каждый из них имеет свои плюсы и минусы, например, явный Эйлер быстро
и легко реализуется и использует меньше вычислений для физических
процессов[7]. Недостатком этого является то, что он не так точен по
сравнению с остальными методами. С другой стороны у нас есть метод
Верле, который производит более точные вычисления, но они сами по себе
занимают больше времени для вычислений.
40
ГЛАВА 2. ПРИМЕНЕНИЕ МЕТОДА ВЕРЛЕ В ИГРАХ
2.1. Метод Верле
Интегрирование Верле – это метод интегрирования для физических
симуляций, который обеспечивает большую стабильность по сравнению с
системами Эйлера. Самое большое различие между методом Верле и
методами Эйлера заключаются в том, как положение и скорость
сохраняются/вычисляются. Традиционные системы Эйлера содержат
отдельные переменные для скорости и положения (Рис 12). Например:
Рисунок 12. Пример использования метода Эйлера
Верле рассчитывает свою скорость “На лету”, сравнивая ее текущее
положение с сохраненной последней позицией[13].
С помощью метода Эйлера мы должны постоянно управлять и
изменять свою скорость, чтобы получить точные или даже реалистичные
результаты. Например, мяч движется со скоростью 20 единиц в секунду и
сталкивается со стеной. Чтобы решить это простейшим способом (не
обращая внимания на фактическое обнаружения столкновения на
мгновение), мы переместим шар в точку, расположенную непосредственно у
поверхности стены, и изменим скорость, чтобы представить новое
41
направление (Рис 13).
Рисунок 13. Применение метода Верле
С помощью метода Верле мы можем игнорировать изменения
скорости извне. Перемещая шар в положение за пределами стены, сама
система будет вычислять новую скорость, основанную на различии между
позицией столкновения и новой позицией (Рис 14.).
Рисунок 14. Вычисление новой скорости
Здесь мы можем начать видеть силу границ/ограничений с помощью
системы Верле. Мы можем использовать эти ссылки для создания сложных
систем, таких как ткань или “Тряпичных кукол”.
Но прежде всего рассмотрим, как работают ограничения в системе
Верле. Эти “ссылки” определяют, как далеко тела должны быть от другого
тела в системе и перемещать их друг другу или от них (Рис 15.).
42
Рисунок 15. Расположение тел
Например, возьмем маятник (Рис 16.):
Рисунок 16. Маятник
Просто добавив гравитацию в систему и разрешив ограничения, мы
сможем добиться реалистичного движения маятника.
Следует отметить, что в зависимости от того, сколько раз ограничения
были устранены за каждый шаг времени, определяется, насколько они
43
жесткие. Что-то вроде маятника будет иметь жесткое ограничение, тогда как
нечто вроде ткани будет иметь более эластичные ограничения.
Этот метод интегрирования не всегда достаточно точен, поскольку
разница между текущей и старой позицией является только приближением к
фактической скорости. Тем не менее, он быстрый и стабильный, поэтому
отлично подходит для игр. Кроме того, реакция столкновений становится
очень простой. Рассмотрим точку как показано на рисунке 17.
Рисунок 17. Движение точки к телу
Начальные условия для старой и текущей позиции выбраны так, что
точка движется медленно вправо. После определенного количества шагов
времени, точка будет пересекаться с квадратом справа. Как только
обнаружено столкновение, нам нужно только переместить точку из квадрата.
Поскольку интегрирование использует разницу между старой и текущей
позицией, в качестве своей скорости, скорость этой точки, в последствии
изменится, если мы изменим либо текущую позицию, либо прошлую. Как
видно на рисунке 18, точка автоматически замедляется и, в конечном счете,
останавливается.
Рисунок 18.
44
Библиотека Verlet.JS
Verlet.js – это физический движок распространяемый в свободном
доступе, который позволяет, при необходимости, значительно упростить
использование данного метода при постановке и решении тематических
задач связанных с молекулярной динамикой, либо с использованием в
моделировании и компьютерных играх, при создании физических процессов.
Библиотека основана на интерактивном методе, называемом интегралом
Верле, используемом для вычисления поведения объектов в его двумерном
мире[12].
Поскольку 2D – мир этого физического физического движка нарисован
с помощью canvas, нам необходимо добавить его на веб-страницу:
Для инициализации 2D – мира, можно его так же назвать симуляцией –
нам необходимо вызвать конструктор verlet-js, называемый VerletJS(). К
этой конструкции мы передаем размеры холста вместе с ссылкой на сам
холст
Чтобы нарисовать 2D – мир, нам необходимо многократно вызывать
функцию frame(), которая выполняет все физические вычисления, и
функцию draw(), которая рисует все частицы и ограничения, принадлежащие
2D – миру. Как часто вы вызываете эти функции каждую секунду, вы
определяете частоту кадров в 2D мире.
Чтобы рассчитать гравитацию, скорость и инерцию в нашем
созданном 2D мире мы используем наш метод в функции frame():
45
Сохраняем последнее значение координат:
Добавляем гравитацию и инерцию:
Verlet-js имеет вспомогательную функцию, называемую tire(), которая
позволяет быстро создавать простые фигуры(состоящие из частиц и
ограничений) без необходимости определять частицы или ограничения
самостоятельно:
Первый параметр указывает координаты начала формы, а второй
параметр определяет радиус (расстояние от начала до всех остальных точек
формы). Третий параметр – количество сегментов, составляющих форму.
Последние два параметра определяют жесткость ограничений.
Чтобы создать сегменты линии, состоящие из двух и более частиц,
используем функцию LineSegments(). Он принимает массив объектов Vec2,
который содержит позиции частиц, которые образуют сегмент линии, и
число, определяющее жесткость ограничения расстояния между ними.
Другая
вспомогательная
функция,
предоставляемая
verlet.js,
называется cloth(). Она позволяет создавать группу частиц, которые ведут
себя как кусок ткани:
46
Эта функция принимает довольно много аргументов. В следующем
списке описаны все из них(Рис 19.):
 Первый параметр указывает начальное положение координат,
 Второй и третий параметры определяют ширину и высоту ткани,
 Четвертый параметр указывает количество сегментов в каждой
строке и столбце ткани,
 Пятый параметр, если он отличен от нуля, указывает, какие
частицы должны быть закреплены
 Последний параметр указывает жесткость ограничений между
всеми частицами.
Рисунок 19. Пример создания ткани.
47
Создание пользовательских объектов
Более сложные объекты – те, которые не могут быть созданы с
помощью вспомогательных функций, могут быть созданы с использованием
класса Composite. Компонентный объект имеет два массива: один,
содержащий
частицы,
называемый
particles
и
один,
содержащий
ограничения, называемый constrains. Чтобы добавить частицу, или
ограничение к составному объекту, нужно использовать функцию push()
соответствующего массива.
Когда фигура будет готова, можем добавить её в 2D мир используя
следующий код:
Ниже
представлены
фигуры, которые мы
20,21,22,23.):
48
можем создать(Рис
Рисунок 20.
Рисунок 21.
Рисунок 22.
Рисунок 23.
49
2.2. Программная реализация метода.
Для наглядного примера использование метода Верле, мы с помощью
библиотеки Verlet.JS, реализуем построение двойного маятника с разной
степенью жёсткости (Рис 24)[5].
Рисунок 24. Маятник
Для реализации использования физических процессов, мы подключаем
скрипт библиотеки Verlet.js в наш код:
Добавляем созданный 2D мир на веб-страницу:
Для инициализации 2D мира используем вызов конструктора verlet-js,
которому передается размер холста мира и ссылка на него:
Чтобы создать двойной маятник, используем функцию lineSegments(),
которая позволит нам создать маятники:
50
С помощью функции Vec2(), мы добавляем нужное количество точек, и
указываем их начальное положение. Так же и для второго маятника:
Можем заметить, что коэффициент жёсткости, который мы задаём в
конце строки, разный. Чем ближе значение коэффициента к единице, тем
жёстче будет связь между точками, и наоборот – чем меньше это значение,
тем эластичней будет связь между точками (Рис 25).
Рисунок 25.
Pin используется для того, чтобы привязать частицу к холсту. Это
означает, что частица, которая закреплена, не будет зависеть от силы тяжести
и, как таковая, не будет двигаться, если мы не переместим её.
Вызываем функцию frame(), которая выполняет все физические
вычисления, и функцию draw(), которая рисует все частицы и ограничения,
принадлежащие 2D – миру.
51
Так же по аналогии, мы можем создать “Верёвку” – линию со многими
точками, и так же сделать различные коэффициенты жёсткости, чтобы
нагляднее просмотреть их связь (Рис 26,27):
Рисунок 26.
Рисунок 27.
Полный код скрипта доступен в приложении.
52
ЗАКЛЮЧЕНИЕ
В выпускной квалификационной работе рассматривалось применение
метода Верле для моделирования физических процессов в играх.
В ходе решения поставленных задач был дан обзор и классификация
физических движков, используемых в играх. В работе рассмотрены методы
моделирования физических процессов: методы Эйлера (явный, неявный,
полу-неявный), метод Верле. Изучены возможности применения этих
методов в играх. Для моделирования физических процессов выбран метод
Верле. С помощью библиотеки Verlet.JS создана модель математического и
двойного математического маятника. Эта модель позволяет учитывать
упругость подвеса.
В ходе выполнения выпускной квалификационной работы все
поставленные задачи выполнены и цель работы
– моделирование
физических процессов в играх с помощью метода Верле – достигнута.
53
СПИСОК ЛИТЕРАТУРЫ
1. Медведев Д.А, Куперштох А.Л, Прууэл Э.Р., Сатонкина Н.П., Карпов Д.И
“Моделирование физических процессов и явлений на ПК”: Учебное
пособие/Новосибирск: Новосиб. Гос. Ун-т., 2010. – 101с
2. Экштайн.В “Компьютерное моделирование взаимодействия частиц с
поверхностью твердого тела”: Мир, 1995г
3. А.В.Комолкин, М.Г.Шеляпина “Метод молекулярной динамики”: Учеб.метод.пособие – СПБ.:Изд-во “Соло”,2007.-72
4. Verlet.js – физический движок на основе метода Верле [Электронный
ресурс], 2013. URL - https://habr.com/post/178135/
5. Inroduction
to
Verlet
[Электронный
ресурс],
2014.
URL
-
https://www.sitepoint.com/an-introduction-to-verlet-js/?from=headjs.ru
6. Моделирование движения персонажей компьютерных игр [Электронный
ресурс], 2014. URL - http://dkhramov.dp.ua/Comp.Jakobsen#.W0I8_dIzaM9
7. Зализняк В. Е “Основы вычислительной физики”: Учебное пособие:
Москва-Ижевск: Инс-т. комп. Исс-й., 2006. – 156с
8. На чём делать HTML5 игры? [Электронный ресурс], 2017. URL http://cyber-code.ru/%D0%BD%D0%B0-%D1%87%D0%B5%D0%BC%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-html5%D0%B8%D0%B3%D1%80%D1%8B/
9. Numerical integration in games development [Электронный ресурс], 2015.
URL
-
https://jdickinsongames.wordpress.com/2015/01/22/numerical-
integration-in-games-development-2/
10.Verlet
Explained
[Электронный
ресурс],
2013.
URL
-
http://lonesock.net/article/verlet.html
11.Simulate Tearable Cloth and Ragdolls With Simple Verlet Integration
[Электронный
ресурс],
2012.
URL
https://gamedevelopment.tutsplus.com/tutorials/simulate-tearable-cloth-andragdolls-with-simple-verlet-integration--gamedev-519
54
-
12.A Verlet based approach for 2D game physics [Электронный ресурс], 2009.
URL - https://www.gamedev.net/articles/programming/math-and-physics/averlet-based-approach-for-2d-game-physics-r2714/
13.Introducing
Verlet-JS
[Электронный
ресурс],
2013.
URL
-
http://subprotocol.com/system/introducing-verlet-js.html
14.Verlet-system
[Электронный
ресурс],
2014.
URL
-
https://www.npmjs.com/package/verlet-system
15.Euler vs Verlet Game Physics [Электронный ресурс], 2011. URL http://kahrstrom.com/gamephysics/2011/08/03/euler-vs-verlet/
55
Приложение
Исходный код проекта
<!DOCTYPE html>
<html lang="en">
<head>
<title>Verlet Pendulum</title>
<meta charset="UTF-8" />
<link rel="stylesheet" href="../css/style.css"
type="text/css" media="screen, projection" />
<link
href='http://fonts.googleapis.com/css?family=Libre+Bask
erville:400,700,400italic' rel='stylesheet'
type='text/css'>
<script type="text/javascript" src="../js/verlet1.0.0.js"></script>
</head>
<body>
<canvas id="scratch" style="width: 800px; height:
500px;"></canvas>
<script type="text/javascript">
window.onload = function() {
var canvas =
document.getElementById("scratch");
var width = parseInt(canvas.style.width);
var height = parseInt(canvas.style.height);
var dpr = window.devicePixelRatio || 1;
canvas.width = width*dpr;
canvas.height = height*dpr;
canvas.getContext("2d").scale(dpr, dpr);
var sim = new VerletJS(width, height, canvas);
sim.friction = 1;
56
var segment = sim.lineSegments([new
Vec2(150,60), new Vec2(250,120), new Vec2(310,120)],
10);
var pin = segment.pin(0);
var lines = sim.lineSegments([new Vec2(590,10),
new Vec2(690,10), new Vec2(750,10)], 0.01);
var pin = lines.pin(0);
var linus = sim.lineSegments([new
Vec2(100,290), new Vec2(195,390)], 10);
var pin = linus.pin(0);
var linus = sim.lineSegments([new
Vec2(570,290), new Vec2(665,390)], 0.01);
var pin = linus.pin(0);
var loop = function() {
sim.frame(32);
sim.draw();
requestAnimFrame(loop);
};
loop();
};
</script>
</body>
57
58
1/--страниц
Пожаловаться на содержимое документа