Перейти к содержимому
Xytabich

Мультифункциональный формат полигональных моделей PAM

Рекомендуемые сообщения

Всем привет! Сравнительно недавно стал использовать очки дополненной реальности из 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

vG32miW73sk.jpg

 

Скачать можно тута
Использовать её достаточно просто:

  • Запускаем прогу (кудаж без этого)
  • Предлагается выбрать тип из списка, выбираем подходящий
  • Вводим название модели, она сохранится в виде название.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 - палитры

В библиотеке присутствуют только основные методы, для загрузки моделей и их базовой анимации.
 
Картинки для привлечения внимания, ну и заодно пример использования:

ntOY8_q_BHU.jpgDN_PPVZINi0.jpgYVX1kVKvPI4.jpg


 
Но и это ещё не все! (А вы то думали :))
В библиотеке присутствует фича под названием "модули", то есть при помощи этих самых модулей можно засунуть любые данные в модель!
Итак, методы и свойства модулей, присутствующие в 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
}

На этом, надеюсь, все. Всем желаю воплощения своих фантазий на тему фетишей идей.

Изменено пользователем Xytabich

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По поводу ошибок, которые с большой вероятностью будут с моими кривыми руками - просьба прислать стактрейс, ну или его скрин. И, возможно когда-нибудь, я исправлю это ошибку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

возможно

 

когда-нибудь

Самонадеянно.

 

Я ничерта не понял, но зато на картинки глянул. Прикольная вещь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я ничерта не понял, но зато на картинки глянул. Прикольная вещь.

Ну, картинки дело такое, их и по другому делать можно))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я так понимаю это чтото из серии "мегакрутой формать" 3д моделей для OpenGlasses? но я так и не понял в чес его преймущество)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

 

я так понимаю это чтото из серии "мегакрутой формать" 3д моделей для OpenGlasses? но я так и не понял в чес его преймущество)

Я так понял, он для OpenGlasses и поддерживает анимашки.

 

 

P. S. Автору настоятельно рекомендую залить свои программы в репозиторий :P

Изменено пользователем Fingercomp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я так понимаю это чтото из серии "мегакрутой формать" 3д моделей для OpenGlasses? но я так и не понял в чес его преймущество)

не, это скорее из серии "пихай все в него", ибо мне лень придумывать что то ещё, буду все туда пихать))

Вообще для себя формат, но хтож знает, может кому то ещё сгодится

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Я так понял, он для OpenGlasses и поддерживает анимашки.

На самом деле этот формат не только для очочков, он для хранения геометрических данных, ну и прочего хлама :)

 

 

 

P. S. Автору настоятельно рекомендую залить свои программы в репозиторий :P

Мне лень :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А нормали? :smile25:

Очочки нормали не поддерживают (сначала цель на них была), но можно модуль нормалей добавить на этот случай))

Изменено пользователем Xytabich

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поддерживаю разработку любых велосипедов всегда и везде, for sake of programming itself.  :D

 

Но вообще, особого смысла в формате не вижу. Среди читабельных форматов 3D моделей OBJ довольно лаконичен.

Напоминает эту пикчу:

 

927_v4.png

 

Хотя может получиться что-то толковое. Типа общего формата "вёрстки" дополненной реальности... Хз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
...

OBJ очень много весит, а другие слишком сложные для простых целей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

OBJ очень много весит, а другие слишком сложные для простых целей.

 

Ну он текстовый. Сложно сделать формат легче, не выкидывая нужной информации и не переводя формат в бинарный вид.

 

Хоттабыч прикольную штуку делает, я не возражаю.

К тому же, других бинарных форматов всё равно нет пока для OC, значит нет и конкурентов =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я вообще не вижу разници в фарматах файлов, для меня они все одинаковые) Для меня есть разница только в том как и читать)) Соответственно и в OC для меня любой файл может быть как текстовым так и бинарным)

Изменено пользователем ALeXeR

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я вообще не вижу разници в фарматах файлов, для меня они все одинаковые) Для меня есть разница только в том как и читать)) Соответственно и в OC для меня любой файл может быть как текстовым так и бинарным)

Не ну допустим у тебя есть текстовый файл описывающий картинку, весит он 3мб, и есть бинарный, весящий 300кб. Что ты выберешь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я имею в виду что бля меня все файлы имеют одно и тоже наполнение - байты

а то, текстовый он или нет зависит от того как я его читаю

я написал это, да бы уточнить что в ОС вполне можно работать с фалами как с бинарными)

никто мне например не мешает прочитать абстрактно текстовый файл (txt) как бинарный, а абстрактно бинарный (png например) как текстовый)

Изменено пользователем ALeXeR

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я имею в виду что бля меня все файлы имеют одно и тоже наполнение - байты

а то, текстовый он или нет зависит от того как я его читаю

я написал это, да бы уточнить что в ОС вполне можно работать с фалами как с бинарными)

никто мне например не мешает прочитать абстрактно текстовый файл (txt) как бинарный, а абстрактно бинарный (png например) как текстовый)

 

Тут вся соль в хранении информации, а не в способе её чтения. Даже если ты прочтешь png в текстовом режиме, как ты поймешь что там за картинка?

 

P.S. Перечитав, понял что ты не понимаешь что такое формат(хотя, может и понимаешь). Но с википедии:

Формат файла, формат данных — спецификация структуры данных, записанных в компьютерном файле.

Изменено пользователем Xytabich

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...