Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Vladimir от Октябрь 17, 2012, 13:50



Название: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 17, 2012, 13:50
Доброго дня! Хочу загрузить модель в формате .3ds в Qt проект и добавить к ней интерактивности! Скажем, чтобы при нажатии на какую-нибудь деталь модели она (деталь) меняла цвет, или по каким-то событиям в программе, что-то происходило с отдельными деталями модели (прим. модель машины при нажатии на дверь, она открылась). Есть примеры работы с .3ds форматом через OpenGL, Qt3D+QML! C последним вроде как понятно, как там добавляется интерактивность.. но делать хочу на OpenGL, ибо с ней работал немного, а вот с Qt3D+QML не приходилось. Так вот не совсем понятно, можно ли программировать отдельные части модели средствами OpenGL и как?


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Igors от Октябрь 17, 2012, 14:24
Ну .3ds, как и др форматы - это всего лишь хранение данных на диске. Для доступа нужна структура в памяти, часто называется mesh. Она может быть и не равна тем данным которые подаются в OpenGL. Некоторое время назад резвый молодой человек говорил что нашел в импорт из 3ds в Qt3D - ну может есть смысл посмотреть классы Qt3D. Словом - определитесь с данными


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 17, 2012, 14:37
Из примеров, которые я нашел и пытаюсь разобраться/переделать данные об объекте хранятся вот в таких структурах:
Код:

//Vertex
typedef struct{
    float x,y,z;
}vertex_type;
// The polygon (triangle), 3 numbers that aim 3 vertices
typedef struct{
    int a,b,c;
}polygon_type;
// The mapcoord type, 2 texture coordinates for each vertex
typedef struct{
    float u,v;
}mapcoord_type;

typedef struct {

char name[20]; // Name of the object
   
int vertices_qty; // Number of vertices
           int polygons_qty; // Number of polygons
int size;// aprox size of the model

         vertex_type vertex[MAX_VERTICES]; // Array of vertices
         vertex_type normal[MAX_VERTICES]; // Array of the vertices' normals

         polygon_type polygon[MAX_POLYGONS]; // Array of polygons (numbers that point to the vertices' list)
         mapcoord_type mapcoord[MAX_VERTICES]; // Array of U,V coordinates for texture mapping

         int id_texture; // Number of the texture

} obj_type, *obj_type_ptr;


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Igors от Октябрь 17, 2012, 15:34
Из примеров, которые я нашел и пытаюсь разобраться/переделать данные об объекте хранятся вот в таких структурах:
Тут выплывает "проблема шаринга". Сколько вертексов содержит простейший кубик? Очевидный ответ 8. Но многие хранят 24. по 3 вертекса на точку. Позиции этих 3 одинаковы, а вот нормали (и/или UV и др атрибуты) разные. Так проще напр для OpenGL но хуже напр для редактирования (а какой вертекс из 3 выбрал юзверь?). Можно хранить все отдельно (8 позиций и 24 нориали), но ... пардон, увлекся  :) (много этим занимался).

Возвращаясь к вопросу - можно самому прочитать чанки 3ds в ту структуру что Вы показали, там несложно. Но может более практично задействовать Qt3D и потом перегнать в свои данные. Или вообще работать с классами Qt3D.


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 17, 2012, 16:13
Тут выплывает "проблема шаринга". Сколько вертексов содержит простейший кубик? Очевидный ответ 8. Но многие хранят 24. по 3 вертекса на точку. Позиции этих 3 одинаковы, а вот нормали (и/или UV и др атрибуты) разные. Так проще напр для OpenGL но хуже напр для редактирования (а какой вертекс из 3 выбрал юзверь?). Можно хранить все отдельно (8 позиций и 24 нориали), но ... пардон, увлекся  :) (много этим занимался).


О_о почти ничего не понял) курить и курить книги по 3D)


Возвращаясь к вопросу - можно самому прочитать чанки 3ds в ту структуру что Вы показали, там несложно. Но может более практично задействовать Qt3D и потом перегнать в свои данные. Или вообще работать с классами Qt3D.

