Enduro: GPT нашёл 25 багов, а мотоцикл перестал дёргаться
Вечер второго дня. Я наконец сел с геймпадом, мотоцикл на месте трясло и уносило вбок, Claude пробовал семь способов, а починил Codex с первой попытки. Потом он же прочитал весь код и выдал список из 25 находок. И да, мотоцикл теперь бело-синий, как мой.
Утром я радовался, что у нас есть мотоцикл. Вечером сел с геймпадом и понял, что радоваться рано. Мотоцикл стоит на месте и мелко трясётся, как будто ему холодно, и при этом медленно уползает вбок. Разгон вялый, руки райдера висят в воздухе рядом с рулём, нога в землю не упирается. Обычный первый прокат.
Дальше был вечер, о котором стоит рассказать, потому что в нём видно, как дрим-тим работает на самом деле, а не в резюме.
Сначала обратная связь
Я поиграл десять минут и надиктовал: руль и тело на левый стик, камера на правый; разгон слабый; руки на руль; нога на землю, когда стоим. Claude сделал всё за полчаса: автосцепление по скорости, честная кривая курка газа, момент побольше, руки на руле через обратную кинематику, нога на земле по стороне кости. Заодно переделал подвеску по схеме мотокросса: прогрессивная пружина, разное демпфирование на сжатие и отбой, ограничитель, чтобы после прыжка мотоцикл не скакал как мяч.
Потом райдер перестал быть картинкой и стал массой: девяносто килограммов на ногах-пружинах, сто килограммов рама. Тут началось самое интересное.
Суета дёргающегося мотоцикла
Стоящий на месте мотоцикл качало по крену с частотой кадра и уносило вбок со скоростью 0,3 метра в секунду. Ввод нулевой. Никто ничего не трогает. Он просто едет боком.
Claude выписал в документ всё, что пробовал, по порядку. Убрал наклон на месте: амплитуда упала вдвое, дрейф остался. Добавил статическое трение шин: крен ±7°, дрейф остался. Убрал боковую инерцию райдера: ±4°. Угловое демпфирование: ±4°, дрейф 0,3. Пересчитал инерцию рамы и коэффициенты регулятора: ±0,6°, но скорость крена меняет знак каждый кадр, и мотоцикл всё равно ползёт. Ослабил импульс трения: без изменений. Седьмая попытка, замена модели шины, не применилась из-за ошибки в скрипте.
И вот здесь сработало правило, которое они сами себе придумали в этот же вечер: две попытки, и передаёшь задачу второму с полной картиной. Claude собрал документ: устройство рамы, подвески, шин, регулятора, показания зонда с числами за восемь секунд, что пробовал, гипотеза, критерий приёмки. И отдал Codex.
Диагноз с первой попытки
Codex код не запускал, он его читал. И нашёл: боковое «статическое трение» считало остановку всех 95 килограммов за один подшаг трансмиссии, это одна двухсотсороковая секунды. А физический движок обновляет раму раз в кадр, одна шестидесятая. Плюс сила в контакте крутит раму, а не только толкает центр масс, значит эффективная масса в точке контакта сильно меньше. Итого импульс завышен примерно в четыре раза, скорость контакта перелетает через ноль, сила насыщается с обратным знаком, и получается цикл в два кадра. Регулятор крена его только подпитывает.
Решение: на малой скорости боковая сила идёт не от скорости, а от упругого прогиба шины с демпфером, как у настоящей резины, которая держит нагрузку стоя. Выше полутора метров в секунду плавно переходит в прежнюю модель увода. Коэффициенты ограничены по реальному кадру и эффективной массе с учётом инерции рамы.
Claude собрал, запустил зонд на восемь секунд: смещение 0,00, крен 0,0°, скорость крена 0,00, силы шин ноль без дребезга. Автотест: змейка ±23°, вилли, прыжок, посадка, без падений. Попытка первая из трёх, принята. Ревью Claude отдельно подтвердило диагноз: «завышен примерно в четыре раза, отсюда двухкадровый цикл».
Я тут ничего не делал. Я смотрел.
25 находок
Раз уж Codex так хорошо читает, я попросил его прочитать весь код. Статическое ревью, без запуска, с численной проверкой формул и сверкой спорных мест по исходникам движка. Результат: таблица на 25 строк с файлом, проблемой, последствием, способом починки и важностью. Плюс пять главных рекомендаций.
Из того, что мне понравилось:
- Ядро трансмиссии всегда шагает на одну двухсотсороковую, а число шагов округляется. На 90 кадрах в секунду ядро проживает 1,125 секунды за реальную секунду, на 144 кадрах 1,2. Переднее и заднее колесо живут в разном времени.
- Тормоз интегрируется так, что при определённых условиях создаёт вращение и энергию. Приведён расчёт: скорость колеса −0,26, потом +0,68, потом −1,12. Тормоз, который разгоняет колесо.
- Продольная реакция райдера включает гравитацию, поэтому в полёте с задранным носом появляется лишняя сила вверх и прыжок перестаёт быть баллистическим. Вот откуда «слишком высокие прыжки», а я грешил на подвеску.
- Наши 130 км/ч это не баг перевода единиц, а честная арифметика: множитель момента 1,5, передаточное число и полное отсутствие сопротивления воздуха.
- После посадки на заднее колесо мотоцикл держит вилли под 45° сам, без команды, потому что на земле ничто не возвращает тангаж.
- При поднятии мотоцикл телепортируется на 60 сантиметров вверх без проверки, есть ли там место. Можно поднять себя внутрь трамплина.
- Визуальный маятник при сжатии подвески опускает колесо вниз вместо вверх. Знак.
- И отдельной строкой: «в документе состояния написано, что ядро физики отсутствует, это противоречит коду». Он нашёл баг в документации.
Пять рекомендаций сводятся к одному: сначала согласовать время всей физики и убрать численные источники энергии, потом настраивать жёсткости, потом скорость и выход из вилли, и всё это проверять измеряемым прогоном на разных частотах кадров. Список лежит в репозитории, чинить будем завтра по порядку важности.
Мотоцикл теперь мой
Пока Codex читал код, он же успел две задачи по графике. Четырнадцать поз райдера с углами и целями для обратной кинематики. И перекраска по фото: я скинул снимки своего мотоцикла и экипировки, и через три итерации рендеров у нас бело-синий эндуро с жёлтой табличкой и фарой, райдер в тёмно-синем с оранжевым, белый шлем, гидратор на спине.

Он же теперь на карточке проекта. А в игре выглядит так:


Что дальше
Чинить по списку из 25. Потом видео: со следующего поста буду выкладывать короткие ролики «было и стало», их снимает тот же автотест, а в конце соберём один большой на YouTube. Сайт к видео уже готов, осталось наснимать.
Комментарии
Пока никто не написал. Будь первым.