Болезни Военный билет Призыв

Что происходит в данной простейшей модели? Действия движка Physics Engine

Вас интересуют игры? Хотите создать игру но не знаете с чего начать? Тогда вам сюда. В этой статье я рассмотрю простейший физический движок, с построения которого можно начать свой путь в GameDev’e. И да, движок будем писать с нуля.

Несколько раз мои друзья интересовались, как же я пишу игры / игровые движки. После очередного такого вопроса и ответа я решил сделать статью, раз эта тема так интересна.

В качестве языка программирования был выбран javascript, потому что возможности скачать IDE и компилятор у подопытного знакомого не было. Рисовать будем на canvas.

Постановка задачи

Необходимо для нескольких объектов на плоскости реализовать взаимодействие с помощью фундаментальной силы гравитации.
Т.е. сделать что-то подобное притяжению звёзд в космосе.

Алгоритм

Для начала нужно уяснить отличие компьютерной физики от реальной. Реальная физика действует непрерывно (во всяком случае обратное не доказать на текущий момент). Компьютерная физика, как и компьютер действуют дискретно, т.е. мы не можем вычислять её непрерывно, поэтому разбиваем её вычисление на шаги с определённым интервалом (я предпочитаю интервал 25 мс). Координаты объектов меняются после каждого шага и объекты выводятся на экран.

Теперь приступим к самой гравитации.

Закон всемирного тяготения (Ньютонова гравитация) гласит:

F = G * m1 * m2 / R^2 (1)

F [Н]- сила притяжения между двумя объектами G = 6.67*10^-11 [м^3/(кг * с^2)]- гравитационная постоянная m1, m2 [кг] - массы 1 и 2 объектов R [м] - расстояние между центрами масс объектов

Как это нам поможет в определении новых координат? А мы эту силу будем прикладывать к этим объектам, используя второй закон Ньютона:

F = m * a (2)

F [Н] - сила, приложенная к текущему объекту m [кг] - масса текущего объекта a [м/с^2] - ускорение текущего объекта

Забудем на время то, что в (1) сила - скаляр, а в (2) сила - вектор. И во 2 случае будем считать силу и ускорение скалярами.

Вот и получили изменение ускорения:

A = F / m (3)

Изменение скорости и координат следует из следующего:

A = v" → a = dv / dt → dv = a * dt v = s" → v = ds / dt → ds = v * dt v += dv Pos += ds

D - дифференциал (производная) v - скорость s - расстояние Pos - точка, текущие координаты объекта

переходим от векторов к скалярам:

A.x = a * cos(α) a.y = a * sin(α) dv.x = a.x * dt dv.y = a.y * dt v.x += dv.x v.y += dv.y ds.x = v.x * dt ds.y = v.y * dt Pos.x += ds.x Pos.y += ds.y

Cos(α) = dx / R sin(α) = dy / R dx = Pos2.x - Pos.x dy = Pos2.y - Pos.y R^2 = dx^2 + dy^2

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

F = G * m * m2 / R^2 a = G * m2 / R^2

Код

Запускаемую страничку index.html создадим сразу и подключим код:

можно не смотреть

Physics

Основное внимание уйдёт на файл с кодом программы script.js . Код для отрисовки откомментирован достаточно и он не касается темы:

посмотрим и забудем на время

