Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: deMax от Август 06, 2014, 07:55



Название: Выбор OpenGl
Отправлено: deMax от Август 06, 2014, 07:55
Нужен свой движок для моделирования: физика отсутствует(никаких столкновений, деформаций и обратной связи с пользователем, пользователь только наблюдает), нужно нарисовать 3D модели в пространстве по красивее: с учетом освещенности, с тенью, карты высоты/блеска/глянца.
Что выбрать, пишут что opengl 2.0 (glDrawELements, pushMatrix...) устарел и все надо реализовывать на шейдерах.
Брать подход QGlWidget или то что сделанно в Qt 5?
В программе будет интерфейс и для этого Qt очень удобен своими компоновщиками, но часть openGl хотелось бы реализовать максимально независимо от Qt.


Название: Re: Выбор OpenGl
Отправлено: alex312 от Август 06, 2014, 08:08
Вот вам список на подумать :
http://www.openscenegraph.org/
http://www.ogre3d.org/
https://qt.gitorious.org/qt-labs/qt3d/


Название: Re: Выбор OpenGl
Отправлено: deMax от Август 06, 2014, 08:54
Спасибо, но я уже просматривал все эти движки - не подходят: тормознуто, некрасиво, нет слоев. На glDrawElement и pushMatrix я сделал пример в который осталось вставить шейдеры для объемных и красивых поверхностей, просто пишут(http://www.esate.ru/blog/novye_uroki_opengl/382.html (http://www.esate.ru/blog/novye_uroki_opengl/382.html)) что на шейдерах все это будет быстрее.

p.s. Какие технологии на данный момент актуальны, вопрос производительности не на последнем месте.


Название: Re: Выбор OpenGl
Отправлено: Igors от Август 06, 2014, 11:32
Вопрос совместимости никогда и нигде не был на последнем месте, а с OpenGL тем более. Поэтому я пере-собрал Qt5 с opengl desltop и спокойно использую старый код. Объявление многого "устаревшим" расцениваю как маркетинговую уловку.

Что касается GLSL шейдеров, то они и раньше были неизбежны - иначе phong просто не получить. Ну и начните с простого phong'a, а дальше видно будет. Это гораздо практичнее чем очертя голову бросаться в пучину GLSL - только потому что якобы "на шейдерах все быстрее" :)


Название: Re: Выбор OpenGl
Отправлено: deMax от Август 06, 2014, 15:08
Где посмотреть примеры или готовые решения, как наиболее просто и красиво отрисовать модель. Задача то по сути типичная.
И каким способом отрисовывать модель? glDrawElements?


Название: Re: Выбор OpenGl
Отправлено: deMax от Август 07, 2014, 14:17
Я пока сделал рисование через glDrawElements, но glTexCoordPointer вынуждает дублировать вершины у которых текстурные координаты различаются для граней.  glNormalPointer тоже для некоторых вершин не совпадает. Как это на шейдерах сделать и какую документацию посоветуете?


Название: Re: Выбор OpenGl
Отправлено: Igors от Август 07, 2014, 16:24
Я пока сделал рисование через glDrawElements, но glTexCoordPointer вынуждает дублировать вершины у которых текстурные координаты различаются для граней.  glNormalPointer тоже для некоторых вершин не совпадает. Как это на шейдерах сделать и какую документацию посоветуете?
Лет 15 (на моей памяти) все дублировали (чаще использовали данные где это уже сделано) - и не помню чтобы кто-то рвался делать это на шейдерах :)

Вот старенький пример который (в свое время) использовал я http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php (http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php). Он делает то что Вы называете "красиво" (phong shading)


Название: Re: Выбор OpenGl
Отправлено: deMax от Август 08, 2014, 13:14
А что с текстурированием делать? У меня есть 3d модель, экспортирую я ее в формат obj (или какой другой посоветуете, в 3ds отсутствуют нормали. К модели нужно крепить метаинформацию поэтому после obj будет бинарный файл). Массив полигонов в котором каждая точка содержит - номер точки, номер текстуры и номер нормали из 3-ех массивов.
Правильно ли дублировать точки для тех полигонов у которых отличаются нормали и текстурные координаты(рисовать glDrawElements) или есть более красивые и производительные решения? Сама модель будет достаточно простой.

т.е. мне нужно решение локальной задачи, отрисовать модель из 3D редактора с учетом текстур. Красивым и не тяжелым(для ПК) способом.


