Как стать автором
Обновить

Комментарии 36

Хорошая статья! А есть на примете открытые реализации физики в С++? Необязательно такие сложные как статье, можно и какие-нибудь простые 2дшные

Благодарю за статью, весьма доходчиво объяснили вещи, которые связывают столько "не любимых" студентами предметов как численное методу, физика.... Буду вашу статью приводить в пример своим программистам, которые рвутся осваивать unity и unreal engine, но терпеть не могут математику и физику )))))

спасибо ) что ж, более глубокие знания дают профит даже при использовании готовых движков

Давно не играл в WoT, но люблю иногда залипнуть на Youtube в сборнике реплеев-багов, демонстрирующих "Просто его разные коллайдеры застревают по разные стороны других коллайдеров".

мой любимый видос про физические глитчи - skate 3 )

Божественно :)

А динамика жидкости и газа? В играх обычно моделируют границу среды жидкость/газ и довольно коряво. Вид из далека на водную гладь, конечно, реалистичен, но волны и брызги...

Также гидростатику не соблюдают.

Про огонь и его распространение тоже хотелось бы узнать. В том же maincraft и teardown миры выгорают по разному.

Это прям отдельная и большая тема ) Газы/жидкости моделируют 2мя способами, насколько я знаю:

  • частицами. Много-много частиц взаимодействуют друг с другом. Самый распространенный подход в играх

  • разбиение пространства на кластеры и расчет поведения газа/жидкости в каждой ячейке

В minecraft/teardown я думаю все гораздо проще, там просто у вокселей (кубиков или что там) есть статус горит/не горит, и он распространяется на соседей с некоторым таймером

В научных и инженерных решателях ANSYS/COMSOL/ABAQUS используется метод конечных объёмов (эйлеров подход). Это означает, что строятся сетки, которые могут быть с очень большим количеством элементов в зависимости от требований моделей турбулентности.

Если не нужно инженерной точности, а чисто качественно показать процессы, то задачи эти не очень и сложны. Вот такие демки различных процессов я нашёл: Ten Minute Physics .

ну вы просто не впихнете вычисленя "реальной" воды в игру, иначе фпс будет 1, а то и ноль

Добавить ещё расчёт прочности объектов и играть можно будет только на супер-комьютерах.

я б поиграл!

Ну вот была Red Faction, практически единственная на моей памяти реализация разрушаемости. Как её оптимизировали, интересно.

Теперь, когда тела заняли свои новые позиции, нужно проверить не столкнулись ли они.

А как быть, если объект, например, пуля. И за 1/60 на позициях пули ни до, ни после интервала времени столкновения как бы и нет. Но в промежутке-то оно было - там стена стоит.

Вы статью-то читали?

Я-то статью читал. Только вот фрагмента

Уже из этого ограничения вытекают проблемы. Кажется что 1/60 секунды - это довольно маленькое время (17 миллисекунд, если быть точным), однако в мире физики может случиться многое. Например, пуля, летящая сквозь тонкую стенку. Один кадр она с одной стороны стенки, а следующий кадр уже с другой. С точки зрения дискретной физики между ними не было контакта и пуля летит дальше.

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

я там не припомню. Стало быть, автор добавил апостериорно после моего вопроса.

Нет ничего после выкладки не правил. Для пуль используется трассировка, либо continous collision detection. Он есть в статье вкратце

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

Если сделать абсолютно упругий объект и убрать "трение среды", и кинуть его на "пол", то он начнет подскакивать как баскетбольный мячик, но будет делать это все выше и выше.
То есть энергия не сохраняется, но растет.
Это связано с тем, что в нижней точке объект чуть чуть проникает в пол, а ресолвер его вытягивает обратно. Таким образом объект с той же скоростью оказывается чуть выше, ему искуственно добавляют аналог потенциальной энергии.
И при каждом ударе она все добавляется и добавляется.

нее ) солвер сначала применяет обычные импульсы, чтобы тела разлетались. Если применять только их, то тела будут проникать друг в друга. Поэтому он добавляет еще и "псевдоимпульсы", направленные на то чтобы тела мгновенно "растолкнуть" друг из друга. Эти псевдоимпульсы направлены число на то чтобы тела не проникали друг в друга

Пример с прыгающим мячом - это старый подход, в котором вместо "псевдоимпульсов" применяются настоящие. Которые не только выталкивают, но и задают некоторую скорость. Из-за чего энергия растет

Псевдоимпульсы же не влияют на скорость, но влияют на псевдоскорость. Обычная скорость сохраняется от кадра к кадру, псевдоскосрость же обнуляется на следующем кадре

Мы говорим об одном и том же, Я просто предлагаю не называть это псевдоимпульсами, потому что это путает.
Да, действительно сначала считаются обычные перемещения, условно position = position + velocity * dt, потом коллизии (при коллизиях мы получаем данные о коррекциях и новые импульсы), потом эти коррекции добавляются к позиции объекта

Шарик прыгает выше не из-за того, что расстояние проникновения/выталкивания добавляется к вектору движения, а потому, что шарик оказывается выше с тем же вектором движения

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

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

Добрый день! Прекрасная статья. Могли бы еще сказать про аэрофизику в играх?

Можно ссылку на оригинал? Физика твердого тела - это solid state physics, а rigid body dynamics-это теормех/механика твердого тела.

ээм.. оригинала нет. Физика твердого/мягкого тела - это общие понятия в игровой физике, вероятно к остальному миру физики это не особо применимо :)

к ... миру физики это не особо применимо

Ну почему же:

Вполне себе применимо :)
Вполне себе применимо :)

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

Какой сейчас самый продвинутый физический движок в играх?

Наверное самый продвинутый - PhysX, но самую крутая физика в играх как правило с кастомными физ движками..

Спасибо, интересно. А есть какая-то инфа по движкам с "нереальной" физикой: порталы, искривление пространства. Из последних игр по таким принципам - Viewfinder.

Честно говоря не знаю. Думаю это все хаками делается

А почему в последнем примере в конце ролика ткань продолжает нереалистично соприкасаться сама с собой и вырождается в тонкие линии в местах соприкосновения? Как будто наэлектризована. Это баг или фича?

Просто не настроена коллизия ткани самой с собой, в итоге она проникает через себя

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории