Xytabich
Пользователи-
Публикации
143 -
Зарегистрирован
-
Посещение
-
Победитель дней
25
Тип публикации
Блоги
Профили
Форум
Багтрекер
Магазин
Все публикации пользователя Xytabich
-
Тут вся соль в хранении информации, а не в способе её чтения. Даже если ты прочтешь png в текстовом режиме, как ты поймешь что там за картинка? P.S. Перечитав, понял что ты не понимаешь что такое формат(хотя, может и понимаешь). Но с википедии: Формат файла, формат данных — спецификация структуры данных, записанных в компьютерном файле.
-
Не ну допустим у тебя есть текстовый файл описывающий картинку, весит он 3мб, и есть бинарный, весящий 300кб. Что ты выберешь?
-
Очочки нормали не поддерживают (сначала цель на них была), но можно модуль нормалей добавить на этот случай))
-
На самом деле этот формат не только для очочков, он для хранения геометрических данных, ну и прочего хлама Мне лень
-
не, это скорее из серии "пихай все в него", ибо мне лень придумывать что то ещё, буду все туда пихать)) Вообще для себя формат, но хтож знает, может кому то ещё сгодится
-
Ну, картинки дело такое, их и по другому делать можно))
-
По поводу ошибок, которые с большой вероятностью будут с моими кривыми руками - просьба прислать стактрейс, ну или его скрин. И, возможно когда-нибудь, я исправлю это ошибку.
-
Всем привет! Сравнительно недавно стал использовать очки дополненной реальности из 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 } На этом, надеюсь, все. Всем желаю воплощения своих фантазий на тему фетишей идей.
-
Оффтоп Где то я уже это видел такую тему... возможно это был даже я
-
Зато мне позволит *ньяхаха* жаль на скайтече нет чатбокса, даже не знаю как управлять ею
-
Оно не закончено! Добавил анимацию и возможность поворота модели(немного баговано) Итак, функции: setRotation(x,y,z) - поворачивает объект на указанное кол-во градусов(euler), при повороте почему-то размер модели немного уменьшается loadFrame(string:filename) - добавляет новый кадр анимации, обратите внимание, в анимацию добавляются только те вершины, которые отличаются от основной модели. Кадр загружается после анимации! setFrame(index):boolean - устанавливает целевой кадр, если индекс равен нулю, устанавливается значение модели. Возвращает установлен ли кадр getFramesNum():number - возвращает количество кадров animate(t) - интерполирует(смешивает, анимирует) позицию точек от текущей к целевой, t=0-1 setPosition/setRotation/setScale теперь работают при загруженной модели Вот оно само:http://pastebin.com/QJr3u6fa Код для примера: local obj = dofile('atobj.lua') local com = require('component') local glasses = com.glasses glasses.removeAll() obj.load('f1.obj') obj.loadFrame('f2.obj') obj.setScale(0.025) obj.setPosition(0, 1, 0) obj.setColor(1, 1, 1, 0.5) obj.draw(glasses) obj.setFrame(1) local t = 0 local s = true while true do obj.animate(t) obj.setRotation(0,t*90,0) if s then t = t+0.1 if t >= 1 then t = 1 s = false end else t = t-0.1 if t <= 0 then t = 0 s = true end end os.sleep(0.1) end А теперь я пойду умирать P.S. Totoro, теперь пили фею, и мне не забудь скинуть
-
А может и не угас ещё В принципе по той логике что я описал вышел такой вот тентакль : К сожалению при лагах модель может сломаться на мгновение, что печально... Версия не окончательная, выяснилось что узнать положение треугольников нельзя, придется писать костыль для сохранения их положения. В связи с этим не будет надобности указывать начальный и конечный кадр анимации, указывая конечный кадр, будет браться текущее положение треугольников.
-
@@Totoro, считай можно уже 3d игру на очках делать
-
@@Totoro, интересная мысля слушай, яб хотел такую фею^^ вот только насчет того дойдут ли руки до анимации не знаю, весь энтузиазм спустил на текстурирование)) Хотя, если будет время и не изменит память, попробую реализовать задуманное
-
@@Totoro, задумывал реализовывать анимацию? Есть у меня идейка, как сделать это по производительнее, отталкиваться буду от текущей программы: Первым делом загружается основная модель(+ текстуры, если необходимо), при отрисовке треугольники добавляются в таблицу Методом addFrame(filename) добавляется новый кадр анимации в виде того же объекта, но с измененными координатами вершин. В методе идет поиск номеров измененных вершин и полигонов, которые затем заносятся в таблицу кадра. Методом setFrames(f1, f2) устанавливаются два кадра, между которыми будет вестись интерполяция, при этом заполняется таблица с начальным и конечным положением вершин модели Методом animate(t) идет интерполяция выбранных кадров, t=0-1 Примерно так
-
Совсем забыл добавить описание, ну теперь есть оно Не знаю к сожалению, как называть тех кто создал, по этому как проще так и описал))
-
Почти удалось сделать вертексное текстурирование(ну, в данном случае полигональное), но треугольники просвечивают если созданы позже тех, что перед ними Можно чисто теоретически отключать невидимые полигоны, но вот насчет производительности такой штуки остаются вопросы. Любезно сп****в позаимствовав у разрабов MineOS библиотечку по чтению PNG, получилось нечто такое: Карта текстур (у меня "палитра"): P.S. насчет нехватки энергии, дело решается множественным втыкиванием аккумуляторов в округе, и соответственно зарядке их от нескольких источников. P.S.S. как менять размер изображения? Чуть не забыл, если кому интересно, вот код: http://pastebin.com/Znkbt1H3 Необходимые библиотеки: PNGImage(для него deflatelua и crc32lua) Добавленные/измененные методы: loadTexture(string:filename) - загружает текстуру модели в формате png. Можно использовать полупрозрачные текстуры. Необходимо загружать перед моделью. usePalette(boolean:use)(по умолчанию true) - при ложном значении смешивает цвета с текстуры исходя из uv координат модели, иначе берет первый попавшийся цвет(рекомендуется помещать развертку в текстуру вида "палитра"). Необходимо ставить нужное значение так же перед загрузкой модели. setColor/getColor(r,g,b,a) - теперь используют четвертый параметр в виде прозрачности объекта, так же установленный цвет перемножается на цвета текстуры. Код используемый в картинке выше: local obj = require('tobj.lua') local com = require('component') local glasses = com.glasses glasses.removeAll() obj.loadTexture('palette.png') obj.load('object.obj') obj.setScale(0.1) obj.setPosition(0, 1, 0) obj.setColor(1, 1, 1, 1) obj.draw(glasses)
-
Может для создания самой модели использовать Techne? а раскрашивать в программе можно
-
lol Flan's может добавлять такие штуки, ставишь на блок пулеметик и "садишься" за него, вот тебе и турелька.
-
Не ну так не интересно, я люблю вертолетики и самолетики
-
Так какая разница что будут ракеты? Ладно если бы они приват снимали на разрушенной территории, а так просто гриферство, я так считаю.
-
Думаю задумка с ICBM не очень, так как ракеты рассчитаны на разрушение ландшафта и я не думаю что люди согласятся на то что бы их дома разрушили ракетой.
-
A Flan's? Там есть пушки, они то уж точно сделают жизнь на серве хардкорной, да и авто, самолеты и вертолеты тоже есть, а они значительно облегчат перемещение по карте. По моему он не сильно грузит сервер, но в случае чего можно покрутить настройки, тем более не будет такой ситуации что придется запрещать предметы, по тому что их можно просто вытащить из сборки.