Название: Re: Выбор OpenGl
Отправлено: Igors от Август 08, 2014, 14:34
У меня есть 3d модель, экспортирую я ее в формат obj (или какой другой посоветуете, в 3ds отсутствуют нормали. К модели нужно крепить метаинформацию поэтому после obj будет бинарный файл).
Obj нормальный формат, из других есть смысл посмотреть FBX, там очень приличный SDK. Если попроще - можно напр milkshape. Своего формата тоже бояться не следует

Массив полигонов в котором каждая точка содержит - номер точки, номер текстуры и номер нормали из 3-ех массивов. Правильно ли дублировать точки для тех полигонов у которых отличаются нормали и текстурные координаты(рисовать glDrawElements) или есть более красивые и производительные решения? Сама модель будет достаточно простой.
Такое дублирование во всяком случае было нормальной практикой на протяжении десятилетий. Разумеется правильно дублировать не все вертексы а лишь отличающиеся нормалями/текстурой, таких обычно немного.

А что с текстурированием делать?
То же самое, glTexCoordPointer и.т.д


Название: Re: Выбор OpenGl
Отправлено: deMax от Август 11, 2014, 09:54
Obj нормальный формат, из других есть смысл посмотреть FBX, там очень приличный SDK. Если попроще - можно напр milkshape. Своего формата тоже бояться не следует
А если нужно сохранить модель состоящую из множества елементов с иерархией и взаимным расположением? Например машина - колесо в своей системе координат(для вращения вокруг своей оси), плюс есть смещение относительно машины или амортизаторов. т.е. дополнительный формат для сцены.

Цитировать
Такое дублирование во всяком случае было нормальной практикой на протяжении десятилетий. Разумеется правильно дублировать не все вертексы а лишь отличающиеся нормалями/текстурой, таких обычно немного.
А есть готовые решения? Например может ли так сохранять blender или 3dmax...?


Название: Re: Выбор OpenGl
Отправлено: Igors от Август 11, 2014, 10:38
А если нужно сохранить модель состоящую из множества елементов с иерархией и взаимным расположением? Например машина - колесо в своей системе координат(для вращения вокруг своей оси), плюс есть смещение относительно машины или амортизаторов. т.е. дополнительный формат для сцены.
Если нужно больше возможностей - качайте FBX SDK, он себя оправдает.

А есть готовые решения?
Если программист не может перевести shared/unshared - грош ему цена, пусть идет учить регулярки и не сует хобот в 3D  :)


Название: Re: Выбор OpenGl
Отправлено: deMax от Август 11, 2014, 11:00
Если нужно больше возможностей - качайте FBX SDK, он себя оправдает.
Смущает меня FBX - проприетарный недокументированный формат
А какие есть форматы для сохранения сцены, которые самому можно прочитать? Скажем что то типа lws(lightwave scene), кроме иерархии объектов и смещений координат ничего не нужно.
Если программист не может перевести shared/unshared - грош ему цена, пусть идет учить регулярки и не сует хобот в 3D  :)
Не хочется писать велосипед, хотя задача простая. А причем здесь регулярные выражения?


Название: Re: Выбор OpenGl
Отправлено: Old от Август 11, 2014, 11:10
Смущает меня FBX - проприетарный недокументированный формат
А какие есть форматы для сохранения сцены, которые самому можно прочитать?
Придумайте свой формат и напишите экспортер из редактора. Большинство редакторов (если не все) позволяют это делать довольно легко.


Название: Re: Выбор OpenGl
Отправлено: Igors от Август 11, 2014, 11:12
Смущает меня FBX - проприетарный недокументированный формат
Пользуйте SDK, это гораздо приятнее чем ковыряться в формате

А какие есть форматы для сохранения сцены, которые самому можно прочитать? Скажем что то типа lws(lightwave scene), кроме иерархии объектов и смещений координат ничего не нужно.
Не связывайтесь с этой гадостью только потому что текстовый файл - там парсить грыжу наживете. И он постоянно меняется, а доки приличной нет - одни огрызки.


Название: Re: Выбор OpenGl
Отправлено: navrocky от Август 11, 2014, 19:31
Смущает меня FBX - проприетарный недокументированный формат
А какие есть форматы для сохранения сцены, которые самому можно прочитать?

Есть COLLADA https://ru.wikipedia.org/wiki/COLLADA.


