Russian Qt Forum
Март 29, 2024, 17:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сцена на QML Qt3D  (Прочитано 5079 раз)
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. Может у вас появятся какие дополнительные предложения и соображения?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Август 06, 2016, 06:14 »

Мои (слабые) попытки задействовать Qt3D ничего не принесли. С одной стороны, объем переделок под него у меня получается огромный, а с другой неочевидно что можно с него поиметь по сравнению с "просто OpenGL".

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

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

По поводу текстур - возможно опасения преувеличены. Видимость тайла однозначно определяет какие текстуры должны быть загружены, поэтому почему не просто кеш, напр QCache?
 
Записан
kamil
Гость
« Ответ #2 : Август 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? В примерах я не нашел.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 09, 2016, 09:05 »

Данные о рельефе и текстурах есть, с этим проблем нет. Проблема в том, как это отрисовать, и какие технологии при этом использовать.
Я бы сначала вцепился в геометрию (рельеф). В каком формате эти данные? От этого и зависит выбор технологии
Записан
kamil
Гость
« Ответ #4 : Август 09, 2016, 11:49 »

Данные о рельефе и текстурах есть, с этим проблем нет. Проблема в том, как это отрисовать, и какие технологии при этом использовать.
Я бы сначала вцепился в геометрию (рельеф). В каком формате эти данные? От этого и зависит выбор технологии
Данные о рельефе планируется получать из Google Elevation. То есть высота конкретной точки над уровнем моря.
Например видимый участок карты разбить на сетку 10x10 и запросить высоту этих 100 точек. Потом на основании этих данных построить поверхность.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Август 09, 2016, 16:29 »

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


Страница сгенерирована за 0.072 секунд. Запросов: 22.