Сначала была идея написать настольную игру на TON, что-то в духе монополии: подключить UI, сыграть с друзьями и показать, что TON в теории можно использовать даже как движок для 2D-настолок. Но концептуально это все равно была бы обычная доска с набором механик, часть из которых уже реализовывали в TON даже без ИИ. А после знакомства с возможностями ACTON хотелось сделать что-то действительно грандиозное
И тут я вспомнил людей, которые прямо в Minecraft, используя только двоичный код и редстоун, собирают настоящие компьютеры, а потом еще и запускают на них код. Оттолкнувшись от этой мысли, я придумал максимально безумную и почти бессмысленную, но вполне реализуемую идею: сделать 3D-рендер OBJ-моделей прямо на TON
Путь разработки был тем же. Я пишу в Codex про ACTON, он подключает его, и мы начинаем разбирать задачу. Почти сразу всплыла первая проблема: изначальная версия контракта была рассчитана на очень небольшие модели, а я уже скачал машину примерно на 30 тысяч вершин. Поэтому пришлось менять архитектуру: хранить модель чанками, добавить отдельный worker/shard-путь для тяжелых сцен и научиться рендерить модель частями
После первого MVP стало понятно, что дебажить картинку через постоянные деплои в mainnet будет долго и дорого. Поэтому мы с codex'ом взяли @ton/sandbox и начали гонять рендер локально: контракт исполняется в песочнице, а на выходе я сразу получаю картинку и понимаю, что именно сломалось
Шаг за шагом, картинка за картинкой, мы прошли путь от набора пикселей, где вообще непонятно, что происходит, до проекции точек в 3D-пространстве, затем ребер, а потом уже и закрашенных граней. Когда стало ясно, что сама идея работает, я попросил отрендерить скачанную машину в цвете, и мы снова начали доводить процесс до нормального результата: UV, текстуры, патчи, порядок отрисовки, ограничения TVM и все сопутствующие радости
Когда в песочнице все наконец заработало, я решил перейти в mainnet и столкнулся с логичной проблемой: оптимизации почти не было. Codex сначала уменьшил количество TON, которое мы отправляем на контракт, а потом я вспомнил одну идею еще со времен когда разрабатывал игры на unity: для картинки не обязательно обрабатывать всю модель целиком. Достаточно оставить те грани, которые видны из выбранного ракурса
В итоге цепочка стала такой: деплой контракта -> выбор ракурса камеры -> загрузка OBJ на фронт -> отсечение невидимых и внеэкранных граней -> переиндексация оставшихся вершин -> загрузка оптимизированной модели в контракт. После этого контракт уже через get-методы возвращает патчи изображения, а фронт собирает их в финальную картинку
После нескольких правок получился рабочий on-chain 3D-рендерер: он может отрисовывать OBJ-модели прямо на TON в рамках текущих лимитов контракта. Оставалось только отрендерить что-то в основной сети, чтобы в первую очередь проверить работоспособность, а во вторую уже показать результат вам
Машина, которую я скачал, была хорошим стресс-тестом, но мне не хотелось, чтобы именно она стала первой 3D-моделью, отрендеренной в TON. Поэтому я сгенерировал через ИИ 3D-модель собачки REDO, загрузил ее в блокчейн и запустил рендер. Картинка получается через get-методы: фронт вызывает контракт, получает данные по частям и собирает итоговое изображение у себя
Результат можно увидеть в прикрепленных к посту изображениях
Адрес контракта: EQAnje5E76R1buGcCQ4lJsYQ2MesxkncBbnzOqNpxyLJbD9t
Web UI, чтобы попробовать отрендерить что-то самому или посмотреть на собачку(но учтите что TON на контрактах могут кончится): https://attikusfinch.github.io/3d-ton/
Советую создать для деплоя отдельный W5-кошелек
Этим контрактом я пострался раскрыть абсолютно все новшества, которые появились в TON за последнее время - скорость транзакции, их дешевизна и ACTON, который дает возможность реализовывать такие идеи не тратя особо на них время
💎 Спасибо за просмотр #MTONGA
@fiscaldev


