shiru8bit

shiru8bit 

Программист, музыкант, самоделкин, ретрогеймер

89subscribers

907posts

Showcase

1

Псевдо-3D и ИИ

В недавнее время продолжал свои эксперименты с «написанием» полностью программных псевдо-3D движков посредством ИИ. Схема прежняя: я описываю словами архитектуру и фичи, ИИ генерирует код, я никакой код не пишу вообще, в его код глубоко не вникаю, только говорю словами: «ничего не работает, это глючит, то глючит, всё плохо, сделай хорошо». Весь процесс происходил просто в чате DeepSeek, никаких агентов и интеграций в IDE.
Следующим я попробовал реализовать когда-то задуманный псевдо-3D движок, комбинирующий возможности движков Wolfenstein 3D и Doom. Идея в том, что вся геометрия хранится в плоской карте тайлов, как в Wolf, и состоит из столбов переменной высоты: есть высота пола, высота потолка, текстура на вершине пола или колонны на потолке, и опциональные вертикальные стены на рёбрах и диагоналях каждой из клеток (средние стены в Doom). Также есть спрайты и «поворотные» двери, как в Duke Nukem. Наклонов камеры нет, это именно продвинутый Wolfenstein.
Сначала был сгенерирован движок визуализации. Это заняло несколько дней. Было сделано несколько подходов, первые два зашли в тупик. Изначально я хотел чистый рейкастинг, и первый подход начал работать, но столкнулся с большими сложностями в отрисовке «верхних торцов», то есть самого пола. Это аналогично проблеме рисования вершин красивых квадратных вокселей в воксельном ландшафте, и ИИ зашёл в тупик, у него никак не получалось отладить код, потому что средства отладки ограничены. Может быть он и дожал бы проблему, но я устал и решил начать сначала.
Во второй подход была взята идея секторного движка, подобного Doom, в котором полы должны были рисоваться по алгоритму visplanes из Doom. ИИ предложил собирать рейкастингом всю геометрию уровня из карты в набор векторов и работать с ними, а также рисовать полигоны. Полигоны мне не нравились, поэтому дело тоже зашло в тупик, полы никак не рисовались, и под конец ИИ начал говорить, что это слишком сложно для простой демонстрации, пиши сам.
Писать сам я не стал, и открыл третий чат. Из предыдущих подходов были взяты некоторые идеи. На этот раз я решил не настаивать на чистом рейкастинге, и позволить полигоны Z-буфер, хотя это не совсем то, чего хотелось бы: это не будет работать так быстро, как реальные движки прошлых лет. Но было важнее сначала получить хоть какой-то результат, убедиться в том, что концепция работает.
И на этот раз, с уточнёнными детальными требованиями и предложениями по архитектуре, ИИ справился. Рейкастинг находит видимые стены, сами они рисуются по столбцам, как в нормальном рейкастере, а полы, спрайты и двери рисуются полигонами. Совмещается всё это через Z-буфер. Как обычно, были баги, и моменты, когда я думал, что он уже не осилит разобраться. Но после достаточного количества итераций и уточнений (например, когда я догадывался, что не так в самой логике процесса), дело всё же двигалось.
В итоге рендер получился, всё стабильно, все проблемы были устранены. Я подумал, что неплохо бы теперь переписать этот код в чистовик, может пригодиться для будущих проектов. Но помимо рендера такому движку нужна физика, ведь геометрия в нём представлена множеством разнородных сущностей. Сначала я думал написать её самостоятельно, но потом подумал: так ведь ИИ уже осилил рендер, пусть осилит физику.
И за пару подходов ИИ осилил физику. Первый подход зашёл в тупик, были сложноустранимые баги. Но я просто попросил ИИ в новом чате перенаписать логику нужных частей заново, и это позволило преодолеть проблему. Были очень вредные глюки в пограничных случаях, и я уже был отчаялся, что их удастся решить, потому что ИИ начал выдумывать очень дикие решения с хаками — например, он пытался побороть глюк с клиппингом внутрь клетки путём установки на всех углах каждой клетки дополнительных окружностей. Но эти дикие решения позволили мне заметить указания на более глубинные проблемы, я поделился наблюдениями и своими гипотезами на их счёт, и ИИ осилил сделать красиво.
В итоге всё работает. Как обычно, захват у меня тормозной, да и сам движок в дебажной сборке в окне 800 на 600 работает не слишком шустро. Но вот, извольте наблюдать результат.
Subscription levels6

Микро 16

$0.2 per month
Просто потому что нельзя 8. Даже самая малая поддержка важна. Спасибо!

База 128

$1.6 per month
Для тех, кто просто хочет поддержать. Спасибо!

Супер 256

$3.2 per month
Для тех, кто хочет поддержать. Спасибо!

Кило 320

$4 per month
Для тех, кто сильно хочет поддержать. Спасибо!

Мега 640

$8 per month
Для тех, кто очень хочет поддержать. Спасибо!

Гига 1024

$12.8 per month
Для тех, кто крайне хочет поддержать. Спасибо!
Go up