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

OBJ: Виртуальные трехмерные модели [OpenGlasses]

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

Интересно а можно было бы сделать так что бы модели имели разные цвета а не залитые сплошными 

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


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

Хотелось бы...кстати большие модели не отрисовываются пишет нет памяти... 4 по 3.5 установил все равно не хватает

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


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

Хотелось бы...кстати большие модели не отрисовываются пишет нет памяти... 4 по 3.5 установил все равно не хватает

 

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

 

Что касается раскраски, тут все не просто. Текстуры реализовать не выйдет, в силу технических причин.

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

Ну и наконец, можно реализовать что-то вроде фейкового "самозатенения" по полигонам. (Смотреться будет немного "угловато" =) Примерно так: http://i.stack.imgur.com/o90EZ.png только треугольники вместо квадратов) И повысит расход оперативной памяти и время загрузки модели.

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

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


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

Я не совсем понял, как загружать модели?

 

Тебе надо залить файлик obj на жесткий OC-компьютера.

 

Если у тебя есть доступ к сейву - просто поищи папку с диском и скопируй файл туда.

Если ты играешь на сервере и доступа к сейву мира нет - залей модельку куда-нибудь в интернет, получи на нее прямую ссылку и скачай на OC-компьютер командой wget.

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


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

Тебе надо залить файлик obj на жесткий OC-компьютера.

 

Если у тебя есть доступ к сейву - просто поищи папку с диском и скопируй файл туда.

Если ты играешь на сервере и доступа к сейву мира нет - залей модельку куда-нибудь в интернет, получи на нее прямую ссылку и скачай на OC-компьютер командой wget.

Спасибо

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


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

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

Любезно сп****в позаимствовав у разрабов 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)
Изменено пользователем Xytabich

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


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

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

 

Но результат зато красивый :)

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


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

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

 

 

 

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

 

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

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

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


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

Офигительно!

С меня лайк, как минимум =)

 

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

 

На самом деле это либа от TehSomeLuigi.

https://oc.cil.li/index.php?/topic/266-libpngimage-a-preliminary-library-for-decoding-encoding-png-images/

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


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

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

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

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

Примерно так

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

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


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

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

 

Задумывал, да.

Я когда-то замышлял сделать что-то типа феи, которая за Линком летала.  :)

Типа маленькая моделька, которая машет крылышками, летает по дому за тобой и показывает всякую фигню. Такое виртуальное проявление умного дома.

Но дальше задумок дело не пошло.

 

Если у тебя получится - будет здорово.

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


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

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

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

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


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

@@Xytabich, текстурирование - это уже круто, я считаю. А там может и анимации какие всобачим.

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


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

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

 

2ofLXcPgQ8w.jpgNZa7xiiVIb4.jpgMh14GdWanwA.jpg

 

 

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

 

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

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

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


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

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

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

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

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


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

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

 

Сэр, моё воспитание не позволяет мне пилить таких кавайных существ. :P

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


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

Сэр, моё воспитание не позволяет мне пилить таких кавайных существ. :P

 

Зато мне позволит *ньяхаха*

жаль на скайтече нет чатбокса, даже не знаю как управлять ею

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


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

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

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

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

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

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

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

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

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


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