Var canvas, context; var HEIGHT = window.innerHeight, WIDTH = window.innerWidth; document.addEventListener("DOMContentLoaded", main, true); function main(){ // создаём холст на весь экран и прикрепляем его на страницу canvas = document.createElement("canvas"); canvas.height = HEIGHT; canvas.width = WIDTH; canvas.id = "canvas"; canvas.style.position = "absolute"; canvas.style.top = "0"; canvas.style.left = "0"; document.body.appendChild(canvas); context = canvas.getContext("2d"); /******* другой код *******/ } function Draw(){ // очищение экрана context.fillStyle = "#000000"; context.fillRect(0, 0, WIDTH, HEIGHT); // рисование кругов context.fillStyle = "#ffffff"; for(var i = 0; i < star.length; i++){ context.beginPath(); context.arc(star[i].x - star[i].r, star[i].y - star[i].r, star[i].r, 0, Math.PI * 2); context.closePath(); context.fill(); } }

Теперь самое вкусное : код, который просчитывает физику.

На каждый объект мы будем хранить только массу, координаты и скорость. Ах да, ещё надо радиус - он нам понадобится для рассчёта столкновений, но об этом в следующей статье.

Итак, «класс» объекта будет таким:

Function Star(){ this.x = 0; this.y = 0; this.vx = 0; this.vy = 0; this.r = 2; // Radius this.m = 1; } var star = new Array(); // в этом массиве будут храниться все объекты var count = 50; // начальное количество объектов var G = 1; // задаём константу методом подбора

Генерация случайных объектов в самом начале:

Var aStar; for(var i = 0; i < count; i++){ aStar = new Star(); aStar.x = Math.random() * WIDTH; aStar.y = Math.random() * HEIGHT; star.push(aStar); }

Шаг вычисляться будет в следующей функции:

Function Step(){ var a, ax, ay, dx, dy, r; // важно провести вычисление каждый с каждым for(var i = 0; i < star.length; i++) // считаем текущей for(var j = 0; j < star.length; j++) // считаем второй { if(i == j) continue; dx = star[j].x - star[i].x; dy = star[j].y - star[i].y; r = dx * dx + dy * dy;// тут R^2 if(r < 0.1) r = 0.1; // избегаем деления на очень маленькое число a = G * star[j].m / r; r = Math.sqrt(r); // тут R ax = a * dx / r; // a * cos ay = a * dy / r; // a * sin star[i].vx += ax; star[i].vy += ay; } // координаты меняем позже, потому что они влияют на вычисление ускорения for(var i = 0; i < star.length; i++){ star[i].x += star[i].vx; star[i].y += star[i].vy; } // выводим на экран Draw(); }

Здесь уже проведены небольшие оптимизации, и dt принял за 1, поэтому исключил из операций умножения.

Ну и долгожданный запуск таймера:

Timer = setInterval(Step, 20);

Минусы

Сложность алгоритма растёт экспоненциально, поэтому увеличение объектов влечёт заметное проседание FPS. Решение с помощью Quad tree или других алгоритмов не поможет, но в реальных играх не объекты взаимодействуют по принципу каждый с каждым.

Тестирование производилось на машине с процессором Intel Pentium с частотой 2.4 GHz. При 1000 объектов с интервал вычисления уже превышал 20 мс.

Использование

В качестве силы можно использовать суперпозицию разных сил в (3). Например, тягу двигателя, силу сопротивления грунта и воздуха, а также соударения с другими объектами. Алгоритм можно легко расширить на три измерения, достаточно ввести z аналогично x и y .

Этот алгоритм был написан мною ещё в 9 классе на паскале, а до текущего момента переложен на все языки, которые я знаю просто потому, что могу в качестве личного Hello World’a. Даже в терминале.

Также данный алгоритм можно использовать для другого фундаментального взаимодействия - электромагнитного (G → k, m → q). Я использовал этот алгоритм для построения линий магнитной индукции системы зарядов, но об этом в другой статье.

Всем спасибо за прочтение. Надеюсь данная статья Вам немного поможет в создании собственных игр.

) других программ.

Все физические движки условно делятся на два типа: игровые и научные .

  • Первый тип используется в компьютерных играх как компонент игрового движка . В этом случае он должен работать в режиме реального времени , то есть воспроизводить физические процессы в игре с той же самой скоростью, в которой они происходят в реальном мире. Вместе с тем от игрового физического движка не требуется точности вычислений. Главное требование - визуальная реалистичность, - и для его достижения не обязательно проводить точную симуляцию. Поэтому в играх используются очень сильные аппроксимации, приближенные модели и другие программные «трюки».
  • Научные физические движки используются в научно-исследовательских расчётах и симуляциях , где крайне важна именно физическая точность вычислений. Вместе с тем скорость вычислений не играет существенной роли.

Современные физические движки симулируют не все физические законы реального мира, а лишь некоторые, причём с течением времени и прогресса в области информационных технологий и вычислительной техники список «поддерживаемых» законов увеличивается. На начало 2010 года физические движки могут симулировать следующие физические явления и состояния:

  • динамика абсолютно твёрдого тела
  • динамика деформируемого тела
  • динамика жидкостей
  • динамика газов
  • поведение тканей
  • поведение верёвок (тросы, канаты и т.д.)

В августе 2009 года англоязычный журнал Game Developer (англ. ), посвящённый разработке компьютерных игр, опубликовал статью о современных игровых движках и их использовании. Согласно данным журнала, наиболее популярным среди разработчиков является движок nVidia PhysX , который занимает 26,8% рынка. На втором месте находится Havok , который занимает 22,7% рынка. Третье место принадлежит движку Bullet Physics Library (10,3%), а четвёртое - Open Dynamics Engine (4,1%).

Использование Описание

Физический движок позволяет создать некое виртуальное пространство, которое можно наполнить телами (виртуальными статическими и динамическими объектами), и указать для него некие общие законы взаимодействия тел и среды, в той или иной мере приближенные к физическим, задавая при этом характер и степень взаимодействий (импульсы, силы, и т. д). Собственно расчёт взаимодействия тел движок и берёт на себя. Когда простого набора объектов, взаимодействующих по определённым законам в виртуальном пространстве, недостаточно в силу неполного приближения физической модели к реальной, возможно добавлять (к телам) связи. Рассчитывая взаимодействие тел между собой и со средой, физический движок приближает физическую модель получаемой системы к реальной, передавая уточнённые геометрические данные средству отображения (рендереру).

Тело

Тело (англ. body ) - объект игровой физики, который определяется:

  • его формой (есть простые формы: шар, куб, цилиндр; есть сложные формы, набор которых в разных движках может различаться);
  • неким набором параметров (масса, упругость, коэффициент трения, инертность по осям).
Связь

Связь (соединение; англ. joint ) - ограничения объектов игровой физики, каждое из которых может накладываться на одно или два тела.

Взаимодействие

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

Известные физические движки Игровые проприетарные Игровые свободные Ныне несуществующие
  • NovodeX - физический движок, приобретённый компанией Ageia и преобразованный в PhysX.
  • Meqon - физический движок, приобретённый компанией Ageia и интегрированный в состав её движка PhysX.
  • Ipion Virtual Physics - физический движок, приобретённый компанией Havok и интегрированный в состав её движка Havok Physics;
  • Karma - коммерческий движок от ныне закрытой компании MathEngine, интегрирован в Unreal Engine 2.0/2.5 .
Другие
  • Open Physics Initiative - проект, инициированный компаниями AMD и Pixelux Entertainment по объединению Bullet Physics Library и Digital Molecular Matter , добавлении в новообразованный продукт поддержки OpenCL и DirectCompute и оптимизации результирующего движка для выполнения на графических процессорах Radeon .
См. также Примечания Ссылки
  • Physics Engine - общая информация о физических движках на сайте GameDev.ru
  • Программирование игр: Физика - список терминов и понятий, относящихся к программированию физических движков на сайте GameDev.ru
  • Lentyay Урок физики для геймера (часть 1) - Введение . gamesector.org (23 октября 2006 года). Архивировано
  • Lentyay Урок физики для геймера (часть 2) - AGEIA PhysX . gamesector.org (2 ноября 2006 года). Архивировано из первоисточника 16 февраля 2012. Проверено 7 июля 2009.
  • Lentyay Урок физики для геймера (часть 3) - Физика на видеокартах . gamesector.org (16 мая 2007 года). Архивировано из первоисточника 16 февраля 2012. Проверено 7 июля 2009.
  • Andretti Эволюция воды в играх . ITC.ua (3 декабря 2007 года). - Подборка скриншотов из компьютерных игр, которая демонстрирует развитие визуализации воды. Архивировано из первоисточника 16 февраля 2012. Проверено 2 августа 2009.
  • Zogrim Popular Physics Engines comparison: PhysX, Havok and ODE (англ.) . PhysXInfo.com (7 декабря 2009 года). Архивировано из первоисточника 16 февраля 2012. Проверено 11 марта 2010.
  • Наталья Зайцева Разработка физической модели разбиения твердого тела для игрового движка . Intel Software Network (6 октября 2009 года). Архивировано из первоисточника 16 февраля 2012. Проверено 21 марта 2010.

Wikimedia Foundation . 2010 .

  • Чавчавадзе, Илья Григорьевич
  • Профессионализм
Смотреть что такое "Физический движок" в других словарях:

    Karma (физический движок) - У этого термина существуют и другие значения, см. Karma. Karma Физический движок … Википедия

    Физический ускоритель - Физический процессор (англ. Physics Processing Unit англ. PPU, «физический ускоритель», «ускоритель физики») устройство, чип, выделенный специализированный процессор, предназначенный для обработки физических вычислений преимущественно в… … Википедия

    Движок Unreal - Unreal Engine Тип Игровой движок Разработчик Epic Games, Inc. Написана на C++, UnrealScript ОС … Википедия

Физический движок (Physics Engine) - программа (или подпрограмма), моделирующая тот или иной физический процесс.

Рассмотрим понятие физический движок на классическом примере движка, моделирующего физику твердых тел на основе импульсов (впрочем, большая часть сказанного относится и к другим методам). Фактически, все, что требуется от такого движка - уметь выполнять запросы вида «добавить тело», «симулировать шаг времени», «взять позицию/ориентацию данного тела» и другие. Рассмотрим подробнее основную его функцию «симулировать шаг времени», выполняемую каждый кадр в реалтайм приложении, например, в . В каждом кадре мы прежде всего обязательно должны найти все потенциально взаимодействующие пары тел. Этот шаг называется . Чтобы сузить количество пар для проверок, применяются алгоритмы:

  • - один из самых легко реализуемых, но в то же время достаточно эффективных алгоритмов.
  • QuadTree / Octree и их расширения, такие, как loose tree - алгоримы по разбиению пространства (Spacial Hashing). Основываются на сужении круга поиска контактирующих тел в рамках суженной области пространства, например, нет смысла пытаться искать контакт чайника, стоящего на столе с автомобилем, стоящим под окном.
  • Множество алгоритмов, основывающихся на так называемом эффекте , который можно толковать как «временная когерентность». Суть состоит в том, что тела от кадра к кадру обычно сдвигаются на малое расстояние, и тела, которые на данной итерации находятся далеко друг от друга, на следующей наверняка будут находиться незначительно ближе.

Далее, найдя пары потенциально пересекающихся тел, вступает в силу - стадия, на которой движок должен находить точные данные о контакте тел - находить точки контакта, нормали и глубины проникновения. Основные алгоритмы указаны по ссылке.

Следующая стадия - разрешение найденных контактов и других типов связей, которым занимается

Завершающая стадия - интегрирование позиции. То есть, собственно, смещение всех тел сцены. Стадия не очень сложная, выбор алгоритмов её реализации невелик, но зато они отлично работают - интеграторы по Эйлеру, Ньютону и Рунге-Кутта.

Также сквозь все стадии «просачиваются» такие функции, как коллбэки (callbacks) на события, например, вызов некоторой функции, при каждом касания чайника со столом. И фризинг (freezing) или, как его ещё называют, sleeping тел - алгоритмы, «выкидывающие» из просчета слишком долго находящиеся в покое или, например, невидимые игроку тела.

Что такое Физический движок (Physics Engine)?

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

Cry Engine 3

В первую очередь обратите внимание на то, что далеко не каждый физический движок доступен всем пользователям. Некоторые разработчики игр создают собственный, для личного использования, после чего не дают к нему доступ никому другому. Такие движки рассматриваться не будут - здесь речь пойдет о том, что вы можете использовать для создания игры, будучи так называемой третьей стороной. Первый вариант, который будет у всех на слуху в первую очередь - это Cry Engine 3. Это очень мощный физический движок, который позволит вам создать невероятную игру, однако при этом существуют различные варианты использования. Если вы не хотите тратиться, то вы можете использовать бесплатную версию - в ней будут доступны все функции, однако при этом вы не сможете распространять или продавать свою игру, то есть такой вариант подходит для домашнего использования. Существует и два платных варианта - один подразумевает выдачу двадцати процентов прибыли с игр разработчикам движка, а второй - покупку лицензии. И именно поэтому данный вариант не так популярен, как многие другие - он очень дорогой.

Если же вам не хочется тратить большие деньги на предыдущий вариант, то вам стоит обратить внимание на этот. Unreal Engine 3 - это лучший на данный момент движок по соотношению цены и качества. Вы можете приобрести права на его использование относительно недорого, при этом с его помощью вы сможете создавать полномасштабные компьютерные игры, как это делают крупные компании-разработчики, известные во всем мире. У этого движка имеются самые различные достоинства, такие как мультиплатформенность, отличная поддержка, простота и понятность. Таким образом, каждый человек, который приобретает данный движок, сможет без проблем разработать прекрасную игру, если у него для этого есть способности. Великолепную базу для этого предоставит вам Unreal Engine 3.

Havok

Если говорить о крупных проектах, то обязательно стоит затронуть еще и Havok - движок, который своим появлением сильно изменил Сейчас на нем создано уже около 200 компьютерных игр крупных студий, а инди-разработок было еще больше. Данный движок чаще всего используется для шутеров от первого или третьего лица, но иногда можно встретить и крупные проекты других жанров, например, «Старкрафт 2» среди стратегий, Super Smash Bros. среди платформеров и так далее. Естественно, приобретение его будет стоить достаточно внушительной суммы, но возможности, которые он перед вами открывает, - просто огромны. Так что если вы не являетесь независимым разработчиком с низким бюджетом, то вы можете приобрести этот движок - он сделает вашу игру просто великолепной.

Unity 3D

Что ж, пришло время перейти от крупных движков к чему-то не такому масштабному. Существует большое количество недорогих решений для двухмерных игр, но вот третье измерение по приемлемой цене спешат добавить не все. Именно поэтому движок Unity 3D на сегодняшний день является крайне популярным, так как предлагает недорогой доступ к трехмерному миру. Уже с 2009 года этот проект является ведущим среди тех, которые были разработаны не крупнейшими корпорациями для таких же крупных проектов. Поэтому вам стоит обязательно обратить внимание на данный движок, если вы хотите разрабатывать именно трехмерный проект - покупка лицензии обойдется вам недорого, а за эти деньги вы получите просто огромный объем материалов, простой доступ к публикации готовых проектов и многое другое.

DMM

Современные движки очень часто уделяют серьезное внимание реалистичности повреждений, которые наносятся миру, персонажу, средству передвижения и так далее. Однако если вы ищете недорогое решение для игры, в которой основной составляющей будет именно динамика деформируемого тела, то вам стоит обратить внимание на данный движок. Он называется DMM, и с его помощью вы сможете воспроизводить крайне реалистичную модель повреждений, независимо от того, каким будет их характер. Полное название движка - Digital Molecular Matter, и из него люди, знающие английский язык, могут уже понять, что именно деформации и будут является его главной фишкой. Если у вас нет денег на крайне дорогой современный движок, который предложит вам деформацию как одну из многих составляющих, или же вы хотите создать проект, в котором основное внимание будет уделено именно повреждениям и их реалистичности, то этот движок идеально для вас подойдет.

GameMaker

Ну и в завершение стоит обратить внимание на движок, который сильно отличается от всех остальных Дело в том, что на нем вам вообще не нужно будет программировать, так как все основные команды здесь заменены конкретными заранее прописанными действиями. Естественно, этих действий имеется ограниченное количество, но их все же довольно много, так что вы сможете создавать игры, вообще не задумываясь о том, что вам стоило бы выучить язык программирования. Вы прекрасно справитесь и без него, а если приобретете лицензию, то сможете использовать больше возможностей, а также публиковать свои собственные игры независимо.