Что касается Qt3D, то я пробовал, что-то делать, но там проблема (для меня) хотя бы подключить все эти библиотеки и скомпилировать! Перерыл весь интернет, вроде есть примеры, но чтобы корректо запустить надо сначало VS поставить, потом креатор, потом понапрописывать кучу каких-то путей к библиотекам.. в общем в итоге всех терзаний, я вроде как запустил! Только вот какие-то .3ds криво, косо, но отображает (скачанные из инета), а сделанные свои простые модели - нет! При всем этом у меня Qt 4.8.1, устанавливалось с QtSdk-offline-win-x86-v1_2_1 ! Там вроде как Qt3D я не нашел, пришлось скачивать с http://qt.digia.com/Try-Qt-Now/ а теперь оно платное вроде как?! По крайней мере у меня на 30 дней писалось разрешение на ипользование.. может где в другом месте подскажите где скачать и как без гемора установить (без VisualStudio), ибо под Linux-ом тоже нужно, чтобы собиралось!



Название: Re: работа с форматом .3ds на OpenGL
Отправлено: spirits25 от Октябрь 17, 2012, 17:04
Не знаю, правильно ли я тут всё понял, но можно "нарисовать" всё на qt quick, а потом взаимодействовать с помощью С++. Вот этот пример точно рабочий с qt5 http://habrahabr.ru/post/133126/ .


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 17, 2012, 17:16
Не знаю, правильно ли я тут всё понял, но можно "нарисовать" всё на qt quick, а потом взаимодействовать с помощью С++. Вот этот пример точно рабочий с qt5 http://habrahabr.ru/post/133126/ .

этот пример и делал.. так где мне можно взять халявный Qt3D?)


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: spirits25 от Октябрь 17, 2012, 17:18
Не понял, что значит халявный Qt3D?
Если Вы про Qt5, то я с git'а собирал http://qt-project.org/wiki/Building_Qt_5_from_Git


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 17, 2012, 17:32
Не понял, что значит халявный Qt3D?
Если Вы про Qt5, то я с git'а собирал http://qt-project.org/wiki/Building_Qt_5_from_Git

а Qt3D только в 5 версии Qt?! ну чтобы собрать нужно ведь взять откудо-то исходники.. где их можно найти минуя
http://qt.digia.com/Try-Qt-Now/Qt-commercial-evaluation/?platform=windows-cpp ??! Раньше я с сайта нокии скачивал себе спокойно SDK, под win, linux и не парился, а как сейчас быть? Может есть готовое SDK, которое включает в себя Qt3D?
Сейчас у меня установленно QtSdk-offline-win-x86-v1_2_1 и там проекты с Qt3D не собираются..


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: ecspertiza от Октябрь 17, 2012, 17:36
Навряд ли сможете найти сдк под qt5 так как qt5 еще официально не вышел. То есть придется качать с гита и собирать руками. Хотя я больше склоняюсь к варианту написать свой парсер, там вроде не сильно сложно, но как бы потратить время придется.


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 17, 2012, 17:43
Навряд ли сможете найти сдк под qt5 так как qt5 еще официально не вышел. То есть придется качать с гита и собирать руками. Хотя я больше склоняюсь к варианту написать свой парсер, там вроде не сильно сложно, но как бы потратить время придется.

что-то мы отклонились от темы) парсер .3ds? так Qt3D есть только в Qt5 ??

"качать с гита" ссылку можно на скачивание?


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Igors от Октябрь 17, 2012, 17:49
Vladimir, используйте цитирование когда отвечаете, а то непонятно где чьи слова.

Однако же как оживился разговор когда надо "чего-то достать" (собрать, взять, найти)  :)

Скажем, чтобы при нажатии на какую-нибудь деталь модели она (деталь) меняла цвет, или по каким-то событиям в программе, что-то происходило с отдельными деталями модели (прим. модель машины при нажатии на дверь, она открылась).
Здесь Qt3D и др вряд ли помогут :) Дверь должна быть отдельной моделью (или суб-моделью). Открытие двери сводится к домножению координат на матрицу поворота. Это преобразование линейное. Может быть лучше сначала четче поставить задачу, а иначе дело сведется к беганию-доставанию непонятно чего - и этим же закончится (увы, обычно бывает именно так)


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 17, 2012, 18:00
Vladimir, используйте цитирование когда отвечаете, а то непонятно где чьи слова.

