Логотип PSone и где он обитает

Знакомая картинка? Думаю, что знакома она многим. Дети 90-х (ух, что тогда творилось, в песне Монеточки это всё описано), видели этот логотип при старте приставки PS1. И оказалось, что

Оказалось, что это 3D объект. И содержится он на каждом диске с игрой. Содержится он там естественно в проприетарном формате.

Когда-то мне стал интересен процесс программирования под эту консоль, и я наткнулся на сайт psxdev.net, где в разделе загрузок можно найти как официальные средства разработок, так и официальную документацию. В числе этой документации есть и описание применяемых типов файлом. Одним из таких типов оказался формат TMD. Поняв как устроен его заголовок, я начал искать по нему файлы в различных образах игр. И каково было моё удивление, что в самом начале диска, ещё до объявления реквизитов игры, была найдена подобная сигнатура. Ради интереса было проверено ещё несколько образов. И всё повторилось. TMD файл лежал в несжатом виде в самом начале образа. Это 5 сектор диска. А к примеру само представление игры происходит на 16 секторе. Где описывается платформа и название игры

образ диска открытый в  hex-редакторе
образ диска открытый в hex-редакторе

Ну обо всём по порядку. Сигнатурой данного типа файлов является значение 0х00000041. И далее идут служебные данные. Вот на представленном скриншоте это отлично видно. Если открыть документацию, а она очень легко гуглится, файл называется «fileformat47», и немного почитать. Становится понятно, что модель состоит из одного объекта, имеет 337 вершин (0х00000151), 153 нормали (0х00000099), 560 полигонов (0х00000230), и значение масштаба = 7, вернее это степень в которую надо возвести 2, чтобы получить масштаб.

Сразу стал вопрос, а как это отобразить, как посмотреть, что там за фигура. Да. Можно было пойти каким-то незамысловатым путём, и найти какой-нибудь конвертер в DXF или RSD, чтобы открыть в каком-либо 3d вьюере. Но хотелось своего опыта. Поэтому было принято решение самому написать, что-то, что позволило бы его отобразить. Тем более, что посмотрев структуру файла, я понял, что сам объект не тяжелый, без текстур с одноцветными полигонами без градиентов, про это говорят заголовки полигонов 0х2000304.

Я начал копать в сторону opengl, и быстренько (за неделю так, примерно) накидал программку, которая бы позволила отобразить это. И оно отобразилось. Я увидел логотип, но так как мои знания в программировании равноценны знаниям третьеклассника по математике. То через какое-то время (полтора года), я решил, что неплохо бы было перегнать файл во, что-то общеизвестное, что позволяло бы его открывать в известных программах, например стандартный 3D viewer из Windows 10. Я начал смотреть какие форматы он способен открыть. И вот один из них мне понравился, это был формат OBJ. Я погуглил, что он из себя представляет, и мне показалось, что это вполне реализуемо.

Имея какие-то навыки работы с Си, благо уже были наработки, я, уже действительно быстро, накидал программку по трансформации данных в файл OBJ. На самом деле, сначала, я это сделал на python, но не осилил процедуры создания файлов, а в Си, как по мне, это проще. Да, получилось, но оказалось, что в этих файлах нет информации о цвете полигонов. Пришлось так же гуглить как передать информацию о цвете. Оказалось, что надо создавать ещё один файлик с раширением MTL (сокращение от «материал»). Оба файла должны быть вместе, как Бонни и Клайд.

Получилось. Да код не идеален. Можно сгруппировать полигоны по цветам, а не присваивать каждому полигону свой цвет, как это делаю я. Но оно получилось.

А если кому интересно то я оставлю ссылку на каталог с исходниками: https://disk.yandex.ru/d/Kwk8tYfHonyl6g

 

Источник

Читайте также