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

Xytabich

Пользователи
  • Публикации

    143
  • Зарегистрирован

  • Посещение

  • Победитель дней

    25

Все публикации пользователя Xytabich

  1. А зачем огород городить? Можно же просто перед циклом воткнуть print('Привет').
  2. Тут вся соль в хранении информации, а не в способе её чтения. Даже если ты прочтешь png в текстовом режиме, как ты поймешь что там за картинка? P.S. Перечитав, понял что ты не понимаешь что такое формат(хотя, может и понимаешь). Но с википедии: Формат файла, формат данных — спецификация структуры данных, записанных в компьютерном файле.
  3. Не ну допустим у тебя есть текстовый файл описывающий картинку, весит он 3мб, и есть бинарный, весящий 300кб. Что ты выберешь?
  4. Очочки нормали не поддерживают (сначала цель на них была), но можно модуль нормалей добавить на этот случай))
  5. На самом деле этот формат не только для очочков, он для хранения геометрических данных, ну и прочего хлама Мне лень
  6. не, это скорее из серии "пихай все в него", ибо мне лень придумывать что то ещё, буду все туда пихать)) Вообще для себя формат, но хтож знает, может кому то ещё сгодится
  7. Ну, картинки дело такое, их и по другому делать можно))
  8. По поводу ошибок, которые с большой вероятностью будут с моими кривыми руками - просьба прислать стактрейс, ну или его скрин. И, возможно когда-нибудь, я исправлю это ошибку.
  9. Всем привет! Сравнительно недавно стал использовать очки дополненной реальности из 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 } На этом, надеюсь, все. Всем желаю воплощения своих фантазий на тему фетишей идей.
  10. Оффтоп Где то я уже это видел такую тему... возможно это был даже я
  11. Зато мне позволит *ньяхаха* жаль на скайтече нет чатбокса, даже не знаю как управлять ею
  12. Оно не закончено! Добавил анимацию и возможность поворота модели(немного баговано) Итак, функции: 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, теперь пили фею, и мне не забудь скинуть
  13. А может и не угас ещё В принципе по той логике что я описал вышел такой вот тентакль : К сожалению при лагах модель может сломаться на мгновение, что печально... Версия не окончательная, выяснилось что узнать положение треугольников нельзя, придется писать костыль для сохранения их положения. В связи с этим не будет надобности указывать начальный и конечный кадр анимации, указывая конечный кадр, будет браться текущее положение треугольников.
  14. @@Totoro, интересная мысля слушай, яб хотел такую фею^^ вот только насчет того дойдут ли руки до анимации не знаю, весь энтузиазм спустил на текстурирование)) Хотя, если будет время и не изменит память, попробую реализовать задуманное
  15. @@Totoro, задумывал реализовывать анимацию? Есть у меня идейка, как сделать это по производительнее, отталкиваться буду от текущей программы: Первым делом загружается основная модель(+ текстуры, если необходимо), при отрисовке треугольники добавляются в таблицу Методом addFrame(filename) добавляется новый кадр анимации в виде того же объекта, но с измененными координатами вершин. В методе идет поиск номеров измененных вершин и полигонов, которые затем заносятся в таблицу кадра. Методом setFrames(f1, f2) устанавливаются два кадра, между которыми будет вестись интерполяция, при этом заполняется таблица с начальным и конечным положением вершин модели Методом animate(t) идет интерполяция выбранных кадров, t=0-1 Примерно так
  16. Совсем забыл добавить описание, ну теперь есть оно Не знаю к сожалению, как называть тех кто создал, по этому как проще так и описал))
  17. Почти удалось сделать вертексное текстурирование(ну, в данном случае полигональное), но треугольники просвечивают если созданы позже тех, что перед ними Можно чисто теоретически отключать невидимые полигоны, но вот насчет производительности такой штуки остаются вопросы. Любезно сп****в позаимствовав у разрабов 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)
  18. Может для создания самой модели использовать Techne? а раскрашивать в программе можно
  19. lol Flan's может добавлять такие штуки, ставишь на блок пулеметик и "садишься" за него, вот тебе и турелька.
  20. Не ну так не интересно, я люблю вертолетики и самолетики
  21. Так какая разница что будут ракеты? Ладно если бы они приват снимали на разрушенной территории, а так просто гриферство, я так считаю.
  22. Думаю задумка с ICBM не очень, так как ракеты рассчитаны на разрушение ландшафта и я не думаю что люди согласятся на то что бы их дома разрушили ракетой.
  23. A Flan's? Там есть пушки, они то уж точно сделают жизнь на серве хардкорной, да и авто, самолеты и вертолеты тоже есть, а они значительно облегчат перемещение по карте. По моему он не сильно грузит сервер, но в случае чего можно покрутить настройки, тем более не будет такой ситуации что придется запрещать предметы, по тому что их можно просто вытащить из сборки.
×
×
  • Создать...