Название: Re: Выбор OpenGl
Отправлено: deMax от Август 12, 2014, 11:26
Придумайте свой формат и напишите экспортер из редактора. Большинство редакторов (если не все) позволяют это делать довольно легко.
Так я так и хочу, нужно во что то экспортировать, чтоб потом в свой формат собрать. И чтоб там было все необходимое (иерархия объектов, полигоны, нормали и текстуры)

Есть COLLADA https://ru.wikipedia.org/wiki/COLLADA.
Спасибо, похоже на то что нужно. Только Deep Exploration при экспорте в этот формат модель в кашу превратил.


Название: Re: Выбор OpenGl
Отправлено: navrocky от Август 12, 2014, 11:42
Только Deep Exploration при экспорте в этот формат модель в кашу превратил.

Blender неплохо умеет в этот формат. Также есть либа Assimp, которая умеет его читать.


Название: Re: Выбор OpenGl
Отправлено: Igors от Август 12, 2014, 12:04
Есть COLLADA https://ru.wikipedia.org/wiki/COLLADA.
А дата последнего апдейта не смущает?


Название: Re: Выбор OpenGl
Отправлено: navrocky от Август 12, 2014, 14:48
Есть COLLADA https://ru.wikipedia.org/wiki/COLLADA.
А дата последнего апдейта не смущает?

Это же версия стандарта. Бывают более протухшие популярные стандарты :)

Я когда два года назад разбирался с загрузкой модели из blender в свою прогу, много чего перебрал, с COLLADA получалось наиболее адекватно, с текстурами, нормалями и правильной расстановкой деталей, поэтому и советую. Ну и это открытый стандарт, и во многих пакетах поддерживается экспорт/импорт в него.


Название: Re: Выбор OpenGl
Отправлено: deMax от Август 12, 2014, 15:52
Я когда два года назад разбирался с загрузкой модели из blender в свою прогу, много чего перебрал, с COLLADA получалось наиболее адекватно, с текстурами, нормалями и правильной расстановкой деталей, поэтому и советую. Ну и это открытый стандарт, и во многих пакетах поддерживается экспорт/импорт в него.
Спасибо, значит наверно на нем и остановлюсь - вроде все устраивает. (жалко что нет иерархии и смещения частей в obj формате, меня бы в принципе устроил).


Название: Re: Выбор OpenGl
Отправлено: deMax от Август 14, 2014, 11:21
Я когда два года назад разбирался с загрузкой модели из blender в свою прогу, много чего перебрал, с COLLADA получалось наиболее адекватно, с текстурами, нормалями и правильной расстановкой деталей, поэтому и советую. Ну и это открытый стандарт, и во многих пакетах поддерживается экспорт/импорт в него.
Наверно на этом и остановлюсь. Вы сами xml парсили или библиотекой воспользовались? Может есть примеры?

p.s. Как человеку в юные годы долго игравшимся с lightwave, интерфейс blender доводит до слов нехороших... еще и форматы не все корректно переводяться. Надеюсь связка blender->COLLADA->opengl без косяков.


Название: Re: Выбор OpenGl
Отправлено: navrocky от Август 14, 2014, 11:59
Я когда два года назад разбирался с загрузкой модели из blender в свою прогу, много чего перебрал, с COLLADA получалось наиболее адекватно, с текстурами, нормалями и правильной расстановкой деталей, поэтому и советую. Ну и это открытый стандарт, и во многих пакетах поддерживается экспорт/импорт в него.
Наверно на этом и остановлюсь. Вы сами xml парсили или библиотекой воспользовались? Может есть примеры?

Нет конечно, я пользовал assimp, пример ее использования есть в qt3d.


Название: Re: Выбор OpenGl
Отправлено: deMax от Август 14, 2014, 14:46
Нет конечно, я пользовал assimp, пример ее использования есть в qt3d.
Спасибо.

А как модель экспортировали? Blender экспортирует в collada(.dae), но deepexploration не отображает текстуры(неправильный путь к текстуре материала+на все объекты наложен материал по умолчанию)


Название: Re: Выбор OpenGl
Отправлено: navrocky от Август 18, 2014, 16:41
К сожалению, я уже припомнить не могу что да как, но без танцев с бубном, конечно, не обошлось  :)


