Значительно обновлена демка физики автомобиля на Dagon, которая отныне называется Chillwave Drive. Трение колес теперь моделируется на чистых силах вместо встроенных джоинтов Newton, что сделало симуляцию более точной и стабильной. При движении используется динамическое трение (продольное и поперечное) на основе формул Pacejka ’98, при остановке — статическое, препятствующее боковому скольжению машины на склоне. Улучшено управление с контроллера, также добавлена новая модель машины и шейдер неба с облаками и сменой дня и ночи.
Скачать готовую сборку демки под Windows можно тут.
В 2013-2017 годах я писал собственный физический движок, в котором LCP решается через систему неравенств для скоростей: каждое неравенство вводит в систему ограничение свободы для пары столкнувшихся тел, солвер итеративно решает столкновения путем корректировки скоростей. Это универсальный, но вычислительно недешевый метод, к тому же подверженный эффектам нестабильности. Импульсная физика хороша для движущихся тел, но не очень стабильна в состояниях покоя — тела часто дрожат, и для их «успокаивания» приходится вводить различные уловки и хаки, которые неизбежно вводят в систему ошибки, понижая точность симуляции.
В импульсных движках используется интегрирование Эйлера:
Где Δx — скорость частицы — интегрируется аналогичным образом на основе ускорения:
Таким образом, «физично» подействовать на частицу можно только через скорости и силы. Все ограничения в систему вводятся только через скорости — модифицировать позиции тел вручную нельзя, что делает импульсную физику в играх менее удобной для определенных геймплейных задач. Однако существует альтернативный подход на основе интегрирования Верле:
Из формулы получается, что для частицы не нужно хранить скорость, но нужна позиция с предыдущего шага интегрирования.
for (size_t i = 0; i < positions.length; i++)
{
Vector3f currentPos = positions[i];
positions[i] += (currentPos - oldPositions[i]) + freeFallAcceleration * (dt * dt);
oldPositions[i] = currentPos;
}
Метод Верле позволяет легко вводить в систему ограничения: чтобы их решить, нужно итеративно скорректировать позиции частиц. Например, в случае с веревкой — то есть, набором последовательно соединенных частиц — расстояние между ними делается таким, каким оно должно быть (то есть, позиции частиц корректируются так, чтобы расстояние между ними не увеличивалось и не уменьшалось):
Аналогичным образом разрешаются столкновения: для частиц вводится объемная оболочка (например, сфера), взаимопроникшие тела перемещаются в кратчайшем направлении так, чтобы их оболочки не пересекались. Алгоритмы проверки столкновений обычно дают необходимую для этого информацию — нормаль и глубину проникновения. Преимущество перед импульсным подходом в том, что для этого не нужно составлять систему для скоростей — вы можете напрямую корректировать позиции и, таким образом, легко реализовать любую модель столкновений.
Попытка написать для Dagon физику веревки на основе интегрирования Верле увенчалась успехом! Добавил даже поддержку столкновений с боксами. В скором времени выложу эту демку в публичный доступ. Не исключено и добавление веревки в качестве встроенного объекта в движок.
Записал видео обновленной демки с физикой автомобиля на движке Dagon: новая модель трения (формула Пасейки), поддержка звуков (используется движок SoLoud), множество мелких улучшений и багфиксов.
Демка с физикой автомобиля, которую я разработал в начале этого года для Patreon Sponsor Folder, теперь доступна на GitHub в репозитории https://github.com/gecko0307/vehicle-demo — с многочисленными улучшениями, которые я сделал за последние месяцы (в частности, появилась поддержка модели трения колес Pacejka Magic Formula). Пруф того, что на основе связки Dagon + Newton вполне можно написать гоночную игру. Как-нибудь, возможно, напишу подробную статью на эту тему.
Классный подарок на Новый год: на днях наконец-то вышел Newton 4. Скомпилировал, потестил — очень понравились производительность и точность в сценах с большим количеством тел, а также примеры с физикой автомобиля. К сожалению, пока нет C-интерфейса, поэтому невозможно написать биндинг для D, но, похоже, работа в этом направлении ведется (разработчики планируют использовать SWIG, либо собственный генератор API для произвольных языков).
Вышла новая версия движка Dagon. Главное нововведение в этом релизе — поддержка моделей в формате glTF (gltf+bin). glTF представляет собой текстовое описание трехмерной сцены на основе JSON, хранящее всю информацию, необходимую для ее отрисовки (граф, материалы, текстуры и т.д.). Главной особенностью glTF является лейаут, оптимизированный по скорости загрузки — для передачи в графические API данные из glTF практически не нужно декодировать или конвертировать, поэтому сцены загружаются очень быстро.
Также значительно улучшен загрузчик текстур в формате DDS. Список поддерживаемых пиксельных форматов расширился (в частности, 32- и 16-битными RGBA с плавающей запятой), появилась поддержка кубических карт и mip-уровней. К примеру, теперь стало возможно загружать кубические карты с предрассчитанными зеркальными лепестками (specular lobes) для разных уровней шероховатости. Декодирование неигровых форматов изображений (PNG, JPEG и др.) в Dagon теперь осуществляется при помощи библиотеки stb_image, что в разы ускорило загрузку ресурсов. Как бесплатный бонус — появилась поддержка формата PSD.
Добавлен новый эффект постобработки Depth of Field (расфокусированность) с реалистичным боке и настройками оптики. Исправлены некоторые баги постобработки и отложенных эффектов — в частности, устранен артефакт «черных точек».
На смену встроенному физическому движку dmech идет привязка к Newton Dynamics, реализованная как расширение dagon:newton (подключается к проекту как отдельная зависимость). Newton предоставляет отличный компромисс между производительностью и стабильностью симуляции, поддерживает все стандартные геометрические тела, а также поддержку физики для ландшафтов и произвольных объектов (автоматически генерирует выпуклые оболочки для мешей).
Экспериментирую с интеграцией Newton Dynamics — лучшего на сегодняшний день свободного физического движка с API для C. Специально для этого написал биндинг bindbc-newton.
Давно мечтал написать собственный автосимулятор, хотя бы простенький. Насколько я знаю, на D ничего подобного никто еще не делал, и вот вам proof-of-concept: с использованием dmech можно реализовать вполне сносную физику автомобиля с моделированием колес и подвески на основе лучей (raycast car).
Я, впрочем, не планирую создание полноценной гоночной игры, поэтому не стал моделировать реальные характеристики двигателя, тормозов и т.д. — автомобиль движется под действием двух сил на каждое колесо, продольной и боковой, основанных на взятых «с потолка» константах. В принципе, ничто не мешает сделать точные расчеты этих сил.
Демка использует модифицированную версию dmech, а также Dagon в качестве графического движка (опять-таки с модификациями, которые совсем скоро войдут в основной репозиторий — к примеру, реализованы тени и шейдерный бэкенд для материалов). Все зависимости включены в архив, кроме dlib 0.11.1. Прилагается сборка для Windows. Можете использовать демку в своих проектах (код доступен под лицензией Boost).
Доступна новая демонстрация работы dmech — на этот раз, на примере игровой кинематики (Character Controller) для игры от третьего лица. Персонаж умеет двигаться и прыгать, взаимодействуя со всеми физическими объектами и тримешем уровня.
Управление: Стрелки — поворот вправо-влево и движение вперед-назад; Пробел — прыжок.