Что происходит в данной простейшей модели? Известные физические движки.

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

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

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

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

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

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

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

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

Используются не как отдельные самостоятельные программные продукты , а как составные компоненты (подпрограммы) других программ.

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

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

Современные физические движки симулируют не все физические законы реального мира, а лишь некоторые, причём с течением времени и прогресса в области информационных технологий и вычислительной техники список «поддерживаемых» законов увеличивается. На начало 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 .
См. также Напишите отзыв о статье "Физический движок"Примечания Ссылки
  • - общая информация о физических движках на сайте GameDev.ru
  • - список терминов и понятий, относящихся к программированию физических движков на сайте GameDev.ru
  • Lentyay. . gamesector.org (23 октября 2006 года). Проверено 7 июля 2009. .
  • Lentyay. . gamesector.org (2 ноября 2006 года). Проверено 7 июля 2009. .
  • Lentyay. . gamesector.org (16 мая 2007 года). Проверено 7 июля 2009. .
  • Andretti. . ITC.ua (3 декабря 2007 года). - Подборка скриншотов из компьютерных игр, которая демонстрирует развитие визуализации воды. Проверено 2 августа 2009. .
  • Zogrim. (англ.) . (7 декабря 2009 года). Проверено 11 марта 2010. .
  • Наталья Зайцева. . Intel Software Network (6 октября 2009 года). Проверено 21 марта 2010. .
Отрывок, характеризующий Физический движок– Vous ne daignez pas descende jusqu"a moi, vous… [Вы не удостаиваете снизойти до брака со мною, вы…] – заплакав, сказала Элен.
Лицо стало утешать ее; Элен же сквозь слезы говорила (как бы забывшись), что ничто не может мешать ей выйти замуж, что есть примеры (тогда еще мало было примеров, но она назвала Наполеона и других высоких особ), что она никогда не была женою своего мужа, что она была принесена в жертву.
– Но законы, религия… – уже сдаваясь, говорило лицо.
– Законы, религия… На что бы они были выдуманы, ежели бы они не могли сделать этого! – сказала Элен.
Важное лицо было удивлено тем, что такое простое рассуждение могло не приходить ему в голову, и обратилось за советом к святым братьям Общества Иисусова, с которыми оно находилось в близких отношениях.
Через несколько дней после этого, на одном из обворожительных праздников, который давала Элен на своей даче на Каменном острову, ей был представлен немолодой, с белыми как снег волосами и черными блестящими глазами, обворожительный m r de Jobert, un jesuite a robe courte, [г н Жобер, иезуит в коротком платье,] который долго в саду, при свете иллюминации и при звуках музыки, беседовал с Элен о любви к богу, к Христу, к сердцу божьей матери и об утешениях, доставляемых в этой и в будущей жизни единою истинною католическою религией. Элен была тронута, и несколько раз у нее и у m r Jobert в глазах стояли слезы и дрожал голос. Танец, на который кавалер пришел звать Элен, расстроил ее беседу с ее будущим directeur de conscience [блюстителем совести]; но на другой день m r de Jobert пришел один вечером к Элен и с того времени часто стал бывать у нее.
В один день он сводил графиню в католический храм, где она стала на колени перед алтарем, к которому она была подведена. Немолодой обворожительный француз положил ей на голову руки, и, как она сама потом рассказывала, она почувствовала что то вроде дуновения свежего ветра, которое сошло ей в душу. Ей объяснили, что это была la grace [благодать].
Потом ей привели аббата a robe longue [в длинном платье], он исповедовал ее и отпустил ей грехи ее. На другой день ей принесли ящик, в котором было причастие, и оставили ей на дому для употребления. После нескольких дней Элен, к удовольствию своему, узнала, что она теперь вступила в истинную католическую церковь и что на днях сам папа узнает о ней и пришлет ей какую то бумагу.
Все, что делалось за это время вокруг нее и с нею, все это внимание, обращенное на нее столькими умными людьми и выражающееся в таких приятных, утонченных формах, и голубиная чистота, в которой она теперь находилась (она носила все это время белые платья с белыми лентами), – все это доставляло ей удовольствие; но из за этого удовольствия она ни на минуту не упускала своей цели. И как всегда бывает, что в деле хитрости глупый человек проводит более умных, она, поняв, что цель всех этих слов и хлопот состояла преимущественно в том, чтобы, обратив ее в католичество, взять с нее денег в пользу иезуитских учреждений {о чем ей делали намеки), Элен, прежде чем давать деньги, настаивала на том, чтобы над нею произвели те различные операции, которые бы освободили ее от мужа. В ее понятиях значение всякой религии состояло только в том, чтобы при удовлетворении человеческих желаний соблюдать известные приличия. И с этою целью она в одной из своих бесед с духовником настоятельно потребовала от него ответа на вопрос о том, в какой мере ее брак связывает ее.
Они сидели в гостиной у окна. Были сумерки. Из окна пахло цветами. Элен была в белом платье, просвечивающем на плечах и груди. Аббат, хорошо откормленный, а пухлой, гладко бритой бородой, приятным крепким ртом и белыми руками, сложенными кротко на коленях, сидел близко к Элен и с тонкой улыбкой на губах, мирно – восхищенным ее красотою взглядом смотрел изредка на ее лицо и излагал свой взгляд на занимавший их вопрос. Элен беспокойно улыбалась, глядела на его вьющиеся волоса, гладко выбритые чернеющие полные щеки и всякую минуту ждала нового оборота разговора. Но аббат, хотя, очевидно, и наслаждаясь красотой и близостью своей собеседницы, был увлечен мастерством своего дела.
Ход рассуждения руководителя совести был следующий. В неведении значения того, что вы предпринимали, вы дали обет брачной верности человеку, который, с своей стороны, вступив в брак и не веря в религиозное значение брака, совершил кощунство. Брак этот не имел двоякого значения, которое должен он иметь. Но несмотря на то, обет ваш связывал вас. Вы отступили от него. Что вы совершили этим? Peche veniel или peche mortel? [Грех простительный или грех смертный?] Peche veniel, потому что вы без дурного умысла совершили поступок. Ежели вы теперь, с целью иметь детей, вступили бы в новый брак, то грех ваш мог бы быть прощен. Но вопрос опять распадается надвое: первое…
– Но я думаю, – сказала вдруг соскучившаяся Элен с своей обворожительной улыбкой, – что я, вступив в истинную религию, не могу быть связана тем, что наложила на меня ложная религия.
Directeur de conscience [Блюститель совести] был изумлен этим постановленным перед ним с такою простотою Колумбовым яйцом. Он восхищен был неожиданной быстротой успехов своей ученицы, но не мог отказаться от своего трудами умственными построенного здания аргументов.
– Entendons nous, comtesse, [Разберем дело, графиня,] – сказал он с улыбкой и стал опровергать рассуждения своей духовной дочери.