Однако же как оживился разговор когда надо "чего-то достать" (собрать, взять, найти)  :)

Скажем, чтобы при нажатии на какую-нибудь деталь модели она (деталь) меняла цвет, или по каким-то событиям в программе, что-то происходило с отдельными деталями модели (прим. модель машины при нажатии на дверь, она открылась).
Здесь Qt3D и др вряд ли помогут :) Дверь должна быть отдельной моделью (или суб-моделью). Открытие двери сводится к домножению координат на матрицу поворота. Это преобразование линейное. Может быть лучше сначала четче поставить задачу, а иначе дело сведется к беганию-доставанию непонятно чего - и этим же закончится (увы, обычно бывает именно так)

Согласен! Тем более загрузить при помощи OpenGL .3ds модель у меня уже получилось! Задача такого плана, скажем есть  система1, состоящая из 28 модулей:
1. при норм работе все горят зеленым, при аварии какого-либо, он изменяет цвет!
2. при наведеннии/нажатии на модуль появляется инфа по нему: давление, температура.. (где-то внизу в рамке тектом, либо еще как-то).

+ кроме системы1 есть еще ряд системN! Все это крепется на машине! Вращаешь, смотрешь, анализируешь!

Такую задачу можно реализовать на OpenGL??! и куда двигаться.. делать все изменяющиеся части в отдельных .3ds или можно все сделать в одной, но разбить на суб-модели как вы писали???!


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: ecspertiza от Октябрь 17, 2012, 21:02
Отклонюсь еще немного от темы :) Как сделали загрузку ? Я недавно баловался с 3ds посмотрел на инструменты которые есть и решил сделать свой загрузчик, может я упустил хорошую реализацию :)


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Igors от Октябрь 17, 2012, 21:11
Отклонюсь еще немного от темы :) Как сделали загрузку ? Я недавно баловался с 3ds посмотрел на инструменты которые есть и решил сделать свой загрузчик, может я упустил хорошую реализацию :)
Еще больше отклонюсь :) Смотря какие у Вас цели. Если сделать ASAP и забыть - то "надо изыскивать". А если хотите изучить - то и нечего жалеть. Разобрать чанки, пересчитать вертексные нормали и.т.п. - это то что нужно, те самые "азы". А то "прикручивающих" много, а понимающих нет


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 17, 2012, 21:19
Разобрать чанки, пересчитать вертексные нормали и.т.п. - это то что нужно, те самые "азы".

Вот так и делал!) а по теме подскажите что? =)


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Igors от Октябрь 17, 2012, 22:00
Вот так и делал!) а по теме подскажите что? =)
Та запросто :) Только обозначьте эту тему, а то сейчас мутно - то Вы ищете либу, то говорите что свой парсер уже написали. Ну если так - и работайте с вертексами, в чем проблема?


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 17, 2012, 22:50
Вот так и делал!) а по теме подскажите что? =)
Та запросто :) Только обозначьте эту тему, а то сейчас мутно - то Вы ищете либу, то говорите что свой парсер уже написали. Ну если так - и работайте с вертексами, в чем проблема?

))) ну с либой я уже закончил) спрошу на конкретном примере:
Нашел модельку какого-то блендера и загрузил к себе в проект, как мне сделать что-бы при нажатии на кнопку (2), объект 1 менял цвет, при повороте рукоятки 3, объект 1 начал вращаться! Это нужно делать 4 отдельных .3ds (1,2,3 + блок на котором это все крепится)! Если да, то как их потом собрать в один блендер?? Или это можно сделать все в одном файле, а потом как-то разобрать.. вертексами, как вы пишете!


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Igors от Октябрь 18, 2012, 02:35
))) ну с либой я уже закончил) спрошу на конкретном примере:
Нашел модельку какого-то блендера и загрузил к себе в проект, как мне сделать что-бы при нажатии на кнопку (2), объект 1 менял цвет, при повороте рукоятки 3, объект 1 начал вращаться! Это нужно делать 4 отдельных .3ds (1,2,3 + блок на котором это все крепится)! Если да, то как их потом собрать в один блендер?? Или это можно сделать все в одном файле, а потом как-то разобрать.. вертексами, как вы пишете!
Один 3ds файл может содержать любое кол-во объектов. Какие из них показывать - решаете Вы. Раскраску можно делать по-всякому, самое простое - вызвать glColor. Поворот: каждый объект имеет матрицу (поле данных) которая описывает его поворот, смещение, масштаб. Создаете нужную матрицу для вращения и подсовываете ее (glLoadMatrix). Ну вот собственно и все.

