-
Notifications
You must be signed in to change notification settings - Fork 0
Physics RU
🌐 English · Русский
В Nova реализован настоящий движок физики твёрдых тел — единый решатель на импульсах со связями (последовательные импульсы / PGS по манифолду контактов, с прогревом, трением, трением качения, упругостью, позиционной коррекцией split-impulse и засыпанием островов). Даёт правдоподобную гравитацию с углом падения, инерцией, качением, отскоком, вращением, устойчивыми стопками и естественным кувырканием — а не скриптовое падение.
Два главных переключателя уровня мира, оба задаются при создании мира (и редактируются в JSON — см. Формат мира):
Главный выключатель твёрдых объектов.
- Игрока (пузырь камеры) выталкивает из пола и любого коллайдера, так что сквозь них нельзя пройти или пролететь.
- Каждый меш может использовать быстрый AABB (бокс по мировым осям) или OBB — ориентированный бокс, плотно облегающий наклонённую форму (контакты бокс-бокс считаются полным 3D-тестом разделяющих осей).
- У каждого объекта свой флаг Collide; когда переключатель мира выключен, Collide у всех объектов принудительно выключается и блокируется.
Включает симуляцию:
- Игрок становится ходячим персонажем: гравитация тянет камеру вниз, она стоит на поверхностях, Space — прыжок, F1 переключает режим свободного полёта для постройки.
- Любой объект может включить Gravity — меши, примитивы, сферы, даже свет или платформа падают и ложатся на то, что под ними.
- Падающий шар сталкивается с реальной поверхностью, на которую падает — с настоящими треугольниками пирамиды / рампы / меша, а не с габаритным боксом — поэтому он скатывается по склону с настоящим импульсом (быстрее на крутом), доезжает до остановки на ровном и отскакивает по своей упругости. Падающий меш так же ложится на реальную поверхность под ним.
- Ящики лежат, скользят или опрокидываются на реальной поверхности — их не выбрасывает. Ящик, брошенный на рампу, ложится плашмя на склон и съезжает или скатывается по нему; его не выкидывает вбок (он сталкивается с настоящими треугольниками меша, а не с боксом). Скользит он или кувыркается — зависит от крутизны склона и трения: на пологом просто скользит, на крутой грани / будучи неустойчивым — переваливается через грань и катится с грани на грань — всё естественно из решателя.
- Всё сталкивается со всем, и ящики СТОПКУЮТСЯ. Ящики и шары сталкиваются в любых сочетаниях (ящик-ящик, шар-ящик, шар-шар), с учётом массы, так что башня из ящиков стоит устойчиво (без дрожи, крена и проваливания), а шар, влетевший в неё, разбрасывает башню — и затем вся куча успокаивается и засыпает вместе (как один остров).
- Трение качения — катящийся шар и кувыркающийся ящик замедляются и останавливаются, а не катятся вечно, при этом всё ещё скатываясь вниз по склону (гравитация сильнее малого сопротивления качению). Настраивается на каждый объект.
-
Упругость (Bounce / restitution) задаётся на весь мир (диалог создания) и на каждый объект:
0= мёртвая остановка,1= идеально упруго. На контакте упругости двух поверхностей комбинируются (среднее геометрическое), поэтому прыгучий шар на «мёртвом» полу ведёт себя иначе, чем на стене-«батуте». - Трение, масса и 3D-вращение — объекты теряют скорость на трении (Кулона + качения), тяжёлый объект сдвигается меньше (пер-объектная Mass), а удар не по центру заставляет тело кувыркаться — полное 3D-вращение с настоящим тензором инерции и кватернионной ориентацией без дрейфа.
- Симуляция дробится на под-шаги внутри, поэтому ведёт себя одинаково, рендерит ли терминал на 60 FPS или на нескольких, и имеет предохранители, чтобы ничего не улетало.
Каждый объект несёт свои настройки (редактируйте их вживую в инспекторе или в JSON мира):
- Collide — является ли объект твёрдым (действует только при включённой коллизии мира).
- Gravity — притягивается ли объект вниз (действует только при включённой гравитации мира; по умолчанию выкл).
- Collider — форма коллайдера меша: AABB (быстрый бокс по мировым осям) или OBB (ориентированный бокс, поворачивается вместе с объектом, лучше для наклонённых/вытянутых форм).
-
Mass — масса в импульсном солвере (деф
1); тяжёлый объект меньше сдвигается при столкновении. -
Bounce (restitution) — 0–1;
-1наследует значение мира. На контакте упругости двух поверхностей комбинируются. -
Friction — коэффициент трения Кулона (μ, деф
0.5). -
RollFric — сопротивление трения качения (деф
0.05), чтобы катящийся шар / кувыркающийся ящик успокаивался.
Физика объектов считается у authority/solo, а полное состояние каждого сдвинутого тела — позиция, ориентация и скорость — транслируется клиентам, которые экстраполируют и плавно подводят к нему, поэтому падение, качение и кувыркание объектов синхронно видят все (а не «замороженными» между обновлениями); гравитация самого игрока считается локально у каждого участника, поэтому ничего не рассинхронизируется. См. Мультиплеер.