Элен понимала, что дело было очень просто и легко с духовной точки зрения, но что ее руководители делали затруднения только потому, что они опасались, каким образом светская власть посмотрит на это дело.
И вследствие этого Элен решила, что надо было в обществе подготовить это дело. Она вызвала ревность старика вельможи и сказала ему то же, что первому искателю, то есть поставила вопрос так, что единственное средство получить права на нее состояло в том, чтобы жениться на ней. Старое важное лицо первую минуту было так же поражено этим предложением выйти замуж от живого мужа, как и первое молодое лицо; но непоколебимая уверенность Элен в том, что это так же просто и естественно, как и выход девушки замуж, подействовала и на него. Ежели бы заметны были хоть малейшие признаки колебания, стыда или скрытности в самой Элен, то дело бы ее, несомненно, было проиграно; но не только не было этих признаков скрытности и стыда, но, напротив, она с простотой и добродушной наивностью рассказывала своим близким друзьям (а это был весь Петербург), что ей сделали предложение и принц и вельможа и что она любит обоих и боится огорчить того и другого.
По Петербургу мгновенно распространился слух не о том, что Элен хочет развестись с своим мужем (ежели бы распространился этот слух, очень многие восстали бы против такого незаконного намерения), но прямо распространился слух о том, что несчастная, интересная Элен находится в недоуменье о том, за кого из двух ей выйти замуж. Вопрос уже не состоял в том, в какой степени это возможно, а только в том, какая партия выгоднее и как двор посмотрит на это. Были действительно некоторые закоснелые люди, не умевшие подняться на высоту вопроса и видевшие в этом замысле поругание таинства брака; но таких было мало, и они молчали, большинство же интересовалось вопросами о счастии, которое постигло Элен, и какой выбор лучше. О том же, хорошо ли или дурно выходить от живого мужа замуж, не говорили, потому что вопрос этот, очевидно, был уже решенный для людей поумнее нас с вами (как говорили) и усомниться в правильности решения вопроса значило рисковать выказать свою глупость и неумение жить в свете.