Примечание: не стоит считать что 3D == OpenGL. Это просто инструмент вывода без которого трудно обойтись


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Disa от Октябрь 18, 2012, 06:55
Цитировать
самое простое - вызвать glColor
Ну вроде как уже все давно ушли от ffp? С шейдерами чуть потруднее, но и kronos и nvidia уже года 3и рекомендует делать именно через них все.

Цитировать
Это нужно делать 4 отдельных .3ds (1,2,3 + блок на котором это все крепится)!
Наверное стоит разобраться с форматом http://www.gamedev.net/topic/313126-3ds-parsing-tutorial/

Готовый парсер: http://code.google.com/p/lib3ds/

Я сейчас с ходу не вспомню, но помоему в 3ds в дереве храняться отдельно только меши/камера/свет без привязки друк к другу. То есть нельзя понять, какие части объекта - целая деталь. Хотя тут я могу ошибаться, давно я парсил его.

Мб лучше посмотреть в сторону COLLADA или FBX?


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 18, 2012, 09:57
Один 3ds файл может содержать любое кол-во объектов. Какие из них показывать - решаете Вы.
Нужно показывать все, просто иметь возможность доступиться к каждому из них в отдельности.
Ну вот создал я два простых параллелепипеда в программе Google SketchUp 7. Сохранил в .dae, затем MeshLab конвертнул в .3ds! Запустил в своей программе. И после парсинга он видит эти 2 объекта как один. Как мне разгребсти где какой? Напомню структура для хранения данных об объекте такая:
Код:
typedef struct
        {
            char name[20]; // Name of the object

            int vertices_qty; // Number of vertices
            int polygons_qty; // Number of polygons
            int size;// aprox size of the model

            vertex_type vertex[MAX_VERTICES]; // Array of vertices
            vertex_type normal[MAX_VERTICES]; // Array of the vertices' normals

            polygon_type polygon[MAX_POLYGONS]; // Array of polygons (numbers that point to the vertices' list)
            mapcoord_type mapcoord[MAX_VERTICES]; // Array of U,V coordinates for texture mapping

            int id_texture; // Number of the texture

        } obj_type, *obj_type_ptr;

Может в самом графическом редакторе нужно, как-то разделить их.. сделать отдельными компонентами или еще как-то! Или при сохранении в .3ds он сохраняет все полигоны, вертексы, не разграничивая какому объекту сколько полигонов принадлежит..?


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 18, 2012, 10:17
Мб лучше посмотреть в сторону COLLADA или FBX?

А COLLADA - это формат .dae в виде XML? Может его действительно проще парсировать и выделить нужные объекты, чтобы работать с ними по отдельности (поменять цвет, покрутить и т.д.)?


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: spirits25 от Октябрь 18, 2012, 10:31
Сохраните каждый объект в отдельную модель .3ds, и каждую создавайте отдельно. тогда и будет к каждой отдельный доступ.


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Vladimir от Октябрь 18, 2012, 10:48
Сохраните каждый объект в отдельную модель .3ds, и каждую создавайте отдельно. тогда и будет к каждой отдельный доступ.

