Я сделал это за сутки. Жигули, которые ведут себя как настоящие
Сутки без сна. Машина ожила.
Садишься через открытую дверь. Заводишь с ключа — стартер схватывает, двигатель оживает, слышно холостые. Снимаешь с ручника, трогаешься. Первая, вторая, третья — звук меняется с ростом оборотов, на переключении передач просадка, как на реальной коробке. Снижаешь скорость — мотор рычит по-другому. Врезался во что-то — есть звук удара. Глушишь — двигатель затихает как положено, не обрывается тупо. Выходишь.
Обходишь машину: открываешь любую дверь, капот, багажник — подходишь к каждой детали отдельно, жмёшь E. Всё по-честному.
По физике: трансмиссия считает момент, передаточные числа, сопротивление воздуха и качение. Обороты привязаны к скорости вращения колёс через текущую передачу, а не крутятся сами по себе. Пока обороты упираются в 6500 — это временно. Позже настрою отсечку ближе к реальным значениям: крутить до красной зоны можно будет, но недолго — движок скажет спасибо и сломается.
Под капотом настоящий мотор, под днищем — подвеска, кардан. Всё на своих местах. У меня в молодости была шестёрка, я не по видео на ютубе это делаю.
Расход топлива работает, зарядка аккумулятора тоже. Дальше — поломки и ремонт. По болтам. Как в гараже. Хардкорнее чем в My Summer Car.
Машина готова. Основа есть. Теперь навесное, мир побольше и можно играть.
Жигули. Физика. Боль
С персонажем разобрался — ходит, бегает, руки почти готовы. Пора за машину. Игра же не про прогулки по обочине.
Сразу скажу: встроенный 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 от силы подвески.
Дальше: сцепление, расход топлива по-человечески, поломки, ремонт. Но сначала надо чтобы оно просто поехало вперёд. Я выдохся, нужен свежий взгляд.


