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

Xytabich

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

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

  • Посещение

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

    25

Сообщения, опубликованные пользователем Xytabich


  1. Тут загвоздка в том, что это никому, по сути, не надо. Даже если будет подобная программа, пользоваться ей будут от силы пара человек, так как что бы делать даже самые простые программы - надо думать. Учитывая, что даже программистам лень придумывать какой-то функционал (я не говорю об энтузиастах, которые в лоб расшибутся но сделают), что уж говорить о игроках которые хотят только покрасоваться, мол "А я вот что могу!".


  2.  

    Вся функция должна выполняться в цикле, но в функции есть команда, которая выполняется один раз, помимо другого

     

     А зачем огород городить? Можно же просто перед циклом воткнуть print('Привет').


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

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

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

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

     

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

     

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

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


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

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


  5.  

     

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

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

     

     

     

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

    Мне лень :D


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

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

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


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

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

    • Нравится 6

  8. Оно не закончено! Добавил анимацию и возможность поворота модели(немного баговано)

    CCydAfakjig.jpg


     

    Итак, функции:

    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
    

    А теперь я пойду умирать :lazy2:


    P.S. Totoro, теперь пили фею, и мне не забудь скинуть :D

    • Нравится 3

  9. А может и не угас ещё :)
    В принципе по той логике что я описал вышел такой вот тентакль :D:

     

    2ofLXcPgQ8w.jpgNZa7xiiVIb4.jpgMh14GdWanwA.jpg

     

     

    К сожалению при лагах модель может сломаться на мгновение, что печально...

     

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


  10. @@Totoro, интересная мысля слушай, яб хотел такую фею^^
    вот только насчет того дойдут ли руки до анимации не знаю, весь энтузиазм спустил на текстурирование)) Хотя, если будет время и не изменит память, попробую реализовать задуманное


  11. @@Totoro, задумывал реализовывать анимацию?

    Есть у меня идейка, как сделать это по производительнее, отталкиваться буду от текущей программы:

    1. Первым делом загружается основная модель(+ текстуры, если необходимо), при отрисовке треугольники добавляются в таблицу
    2. Методом addFrame(filename) добавляется новый кадр анимации в виде того же объекта, но с измененными координатами вершин. В методе идет поиск номеров измененных вершин и полигонов, которые затем заносятся в таблицу кадра.
    3. Методом setFrames(f1, f2) устанавливаются два кадра, между которыми будет вестись интерполяция, при этом заполняется таблица с начальным и конечным положением вершин модели
    4. Методом animate(t) идет интерполяция выбранных кадров, t=0-1

    Примерно так


  12. Совсем забыл добавить описание, ну теперь есть оно :D

     

     

     

    У разрабов MineOS ты ничего не воровал. Та либа написана вообще не им. Как и другие две.

     

    Не знаю к сожалению, как называть тех кто создал, по этому как проще так и описал))


  13. Почти удалось сделать вертексное текстурирование(ну, в данном случае полигональное), но треугольники просвечивают если созданы позже тех, что перед ними :( Можно чисто теоретически отключать невидимые полигоны, но вот насчет производительности такой штуки остаются вопросы.

    Любезно сп****в позаимствовав у разрабов MineOS библиотечку по чтению PNG, получилось нечто такое:
     

    kJf6rTfIT4E.jpg

     

    Карта текстур (у меня "палитра"):
    Yy_qmtD6UJ4.jpg

     

    P.S. насчет нехватки энергии, дело решается множественным втыкиванием аккумуляторов в округе, и соответственно зарядке их от нескольких источников.

    P.S.S. как менять размер изображения? :smile14:

     

    Чуть не забыл, если кому интересно, вот код: 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)
    
    • Нравится 4

  14. П.С. Есть какой-то вроде модик на пулеметные турели, если он блоки не разрушает, то можно его поставить. Но работает ли он на сервере - вопрос.

    lol Flan's может добавлять такие штуки, ставишь на блок пулеметик и "садишься" за него, вот тебе и турелька.:)
×
×
  • Создать...