Хорошо, а как тогда совместить на сцене эти отдельные 3ds в одну целую модель! А если этих частей будет много, а их будет много, то как их потом собирать в одну модель?! Зачем тогда вообще 3d редакторы, если все придется собирать из отдельных частей руками.. ( хотелось бы сделать всю модель сразу, а потом иметь доступ к отдельным ее частям!


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Disa от Октябрь 18, 2012, 11:44
http://www.gamedev.ru/code/terms/COLLADA
https://collada.org/mediawiki/index.php/COLLADA_DOM

читаем-изучаем.
COLLADA вообще создавался для переноса. Я его не парсил сам, но точно знаю что тот же OSG умеет его загружать и можно обращаться к любым узлам модели (ну и соответсвенно загружать их).

У FBX есть готовое SDK на С++ в котором вообще все есть для обращения к сцене. Там даже есть камера и прочее (я правда читал спецификацию, сам пока никак не дойду чтоб пощупать руками). И к узлам модели то же можно обращаться.



Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Igors от Октябрь 18, 2012, 12:56
COLLADA / FBX - это вещь "другого порядка", тащить ее для задач о которых рассказал Владимир - ну, мягко говоря, "неэффективно"

Напомню структура для хранения данных об объекте такая:
Код:
            vertex_type vertex[MAX_VERTICES]; // Array of vertices
            vertex_type normal[MAX_VERTICES]; // Array of the vertices' normals

            polygon_type polygon[MAX_POLYGONS]; // Array of polygons (numbers that point to the vertices' list)
            mapcoord_type mapcoord[MAX_VERTICES]; // Array of U,V coordinates for texture mapping
Против просто С (без плюсов) нет возражений, но вот резервировать массивы по максимуму - второй месяц занимаетесь программированием, что ли? Это неприлично.

Нужно показывать все, просто иметь возможность доступиться к каждому из них в отдельности.
Ну вот создал я два простых параллелепипеда в программе Google SketchUp 7. Сохранил в .dae, затем MeshLab конвертнул в .3ds! Запустил в своей программе. И после парсинга он видит эти 2 объекта как один. Как мне разгребсти где какой?
Должны быть 2 чанка mesh в файле 3ds. Если их там нет (импортер слил), то поезд ушел, ищите тот что не сливает - проще всего сама 3ds, Вас устроит любая версия за последние 10 лет.
Во-вторых, в самом чанке меша есть суб-чанк матрицы объекта, прочитав его Вы знаете где объект расположен, как повернут. Если не ошибаюсь суб-чанк 4160, проще открыть спецификацию. 


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Disa от Октябрь 23, 2012, 05:46
To Igors:
А что насчет ms3d?
Вы же сами писали, что контейнер формата это не имеет ничего общего с его отображением, поэтому мб стоит исходить не только из того, чтоб он имел минимально необходимую информацию, но и чтоб написание парсинга не занимала кучу времени?
 
Для автора:
1). Готовый лоадер (с отображением опять же через ffp):
http://nehe.gamedev.net/tutorial/model_loading/16004/

2). Спецификация формата:
http://chumbalum.swissquake.ch/ms3d/ms3dspec.txt


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Igors от Октябрь 23, 2012, 10:19
To Igors:
А что насчет ms3d?
Вы же сами писали, что контейнер формата это не имеет ничего общего с его отображением, поэтому мб стоит исходить не только из того, чтоб он имел минимально необходимую информацию, но и чтоб написание парсинга не занимала кучу времени?
Если говорить о собственно чтении 3ds - час, ну два, какая там "куча"? Время обсуждения давно превысило время написания  :) Вы предлагаете использовать Милку (ms3d) вместо 3ds - также вполне разумно, но совсем необязательно, если планируются такие простые операции, то самопальные структуры ничем не хуже. Как всегда, все зависит от задачи. Напр ограничения Милки до 64к вертексов или только 2 UV координаты могут оказаться существенными для "не игрового" проекта.


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Disa от Октябрь 23, 2012, 13:14
Ну я видимо не компетентен, но лично у меня на такой бы лоудер ушло больше бы времени:
http://savardge.narod.ru/bin/article_bin1.html
Помню, что когда первый раз парсил его (курсе на 5ом) то занимало много времени, но мб просто я туповат :D


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Igors от Октябрь 23, 2012, 13:45
Помню, что когда первый раз парсил его (курсе на 5ом) то занимало много времени, но мб просто я туповат :D
На мой взгляд у Вас заметна переоценка предыдущего опыта/впечатления. Запомнили что фрактал = Мандельброт - и точка! :) Так же и здесь. "Когда-то это было сложно" - отпечаток остался в памяти, и все, погнали по либам. А если Вы подойдете непредвзято и с высоты Вашего сегодняшнего опыта - то я полагаю результат будет совсем иным.   


Название: Re: работа с форматом .3ds на OpenGL
Отправлено: Disa от Октябрь 25, 2012, 09:40
Понял, попробую как-нибудь это учесть. Хоть, конечно, переучивать себя уже не очень просто :)