Жигули. Физика. Боль
С персонажем разобрался — ходит, бегает, руки почти готовы. Пора за машину. Игра же не про прогулки по обочине.
Сразу скажу: встроенный VehicleBody из Godot я выкинул. Он мыльный. Машина кренится как маршрутка на повороте, переворачивается на ровном месте, подвеска живёт своей жизнью. Помучился два вечера и решил — буду делать сам.
Взял обычный RigidBody3D и написал свою физику. Колёса через RayCast3D — пускаю луч вниз, нахожу землю, считаю подвеску руками. Двигатель, коробка, тормоза — всё отдельно. Звучит как велосипед, но зато я понимаю что где крутить.
Что внутри
Машина собрана из модулей. Каждый — отдельный скрипт:
MyCar — корень сцены. Посадка, высадка, камера, руль мышкой.
MyCarPhysics — колёса на raycast-ах, подвеска, руль, тормоза, ручник.
MyCarEngine — двигатель. Обороты, газ, запуск с ключа.
MyCarTransmission — коробка. N, R, 1–4. Передаточные числа.
MyCarDebug — панель поверх экрана. Показывает RPM, передачу, ручник, ошибки. Штука дико полезная, без неё вообще не понять что происходит.
Дерево сцены:


Что работает
Садишься в машину — камера переключается на салон. Руль мышкой, газ W, тормоз S. Двигатель заводится на Q, слышно как обороты растут. Передачи переключаются стрелками — N, R, 1–4. Ручник на пробел. Фары, поворотники, аварийка — всё работает. Дебаг-панель пишет RPM, передачу, газ, какие колёса на земле.
Движок считает обороты:
Сердце двигателя. Обороты считаются от скорости машины и передачи. Если колёса не крутятся — RPM растёт только от газа до отсечки. Если машина едет — обороты привязаны к скорости через передаточные числа. Никаких левых таблиц, чистая математика.
Физика ищет землю raycast-ами и считает подвеску:
Где затык
Она не едет.
Серьёзно. Двигатель запущен, обороты растут, передача воткнута, колёса землю видят — а машина стоит. Или дёргается на месте и глохнет. Силу я прикладываю через apply_force к точке контакта колеса. Подозреваю что где-то путаю вектор направления, либо traction обрезает всё в ноль, либо точку приложения считаю не оттуда.
Дебаг-панель показывает: RPM 2500, Force 150, колёса на земле 4/4, а скорость 0.0. Два вечера ковыряю эту математику, меняю знаки, переставляю векторы — пока глухо.
Если кто писал физику машины на RigidBody3D с raycast-колёсами — подскажите. Особенно интересно: в какую сторону у вас forward (я беру -basis.z), как правильно apply_force к точке контакта, и как считать traction от силы подвески.
Дальше: сцепление, расход топлива по-человечески, поломки, ремонт. Но сначала надо чтобы оно просто поехало вперёд. Я выдохся, нужен свежий взгляд.


