Знакомая картинка? Думаю, что знакома она многим. Дети 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

P.S. То, что это логотип я понял в феврале 2020 года. И в силу разных обстоятельств оставил этот проект. И вот, после того как я опубликовал эту статью, я узнал, что примерно год назад уже была подобная статья от какого-то австралийского блогера. Но там узнали о трехмерности после какого-то глитча. Даже есть видос, как его крутят прямо в момент заставки. И вообще это старая городская легенда, как оказалось.

Комментарии (12)


  1. Iv38
    14.08.2022 21:10
    +1

    У меня не было PSone, поэтому я не в курсе, этот логотип там анимировался? Зачем он так хранился?


    1. lisovsky1 Автор
      14.08.2022 21:32
      +4

      Не. Он статично показывался в виде картинки. Я сам не понимаю. Я всегда думал, что это картинка


      1. SadOcean
        15.08.2022 12:54
        +4

        Ну прямо 3д может и оверинженеринг, но хранение в векторном виде - очень хорошая практика, позволяющая экономить ресурсы.
        Возможно им почти ничего не стоило использовать 3д (готовая библиотека), а вот представление в виде полигонов оказалось гораздо компактнее растра.

        Возможно они так же экспериментировали с анимацией, что делает это еще логичнее.


        1. tormozedison
          15.08.2022 14:01
          +5

          Сделали в 3D, чтобы покрутить, но затем забыли покрутить.


          1. SadOcean
            16.08.2022 14:58

            Да, вполне.
            Все равно результат - векторный рисунок, зачем переделывать на растр потом?


        1. calculator212
          15.08.2022 15:57

          очень хорошая практика, позволяющая экономить ресурсы.

          Насколько я помню, для PS1 карта памяти выдавалась на 8кб (видимо память была очень дорогой), так что экономия места звучит как наиболее разумный вариант


          1. Nikita22007
            15.08.2022 22:16

            PS1 грузился с CD дисков.


            1. SadOcean
              16.08.2022 15:02

              Но это не значит, что это место не нужно экономить.
              Лучше обязать разработчиков использовать заставку на пару килобайт, чем на пару мегабайт из 700


        1. lisovsky1 Автор
          15.08.2022 15:58

          Размер исходного файла 12920 байт


          1. SadOcean
            16.08.2022 15:01

            Да, но это только 3d модель или там еще софт, спрайт с надписью Sony Computer Entertaiment, звук загрузки и предыдущее лого?
            Если там не только 3д модель - то это все равно оправданно.


  1. AcckiyGerman
    15.08.2022 10:06
    +12

    Могу ли я посоветовать вам хранить код в системах хранения кода (github, gitlab, gitbucket) ?
    Да, придется освоить git, но:

    • git специально спроектировали для хранения кода и его истории изменений

    • github (и аналоги) будут надежнее для целей хранения, чем yandex.disk

    • люди смогут просматривать ваш код, даже не скачивая его

    • код и его описание будет индексироватся поисковиками, что позволит легче его найти другим людям


    1. lisovsky1 Автор
      15.08.2022 14:53
      +2

      Я думаю, что можете)