Я начал заниматься разработкой своего физического движка для alternativa3d. Решил написать в этой мини-статье варианты реализации движка. Для того, чтобы написать свой движок, в первую очередь вам может понадобиться учебник 9-ого класса. Ищем ближайшую школу, и покупаем учебник физики 9-ого класса за 9 смаженок))) Потом, я покачал всяких cpp, python сорсов, книжек по реализации 3д физ. движка. Посмотрел в это всё дело. И пришёл к выводу, что всё просто))) На самом деле тут вообще ничего сложного нету. Конечно, признаюсь, перед тем как я садился делать его, мне было немного не по себе. Как-то это всё масштабно смотрелось… Но… “глаза боятся, руки делают”!) Считаю, что далее изложенный материал является очень полезным и дает представление о том, как реализовывать физический движок. Для реализации движка вам нужно поэтапно определиться с методами реализации:

Rigid-body(RBE) или mass-aggregade(MAE, совокупность масс) движок?

RBE рассматривает объекты как целое. Он просчитывает движение и поворот объекта в целом.
MAE рассматривает объект как совокупность масс. Например, куб можно рассмотреть как совокупность 8 масс в каждом его углу, связанных между собой.
Логично предположить, что MAE легче вычисляется, т.к. ему не нужно знать, что такое поворот, т.к. работают 8 масс, просчет движения объекта сводится к просчету линейного движения каждой массы, в результате которого появляется поворот.
Так же следует отметить, что для превращения MAE в RBE можно просто добавить повороты.

Как будут взаимодействовать объекты?

Тут есть три пути:
1) Проверять каждого с каждым(самый простой выход). Но тут могут возникать вопросы в плане реализации. Например, одно взаимодействие может быть затронуто другим, и это может существенно сказаться на результате.
2) Дополнить первый вариант проверкой всех взаимодействий друг с другом и конечный результат вычислений присваивать всем объектам одновременно. Довольно сложный путь решения данного вопроса – очень сложная математика, порой может быть даже невозможная) Но, тем не менее, как вариант его рассматривать можно.
3) Не использовать Ньютона, создать свои собственные законы поведения или просто псевдо-физику

Сила или импульс?

Наверняка вы видели реализацию в 3д движках, когда объекты подёргиваются, хотя должны просто лежать и не двигаться. Это очень часто происходит в движке, в котором используются импульсы. Конечно, данный вариант реализовывается легче и работает быстрее, но более надежный вариант – использовать силы(механика, учебник 9 класса). Почему всё-таки объекты могут подергиваться? Возьмем простой пример. Лежит книга на столе…
а) В импульсном варианте. Она остается лежать на столе, благодаря многим мелким коллизиям. И с каждым кадром, книга будет получать эти значения коллизий, именно поэтому книга может слегка “вибрировать”.
б) В силовом варианте. Она просто поддерживается постоянной силой. В данном случае, силой реакции опоры.

Так же реализацию можно разделить на след. этапы(надеюсь логично):
1) Реализовать простенькую систему частиц. Векторная математика. Законы движения.
2) MAE, подключение мелких масс к любому типу объектов, и их соединение
3) Rigid-Body Physics, прикручиваем повороты
4) Collision Detection
5) Выбираем физику взаимодействия
6) В будущем, дополняем всякими фишками.

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

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

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

Современные физические движки симулируют не все физические законы реального мира, а лишь некоторые, причём с течением времени и прогресса в области информационных технологий и вычислительной техники список «поддерживаемых» законов увеличивается. На начало 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 ОС … Википедия

  • Алгоритмы
  • Вас интересуют игры? Хотите создать игру но не знаете с чего начать? Тогда вам сюда. В этой статье я рассмотрю простейший физический движок, с построения которого можно начать свой путь в 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 * dt; star[i].vy += ay * dt; } // координаты меняем позже, потому что они влияют на вычисление ускорения for(var i = 0; i < star.length; i++){ star[i].x += star[i].vx * dt; star[i].y += star[i].vy * dt; } // выводим на экран Draw(); }

    Ну и долгожданный запуск таймера:
    var dt = 0.02; // шаг вычисления timer = setInterval(Step, dt * 1000);

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

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

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

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

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

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

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