Xytabich 257 Опубликовано: 9 декабря, 2016 (изменено) Всем привет! Сравнительно недавно стал использовать очки дополненной реальности из OpenGlasses для реализации своих фетишей идей. Но все не ограничилось выводом каких-то квадратов, текстиков и прочей ерунды. Я начал пихать на вывод 3D модели, но постоянно грузить obj и png файлы занимало много времени и вычислений, да и к тому же obj файлы имеют свойство очень много весить. Пришлось что то думать на этот повод, после нескольких часов в WitchCraftе некоторого времени я надумал простенький формат для хранения всей информации о модели (благо тут её не так много)...Итак, встречайте *барабанная дробь*:PAM - Polygonal Animated Model (рус. Анимированная Полигональная Модель), как ясно из названия, в файле хранится информация о полигонах и их вершинах, а так же анимаций (при желании). Хотя по идее в файле можно хранить все что угодно, но об этом позже.Формат имеет бинарную структуру файла, что значительно экономит место на диске, ну и ресурсы тоже. Структура файла достаточно проста: PAM - 3 байта, заголовок 0 - 1 байт, тип 0000 - 4 байта, количество вершин 0000 - 4 байта, количество треугольников [vartex data] - блок данных вершин {x, y, z} - 12 байт на вершину [triangle data] - блок данных треугольников {v1, v2, v3, color} - 16 байт на треугольник, цвет занимает 4 байта - r,g,b,a в зависимости от типа: -- блок вершинной анимации 0000 - 4 байта, количество кадров анимации [vertex frame data] - блок данных вершин {x, y, z}, количество вершин совпадает с основной моделью -- блок анимаций палитры 0000 - 4 байта, количество кадров анимации [palette frame data] - блог данных палитры {string color - r,g,b,a}, количество цветов совпадает с количеством треугольников Ну и прежде чем перейти к библиотеке, хотел бы рассмотреть небольшую утилиту для конвертирования obj и png файлов в этот формат - PAMPacker Скачать можно тутаИспользовать её достаточно просто: Запускаем прогу (кудаж без этого) Предлагается выбрать тип из списка, выбираем подходящий Вводим название модели, она сохранится в виде название.pam Вписываем название файла модели в формате obj (или exit если надо выйти из программы) Вписываем название файла текстур(палитра) модели в формате png (можно пропустить, если ничего не вводить и выбрать опцию y)В случае если выбрали формат с анимацией: Вписываем соответствующие названия файлов, и пропускаем если закончили Ну и все, собственно Для работы утилиты необходима библиотека PNGImage.Чтож, перейдем к следующей части нашего повествования.Скачать библиотеку можно тутОбъект pam имеет следующие методы и свойства: Методы: load(fileName):boolean, string - загружает модель в объект, в случае успеха возвращает true, иначе возвращает false и ошибку save(fileName) - сохраняет модель loadMesh(fileName):boolean, string or number, vertexes, triangles - загружает только модель, в случае успеха возвращает true, тип модели, вершины и треугольники; иначе возвращает false и ошибку lerpVertexFrames(frame1, frame2, time):vertexes - смешивает координаты вершин из двух кадров, 0 кадр является вершинами модели, time может принимать значение 0-1 lerpPaletteFrames(frame1, frame2, time):palette - смешивает две палитры, 0 кадр является палитрой модели, time может принимать значение 0-1 Свойства: type - тип модели vertexes - вершины модели triangles - треугольники модели vertexFrames - кадры вершинной анимации paletteFrames - палитры В библиотеке присутствуют только основные методы, для загрузки моделей и их базовой анимации. Картинки для привлечения внимания, ну и заодно пример использования: Но и это ещё не все! (А вы то думали )В библиотеке присутствует фича под названием "модули", то есть при помощи этих самых модулей можно засунуть любые данные в модель!Итак, методы и свойства модулей, присутствующие в pam: Методы, тут думаю все понятно: addModule(module):boolean removeModule(moduleName):boolean removeAllModules() Свойства: additionalModules - все добавленные модули modulesData - таблица данных модулей Структура модуля: module = { name = "module", - имя модуля, является идентификатором для доступа к данным модуля в modulesData pack = function(moduleData, pam):string, - метод запаковки(кодирования в бинарник) данных, должен возвращать строку с бинарными данными unpack = function(file, fileSize, pam):moduleData - метод распаковки(раскодирования) данных, предоставляется файловый поток, размер файла, объект pam } Вспомогательные методы pam, для работы с бинарными данными: float2str(float):string str2float(string):float number int2str(integer):string str2int(string):integer number Модуль должен иметь хотя бы один из методов запаковки/распаковки.Модуль загружается после загрузки основной модели, НО анимации загружаться не будут при добавлении хотя бы одного модуля.В модуль возможно поместить любые (какие позволит совесть) данные.При сохранении файла данных модуля, при наличии метода pack и самих данных, записываются в файл.Получить/задать данные модуля можно при помощи свойства modulesData["module"] или modulesData.module (при соответствующем идентификаторе).Пример модуля, добавляющего возможность сохранять/загружать линии в файл: linesModule = { -- line structure: vertex point 1 (number in vertexes array), vertex point 2, size, color (string(byte array) - r,g,b,a) name = "lines_module", pack = function(moduleData, pam) local data = pam.int2str(#moduleData) for n, d in pairs(moduleData) do data = data..pam.int2str(d[1])..pam.int2str(d[2])..pam.float2str(d[3])..d[4] end return data end, unpack = function(file, fileSize, pam) local size = fileSize - file:seek("cur", 0) if size < 4 then return end local count = pam.str2int(file:read(4)) if size < (count*16+4) then return end local lines = {} for i = 1, count do table.insert(lines, {pam.str2int(file:read(4)), pam.str2int(file:read(4)), pam.str2float(file:read(4)), file:read(4)}) end return lines end } На этом, надеюсь, все. Всем желаю воплощения своих фантазий на тему фетишей идей. Изменено 15 декабря, 2016 пользователем Xytabich 6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Xytabich Автор темы 257 Опубликовано: 9 декабря, 2016 По поводу ошибок, которые с большой вероятностью будут с моими кривыми руками - просьба прислать стактрейс, ну или его скрин. И, возможно когда-нибудь, я исправлю это ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 9 декабря, 2016 возможно когда-нибудь Самонадеянно. Я ничерта не понял, но зато на картинки глянул. Прикольная вещь. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Xytabich Автор темы 257 Опубликовано: 9 декабря, 2016 Я ничерта не понял, но зато на картинки глянул. Прикольная вещь. Ну, картинки дело такое, их и по другому делать можно)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ALeXeR 67 Опубликовано: 9 декабря, 2016 я так понимаю это чтото из серии "мегакрутой формать" 3д моделей для OpenGlasses? но я так и не понял в чес его преймущество) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 9 декабря, 2016 (изменено) Что ещё очень хочется отметить, у автора очень хороший талант на креативные оригинальные запоминающиеся названия. xP я так понимаю это чтото из серии "мегакрутой формать" 3д моделей для OpenGlasses? но я так и не понял в чес его преймущество) Я так понял, он для OpenGlasses и поддерживает анимашки. P. S. Автору настоятельно рекомендую залить свои программы в репозиторий :P Изменено 9 декабря, 2016 пользователем Fingercomp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Xytabich Автор темы 257 Опубликовано: 9 декабря, 2016 я так понимаю это чтото из серии "мегакрутой формать" 3д моделей для OpenGlasses? но я так и не понял в чес его преймущество) не, это скорее из серии "пихай все в него", ибо мне лень придумывать что то ещё, буду все туда пихать)) Вообще для себя формат, но хтож знает, может кому то ещё сгодится Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Xytabich Автор темы 257 Опубликовано: 9 декабря, 2016 Я так понял, он для OpenGlasses и поддерживает анимашки. На самом деле этот формат не только для очочков, он для хранения геометрических данных, ну и прочего хлама P. S. Автору настоятельно рекомендую залить свои программы в репозиторий :P Мне лень Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 9 декабря, 2016 А нормали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Xytabich Автор темы 257 Опубликовано: 9 декабря, 2016 (изменено) А нормали? Очочки нормали не поддерживают (сначала цель на них была), но можно модуль нормалей добавить на этот случай)) Изменено 9 декабря, 2016 пользователем Xytabich Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 9 декабря, 2016 Поддерживаю разработку любых велосипедов всегда и везде, for sake of programming itself. Но вообще, особого смысла в формате не вижу. Среди читабельных форматов 3D моделей OBJ довольно лаконичен. Напоминает эту пикчу: Хотя может получиться что-то толковое. Типа общего формата "вёрстки" дополненной реальности... Хз. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 9 декабря, 2016 ... OBJ очень много весит, а другие слишком сложные для простых целей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 9 декабря, 2016 OBJ очень много весит, а другие слишком сложные для простых целей. Ну он текстовый. Сложно сделать формат легче, не выкидывая нужной информации и не переводя формат в бинарный вид. Хоттабыч прикольную штуку делает, я не возражаю. К тому же, других бинарных форматов всё равно нет пока для OC, значит нет и конкурентов =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ALeXeR 67 Опубликовано: 9 декабря, 2016 (изменено) я вообще не вижу разници в фарматах файлов, для меня они все одинаковые) Для меня есть разница только в том как и читать)) Соответственно и в OC для меня любой файл может быть как текстовым так и бинарным) Изменено 9 декабря, 2016 пользователем ALeXeR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Xytabich Автор темы 257 Опубликовано: 9 декабря, 2016 я вообще не вижу разници в фарматах файлов, для меня они все одинаковые) Для меня есть разница только в том как и читать)) Соответственно и в OC для меня любой файл может быть как текстовым так и бинарным) Не ну допустим у тебя есть текстовый файл описывающий картинку, весит он 3мб, и есть бинарный, весящий 300кб. Что ты выберешь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ALeXeR 67 Опубликовано: 9 декабря, 2016 (изменено) я имею в виду что бля меня все файлы имеют одно и тоже наполнение - байты а то, текстовый он или нет зависит от того как я его читаю я написал это, да бы уточнить что в ОС вполне можно работать с фалами как с бинарными) никто мне например не мешает прочитать абстрактно текстовый файл (txt) как бинарный, а абстрактно бинарный (png например) как текстовый) Изменено 9 декабря, 2016 пользователем ALeXeR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Xytabich Автор темы 257 Опубликовано: 10 декабря, 2016 (изменено) я имею в виду что бля меня все файлы имеют одно и тоже наполнение - байты а то, текстовый он или нет зависит от того как я его читаю я написал это, да бы уточнить что в ОС вполне можно работать с фалами как с бинарными) никто мне например не мешает прочитать абстрактно текстовый файл (txt) как бинарный, а абстрактно бинарный (png например) как текстовый) Тут вся соль в хранении информации, а не в способе её чтения. Даже если ты прочтешь png в текстовом режиме, как ты поймешь что там за картинка? P.S. Перечитав, понял что ты не понимаешь что такое формат(хотя, может и понимаешь). Но с википедии: Формат файла, формат данных — спецификация структуры данных, записанных в компьютерном файле. Изменено 10 декабря, 2016 пользователем Xytabich Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах