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


Фотография

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

модель pam формат

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 16

#1 Оффлайн   Xytabich

Xytabich

    Читатель

  • Пользователи
  • PipPip
  • 38 сообщений
  • ГородКазань

Награды

     

Отправлено 09 Декабрь 2016 - 17:00

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

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


Сообщение отредактировал Xytabich: 16 Декабрь 2016 - 00:02


#2 Оффлайн   Xytabich

Xytabich

    Читатель

  • Автор темы
  • Пользователи
  • PipPip
  • 38 сообщений
  • ГородКазань

Награды

     

Отправлено 09 Декабрь 2016 - 17:06

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



#3 Оффлайн   Fingercomp

Fingercomp

    Видимый невидимый

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 878 сообщений

Награды

                                               

Отправлено 09 Декабрь 2016 - 17:17

возможно

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

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

 

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


  • Totoro и Saintmare это нравится

#4 Оффлайн   Xytabich

Xytabich

    Читатель

  • Автор темы
  • Пользователи
  • PipPip
  • 38 сообщений
  • ГородКазань

Награды

     

Отправлено 09 Декабрь 2016 - 17:24

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

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



#5 Оффлайн   ALeXeR

ALeXeR

    Местный

  • Пользователи
  • PipPipPipPipPip
  • 183 сообщений
  • ГородОдесса

Отправлено 09 Декабрь 2016 - 17:26

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



#6 Оффлайн   Fingercomp

Fingercomp

    Видимый невидимый

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 878 сообщений

Награды

                                               

Отправлено 09 Декабрь 2016 - 17:28

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

 

 

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

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

 

 

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


Сообщение отредактировал Fingercomp: 09 Декабрь 2016 - 17:30


#7 Оффлайн   Xytabich

Xytabich

    Читатель

  • Автор темы
  • Пользователи
  • PipPip
  • 38 сообщений
  • ГородКазань

Награды

     

Отправлено 09 Декабрь 2016 - 17:29

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

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

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



#8 Оффлайн   Xytabich

Xytabich

    Читатель

  • Автор темы
  • Пользователи
  • PipPip
  • 38 сообщений
  • ГородКазань

Награды

     

Отправлено 09 Декабрь 2016 - 17:32

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

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

 

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

Мне лень :D



#9 Оффлайн   LeshaInc

LeshaInc

    Rust Evangelism Strike Force

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 179 сообщений
  • ГородЛуна

Награды

                 

Отправлено 09 Декабрь 2016 - 17:34

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

#10 Оффлайн   Xytabich

Xytabich

    Читатель

  • Автор темы
  • Пользователи
  • PipPip
  • 38 сообщений
  • ГородКазань

Награды

     

Отправлено 09 Декабрь 2016 - 17:45

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

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


Сообщение отредактировал Xytabich: 09 Декабрь 2016 - 17:46


#11 Оффлайн   Totoro

Totoro

    Свой человек

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 464 сообщений

Награды

                                      

Отправлено 09 Декабрь 2016 - 17:48

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

 

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

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

 

927_v4.png

 

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


  • Alex и Saintmare это нравится

#12 Оффлайн   LeshaInc

LeshaInc

    Rust Evangelism Strike Force

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 179 сообщений
  • ГородЛуна

Награды

                 

Отправлено 09 Декабрь 2016 - 17:51

...


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

#13 Оффлайн   Totoro

Totoro

    Свой человек

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 464 сообщений

Награды

                                      

Отправлено 09 Декабрь 2016 - 17:56

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

 

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

 

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

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



#14 Оффлайн   ALeXeR

ALeXeR

    Местный

  • Пользователи
  • PipPipPipPipPip
  • 183 сообщений
  • ГородОдесса

Отправлено 09 Декабрь 2016 - 18:30

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


Сообщение отредактировал ALeXeR: 09 Декабрь 2016 - 18:39


#15 Оффлайн   Xytabich

Xytabich

    Читатель

  • Автор темы
  • Пользователи
  • PipPip
  • 38 сообщений
  • ГородКазань

Награды

     

Отправлено 09 Декабрь 2016 - 21:36

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

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



#16 Оффлайн   ALeXeR

ALeXeR

    Местный

  • Пользователи
  • PipPipPipPipPip
  • 183 сообщений
  • ГородОдесса

Отправлено 09 Декабрь 2016 - 23:10

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

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

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

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


Сообщение отредактировал ALeXeR: 09 Декабрь 2016 - 23:11


#17 Оффлайн   Xytabich

Xytabich

    Читатель

  • Автор темы
  • Пользователи
  • PipPip
  • 38 сообщений
  • ГородКазань

Награды

     

Отправлено 10 Декабрь 2016 - 15:10

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

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

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

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

 

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

 

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


Сообщение отредактировал Xytabich: 10 Декабрь 2016 - 15:14






Темы с аналогичным тегами модель, pam, формат

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных


E-mail администратора: help@computercraft.ru
Яндекс.Метрика