Комментарии 36
Хорошая статья! А есть на примете открытые реализации физики в С++? Необязательно такие сложные как статье, можно и какие-нибудь простые 2дшные
Есть исходники демки Box2D для презентации: https://github.com/erincatto/box2d-lite
Или более математические статейки по физдвижкам, например вот: https://gamedev.ru/code/articles/?id=4706. Там же есть и исходники
Благодарю за статью, весьма доходчиво объяснили вещи, которые связывают столько "не любимых" студентами предметов как численное методу, физика.... Буду вашу статью приводить в пример своим программистам, которые рвутся осваивать unity и unreal engine, но терпеть не могут математику и физику )))))
Давно не играл в WoT, но люблю иногда залипнуть на Youtube в сборнике реплеев-багов, демонстрирующих "Просто его разные коллайдеры застревают по разные стороны других коллайдеров".
А динамика жидкости и газа? В играх обычно моделируют границу среды жидкость/газ и довольно коряво. Вид из далека на водную гладь, конечно, реалистичен, но волны и брызги...
Также гидростатику не соблюдают.
Про огонь и его распространение тоже хотелось бы узнать. В том же maincraft и teardown миры выгорают по разному.
Это прям отдельная и большая тема ) Газы/жидкости моделируют 2мя способами, насколько я знаю:
частицами. Много-много частиц взаимодействуют друг с другом. Самый распространенный подход в играх
разбиение пространства на кластеры и расчет поведения газа/жидкости в каждой ячейке
В minecraft/teardown я думаю все гораздо проще, там просто у вокселей (кубиков или что там) есть статус горит/не горит, и он распространяется на соседей с некоторым таймером
В научных и инженерных решателях ANSYS/COMSOL/ABAQUS используется метод конечных объёмов (эйлеров подход). Это означает, что строятся сетки, которые могут быть с очень большим количеством элементов в зависимости от требований моделей турбулентности.
Если не нужно инженерной точности, а чисто качественно показать процессы, то задачи эти не очень и сложны. Вот такие демки различных процессов я нашёл: Ten Minute Physics .
ну вы просто не впихнете вычисленя "реальной" воды в игру, иначе фпс будет 1, а то и ноль
Добавить ещё расчёт прочности объектов и играть можно будет только на супер-комьютерах.
Теперь, когда тела заняли свои новые позиции, нужно проверить не столкнулись ли они.
А как быть, если объект, например, пуля. И за 1/60 на позициях пули ни до, ни после интервала времени столкновения как бы и нет. Но в промежутке-то оно было - там стена стоит.
Вы статью-то читали?
Я-то статью читал. Только вот фрагмента
Уже из этого ограничения вытекают проблемы. Кажется что 1/60 секунды - это довольно маленькое время (17 миллисекунд, если быть точным), однако в мире физики может случиться многое. Например, пуля, летящая сквозь тонкую стенку. Один кадр она с одной стороны стенки, а следующий кадр уже с другой. С точки зрения дискретной физики между ними не было контакта и пуля летит дальше.
Справедливости ради обычно пули так в играх не делают, применяют трассировку луча. Или используют другие подходы в обнаружении столкновений (об этом позже).
я там не припомню. Стало быть, автор добавил апостериорно после моего вопроса.
Хорошая обзорная статья
Мне кажется важным отметить, что то, чем занимается резолвер некорректно называть выталкиванием, как и псевдо скоростями/ускорениями
Это именно что растаскивание, вне физики.
Кстати можно наблюдать забавный артефакт почти во всех современных движках.
Если сделать абсолютно упругий объект и убрать "трение среды", и кинуть его на "пол", то он начнет подскакивать как баскетбольный мячик, но будет делать это все выше и выше.
То есть энергия не сохраняется, но растет.
Это связано с тем, что в нижней точке объект чуть чуть проникает в пол, а ресолвер его вытягивает обратно. Таким образом объект с той же скоростью оказывается чуть выше, ему искуственно добавляют аналог потенциальной энергии.
И при каждом ударе она все добавляется и добавляется.
нее ) солвер сначала применяет обычные импульсы, чтобы тела разлетались. Если применять только их, то тела будут проникать друг в друга. Поэтому он добавляет еще и "псевдоимпульсы", направленные на то чтобы тела мгновенно "растолкнуть" друг из друга. Эти псевдоимпульсы направлены число на то чтобы тела не проникали друг в друга
Пример с прыгающим мячом - это старый подход, в котором вместо "псевдоимпульсов" применяются настоящие. Которые не только выталкивают, но и задают некоторую скорость. Из-за чего энергия растет
Псевдоимпульсы же не влияют на скорость, но влияют на псевдоскорость. Обычная скорость сохраняется от кадра к кадру, псевдоскосрость же обнуляется на следующем кадре
Мы говорим об одном и том же, Я просто предлагаю не называть это псевдоимпульсами, потому что это путает.
Да, действительно сначала считаются обычные перемещения, условно position = position + velocity * dt, потом коллизии (при коллизиях мы получаем данные о коррекциях и новые импульсы), потом эти коррекции добавляются к позиции объекта
Шарик прыгает выше не из-за того, что расстояние проникновения/выталкивания добавляется к вектору движения, а потому, что шарик оказывается выше с тем же вектором движения
ага, согласен. Но в играх за такой точностью уже никто не следит, и обычно эта проблема решается тем, что тела не абсолютно упруги и часть энергии всегда поглощается при столкновении, в итоге энергия системы точно не растет
Добрый день! Прекрасная статья. Могли бы еще сказать про аэрофизику в играх?
У меня телеге есть небольшой пост про физику самолета. Но там все сильно упрощено
Можно ссылку на оригинал? Физика твердого тела - это solid state physics, а rigid body dynamics-это теормех/механика твердого тела.
ээм.. оригинала нет. Физика твердого/мягкого тела - это общие понятия в игровой физике, вероятно к остальному миру физики это не особо применимо :)
к ... миру физики это не особо применимо
Ну почему же:
Что же тогда в английском языке такой проблемы нет? Не понимаю зачем придумывать свой набор определений, когда есть совершенно стандартный устоявшийся в обоих языках и не создают никаких неудобств. Если кто-то давно неправильно перевел термины, то это не значит, что их нужно продолжать использовать. Есть ФТТ, она про физику/химию кристаллов, а есть механика твердого тела, она как раз про теормех.
Какой сейчас самый продвинутый физический движок в играх?
Спасибо, интересно. А есть какая-то инфа по движкам с "нереальной" физикой: порталы, искривление пространства. Из последних игр по таким принципам - Viewfinder.
А почему в последнем примере в конце ролика ткань продолжает нереалистично соприкасаться сама с собой и вырождается в тонкие линии в местах соприкосновения? Как будто наэлектризована. Это баг или фича?
Как работает физика в играх