Как сделать лидерборд в гонках

Лидерборд — это таблица, ранжирующая участников заезда по какому-либо критерию, например, по позиции на маршруте. Фактически, это логика гонок, которая определяет, кто побеждает, а кто проигрывает. Правильная реализация лидерборда — не такая уж простая задача, как может показаться, потому что она зависит от того, как игра хранит трассу, и во многом пересекается с кодом ИИ-оппонентов.

Если отталкиваться от методологии, которую я описал в статье Как сделать ИИ для гонок, то задача упрощается – можно использовать следующий подход, который показался мне весьма надежным и лишенным логических изъянов.

(далее…)

Как сделать ИИ для гонок

Пост является, по сути, продолжением статьи Как сделать простой автосимулятор.

Гонки — своего рода священный Грааль геймдева. Любительских гоночных игр исчезающе мало, даже простых и аркадных. А дело в том, что чисто технически «простых» гонок не существует — есть определенный минимум, которому они обязаны соответствовать, чтобы быть играбельными, и достижение этого — очень непростая задача. Если физика, как я уже отмечал в вышеупомянутой статье, не обязана быть чересчур навороченной и допускает довольно широкий разброс реалистичности, то с искусственным интеллектом особой свободы нет — виртуальные соперники обязаны изображать реальных водителей, причем, желательно, хороших. Это задача-минимум, и она же, как ни странно, задача-максимум, потому что игровому боту сильно лучше человека быть не положено.

Не будет преувеличением сказать, что ИИ — это самое сложное в играх. О графике в Интернете говорят очень много, о физике — намного меньше, а об игровом искусственном интеллекте почти не говорят. До этой территории мало кто добирается, а кто добирается — в основном, крупные студии — держат свои ноу-хау в секрете. Поэтому скажу честно: я не знаю, как написаны контроллеры оппонентов в коммерческих гоночных играх, и давно бросил попытки выяснить. Я пошел своим путем.

(далее…)

Соперники в Chillwave Drive

После релиза Dagon 1.1 я решил вернуться к демке автосимулятора Chillwave Drive — собираюсь превратить ее в полноценную гоночную игру. Этому препятствовало отсутствие ИИ для соперников, и на днях наконец-то эта задача была решена — я написал алгоритм следования траектории на базе Pure Pursiut, популярного метода из робототехники (но почему-то практически не известного в среде инди-разработчиков). В ближайшее время будет подробная статья на эту тему, а пока вы можете скачать свежий билд Chillwave Drive и увидеть ИИ в действии, либо просто посмотреть видео:

Можно ли программировать при помощи нейросетей?

Мне, как мейнтейнеру значимых OpenSource-проектов, Microsoft предоставил бесплатный доступ к Copilot. Пользуюсь им теперь регулярно, как и ChatGPT, но в зависимость, как многие, не впадаю. Могу сказать вот что. В среднем нейронки хорошо справляются с чем-то типовым — например, запросами вроде «напиши функцию-хелпер на JS, которая принимает на вход массив и делает то-то и то-то». То есть, алгоритмами, которые я бы и сам написал, но иногда тупо лень это делать. Ситуация становится резко сложнее с программами, которые должны работать с определенными интерфейсами, библиотеками, API. Чем экзотичнее библиотека, тем хуже результат. Зачастую ИИ просто не знает, как выглядит та или иная функция API, и пытается угадать. Попадает пальцем в небо очень часто, хотя концептуально его решения могут быть правильными. Бывает, что код достаточно легко подчистить от ляпов, а бывает, что он в принципе не может работать.

Абсолютно ничего не выходит, если в проекте много матана и всяких строгих теорем. В узкоспециализированных научных областях ChatGPT почти не разбирается. Также он плохо помогает в задачах оптимизации, отладки сложных систем, в вопросах архитектуры. Copilot, который вроде бы имеет доступ к полноценному контексту, тоже больше угадывает, чем реально что-то анализирует. А это и есть самое сложное в программировании — выбрать для проекта подходящую архитектуру, грамотно спроектировать модели данных, обезопаситься от побочных эффектов. Не все люди-то это умеют.

Нейронки хорошо справляются с рутинными задачами. Переписать код с одного языка на другой, переименовать множество функций по заданному шаблону, сгенерировать какие-то однотипные конструкции — все, что не требует интеллекта вообще. Но для такого они не особо нужны, это решается несложной автоматикой: текстовыми фильтрами, регулярными выражениями и т.д. Чем меньше в проекте рутины и чем больше инженерного творчества, тем сложнее заменить живого автора. Утверждение, что якобы с нейронками даже непрограммисты могут создавать полноценные продукты — это миф. Как в рассказе Роберта Шекли «Верный вопрос»: Абсолютный Ответчик помогает только тем, кто правильно формулирует вопросы — а для этого, как резюмирует писатель, нужно знать большую часть ответа.

PBR-текстуры при помощи нейросети

Обнаружил интересную ESRGAN-модель Material Map Generator, которая генерирует карты нормалей и шероховатости из фототекстур. Работает довольно быстро и показывает весьма качественные результаты — у меня, например, из картинки с ракушками получилось вот такое:

Канал G пришлось инвертировать для совместимости с Blender, а диффузную текстуру я сделал с помощью утилиты Agisoft De-Lighter — тоже, кстати, очень полезный инструмент.

Для запуска нужен Python с установленными numpy, opencv-python и torch.