Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kamil от Август 05, 2016, 19:48



Название: Сцена на QML Qt3D
Отправлено: kamil от Август 05, 2016, 19:48
Я хочу сделать простую сцену на Qt3D QML, в которой присутствуют:

- поверхность земли, на которую натянуты тайлы текстуры земли. Текстуры по надобности подгружаются из сети, например, через API OpenMap. Рельеф поверхности брать из Google Elevation API.
- различные динамичные элементы состоящие из примитивов, с возможностью взаимодействовать с пользователем (обработка событий клика, перетаскивания).

Я пока вижу это так, что загрузка рельефа и текстуры пишется на C++, а отрисовка сцены на QML при помощи Qt3D. Но опыта работы с Qt3D или QML у меня нет, так что у меня есть вопросы:

1. Имеет ли смысл в данном случае использовать Qt3D на QML? Может лучше OpenGL или еще что-то другое?
2. Как организовать передачу текстур от кода C++ к коду QML? Я пока попробовал реализовать QQuickAsyncImageProvider, но пока реализовать то что хотелось не получилось. Может кто видел примеры работы QQuickAsyncImageProvider?
3. Как на Qt3D определить видимую чаcть сцены, чтобы вычислить координаты текстур, которые нужно загрузить?
4. Имеется ли возможность у объектов Qt3D на QML реагировать на действия пользователя? Например вызывать обработчик клика?
3. Может у вас появятся какие дополнительные предложения и соображения?


Название: Re: Сцена на QML Qt3D
Отправлено: Igors от Август 06, 2016, 06:14
Мои (слабые) попытки задействовать Qt3D ничего не принесли. С одной стороны, объем переделок под него у меня получается огромный, а с другой неочевидно что можно с него поиметь по сравнению с "просто OpenGL".

Я пока вижу это так, что загрузка рельефа
Ну рельеф надо (откуда-то) иметь. И там тоже должен быть LOD (или его аналог)

3. Как на Qt3D определить видимую чаcть сцены, чтобы вычислить координаты текстур, которые нужно загрузить?
Во всяком случае это можно сделать штатными средствами OpenGL, в библии есть пример. В общих чертах - присваиваете тайлу какое-то ID и рисуете в специальном режиме, потом забираете "ответ" (подробности уже не помню)

По поводу текстур - возможно опасения преувеличены. Видимость тайла однозначно определяет какие текстуры должны быть загружены, поэтому почему не просто кеш, напр QCache?
 


Название: Re: Сцена на QML Qt3D
Отправлено: kamil от Август 09, 2016, 02:14
Мои (слабые) попытки задействовать Qt3D ничего не принесли. С одной стороны, объем переделок под него у меня получается огромный, а с другой неочевидно что можно с него поиметь по сравнению с "просто OpenGL".

Я пока вижу это так, что загрузка рельефа
Ну рельеф надо (откуда-то) иметь. И там тоже должен быть LOD (или его аналог)
 

Данные о рельефе и текстурах есть, с этим проблем нет. Проблема в том, как это отрисовать, и какие технологии при этом использовать.

Как я понял, все это можно сделать на OpenGL с использованием библиотек. Может подскажете какие именно?

С другой стороны Qt3D есть два преимущества, которые для меня важны. Во-первых на сколько я понял это просто обертка для OpenGL/OpenGL ES. А значит один код для всех поддерживаемых платформ. Во-вторых для простых задач кода придется написать поменьше чем при использовании OpenGL.

За последние пару дней исследования и редактирования примеров Qt3D кое-что начало проясняться. Некоторые вопросы отпали и остались такие:

1. Можно ли создать QEntity в С++, и потом использовать его в QML? Например как-то так:
Код:
//C++
class MapEntity : public Qt3DCore::QEntity {
    MapEntity( Qt3DCore::QEntity* parent ) : Qt3DCore::QEntity(parent) {
        ...
    }
}

// QML
Scene3D {
    MapEntity {
        id: map
        ...
    }
}

2. Вопрос с событиями для Entity остался. Можно ли назначить обработчик на щелчек мышью по Entity? В примерах я не нашел.


Название: Re: Сцена на QML Qt3D
Отправлено: Igors от Август 09, 2016, 09:05
Данные о рельефе и текстурах есть, с этим проблем нет. Проблема в том, как это отрисовать, и какие технологии при этом использовать.
Я бы сначала вцепился в геометрию (рельеф). В каком формате эти данные? От этого и зависит выбор технологии


Название: Re: Сцена на QML Qt3D
Отправлено: kamil от Август 09, 2016, 11:49
Данные о рельефе и текстурах есть, с этим проблем нет. Проблема в том, как это отрисовать, и какие технологии при этом использовать.
Я бы сначала вцепился в геометрию (рельеф). В каком формате эти данные? От этого и зависит выбор технологии
Данные о рельефе планируется получать из Google Elevation. То есть высота конкретной точки над уровнем моря.
Например видимый участок карты разбить на сетку 10x10 и запросить высоту этих 100 точек. Потом на основании этих данных построить поверхность.


Название: Re: Сцена на QML Qt3D
Отправлено: Igors от Август 09, 2016, 16:29
Данные о рельефе планируется получать из Google Elevation. То есть высота конкретной точки над уровнем моря.
Например видимый участок карты разбить на сетку 10x10 и запросить высоту этих 100 точек. Потом на основании этих данных построить поверхность.
Тогда на какое "квачество" Вы рассчитываете? Беда (или основная проблема) "terranizer"(ов) в нехватке геометрии. Меш 10x10 - это кошкины слезы. Даже 100x100 не особо, а ведь это уже 10K вертексов нормали которых надо обсчитать. Дальнейшее увеличение разрешения еще больше садит fps при скромном приросте качества. Обычно это решают картами нормалей и/или бампа. Поэтому может поискать решения/технологии сначала в этом направлении (желательно на GPU). С диффузными текстурами (просто цвет) легче, но со слабенькой геометрией они мало помогут