Название: Re: Выбор OpenGl
Отправлено: deMax от Сентябрь 01, 2014, 07:49
Хочу в OpenGl сделать реализацию слоев, у меня объекты находятся в разном масштабе и по факту все объекты первого слоя находятся дальше любого объекта второго слоя(а в opengl они будут пересекаться, т.к. единица масштаба у каждого слоя своя). Правильно ли я думаю, что перед началом рисования следующего слоя нужно сбросить буфер глубины?
Какие движки поддерживают возможность очистки буфера глубины в процессе рисования сцены? Openscenegraph?

p.s. Эта задача актуальна для космоса, макро объектов на фоне нашего мира...


Название: Re: Выбор OpenGl
Отправлено: Igors от Сентябрь 02, 2014, 08:24
Хочу в OpenGl сделать реализацию слоев, у меня объекты находятся в разном масштабе и по факту все объекты первого слоя находятся дальше любого объекта второго слоя(а в opengl они будут пересекаться, т.к. единица масштаба у каждого слоя своя). Правильно ли я думаю, что перед началом рисования следующего слоя нужно сбросить буфер глубины?
Какие движки поддерживают возможность очистки буфера глубины в процессе рисования сцены? Openscenegraph?

p.s. Эта задача актуальна для космоса, макро объектов на фоне нашего мира...
Сбрасывая depth буфер Вы просто говорите OpenGL "рисовать поверх старого (т.е. уже отрисованного)". Кто мешает просто выводить звезды "от дальних к ближним"? Используя какое-то условное расстояние, хоть тот же номер слоя = Z, Все равно это будут точки заданной "толщины"


Название: Re: Выбор OpenGl
Отправлено: deMax от Сентябрь 02, 2014, 10:24
Например: я рисую космический корабль - единицы измерения метры, рисую солнечную систему - тысяча метров, звезды - а.е/парсеки... и ничего не пересечется. Работаем в нормальной системе измерения и не надо проверять что вдруг солнце перед космическим кораблем окажется. В space engine автор писал что реализовал рисование космоса через слои, вот я и пытаюсь понять как это можно реализовать.


Название: Re: Выбор OpenGl
Отправлено: Igors от Сентябрь 02, 2014, 11:39
Например: я рисую космический корабль - единицы измерения метры, рисую солнечную систему - тысяча метров, звезды - а.е/парсеки... и ничего не пересечется. Работаем в нормальной системе измерения и не надо проверять что вдруг солнце перед космическим кораблем окажется.
OpenGL рендерит во "фрустуме" (усеченная пирамида), напр в gluPerspective задаются передняя и задняя глубины (hither/yon). И эти параметры совсем не безобидны, поэтому вряд ли дело дойдет даже до солнечной системы, не говоря уже о парсеках.

В space engine автор писал что реализовал рисование космоса через слои, вот я и пытаюсь понять как это можно реализовать.
Если бы все было "в реальных размерах" (как Вы упорно хотите) - никакие слои не нужны. Не понимаю в чем сложности? Напр расстояние от Земли до солнца 150 * 1.0e+6 км - ну и положите его равным 150. Точно так же все размеры планет поделите на 1.0e+6 км. Визуально ничего не изменится (вспомните подобие треугольников). Для звезд это не проходит - с ними работайте по углу, об этом уже говорили.

Конечно месяца так через 3 Вы можете опять задать тот же вопрос - но такой подход непродуктивен 


Название: Re: Выбор OpenGl
Отправлено: deMax от Сентябрь 02, 2014, 15:59
OpenGL рендерит во "фрустуме" (усеченная пирамида), напр в gluPerspective задаются передняя и задняя глубины (hither/yon). И эти параметры совсем не безобидны, поэтому вряд ли дело дойдет даже до солнечной системы, не говоря уже о парсеках.
Это я знаю. Поэтому звезды буду в парсеках рендерить, и если буфер не обнулять то они перед кораблем окажуться.

Если бы все было "в реальных размерах" (как Вы упорно хотите) - никакие слои не нужны. Не понимаю в чем сложности? Напр расстояние от Земли до солнца 150 * 1.0e+6 км - ну и положите его равным 150. Точно так же все размеры планет поделите на 1.0e+6 км. Визуально ничего не изменится (вспомните подобие треугольников). Для звезд это не проходит - с ними работайте по углу, об этом уже говорили.
Я отдалюсь от корабля на 150 метров и корабль "влетит" в солнце. А земля?

p.s. space engine лучшее из того что я видел в плане космоса, а по графике и подавно. Там используют слои, вот я и думаю какие способы реализации слоев в opengl еще есть.