Советы по настройке сцены Qt3D с избыточными объектами

Я новичок в модуле Qt3D и в настоящее время пишу игру на Qt5 / C ++ с использованием Qt3D. Этот вопрос о «Я на правильном пути?» или «Можете ли вы дать мне несколько советов по …».

Сцена игры имеет статическую часть («мир») и некоторые объекты (здания и подвижные объекты). Некоторые здания могут быть оживлены в будущем, но большинство из них очень статичны (но, конечно, разрушаемы).

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

Избыточные объекты на сцене:

Конечно, объекты совместно используют одну и ту же библиотеку зданий / подвижных единиц, поэтому было бы глупо загружать модели для этих объектов на графическую карту для каждого экземпляра такой единицы. Я прочитал документацию по QGLSceneNode, из которой я предполагаю, что он предназначен для совместного использования одного и того же QGeometryData между несколькими узлами сцены, но применяет различные преобразования, чтобы размещать объекты на разных позициях в моей сцене. Я думаю, что использование одного и того же QGLSceneNode для всех экземпляров здания было бы неправильным способом.

В настоящее время у меня есть единица «библиотечный класс», сообщающая мне свойства каждого типа строительного / подвижного объекта, в том числе геометрию, включая текстуры. Теперь я бы предоставил QGeometryData для каждого здания в этом библиотечном классе, который загружается при загрузке игры (если я решу сделать это для все здания при запуске …).

При создании нового экземпляра модуля я бы сейчас создал новый QGLSceneNode, запросил QGeometryData (который является явно открытым) из библиотеки и установил его на узле. Затем я установил преобразование для этого нового узла и поместил его в мою сцену. Это приводит нас ко второй части моего вопроса:

Управление сценой в целом:

Моя «сцена» в настоящее время не является ни QGLSceneNode, ни QGLAbstractScene, а структурой некоторых QGLSceneNode, по одному для каждого объекта (или коллекции объектов) в сцене. Я вижу три подхода:

  • Мой текущий подход, но я думаю, что это «неправильный путь».

  • Композиция: Помещение всего как дочерних узлов в один корневой QGLSceneNode. Это казалось правильным для меня, пока я не понял, что очень сложно получить доступ к определенным узлам в такой композиции. Но когда мне вообще понадобится получить доступ к таким «конкретным» узлам? Большинство операций требуют учета всех узлов (их рендеринга, обновления позиций для анимации) или даже работают на основе сигнальных слотов, поэтому мне даже не нужно искать узлы вручную. Например, анимация может быть сделана с использованием QPropertyAnimations. Действия с событиями также можно выполнить, подключив объект QObject в ядре игрового движка (все здания являются объектами QObject в основной части движка) с соответствующим QGLSceneNode.

    Но у этого подхода есть другой недостаток: во время рендеринга мне может понадобиться изменить некоторые свойства QGLPainter. Я не уверен, какие свойства мне нужно изменить, потому что я недостаточно знаю Qt3D и не могу догадаться, что можно сделать без изменения свойств (например: использование определенного шейдера для рендеринга определенного узла сцены) ,

  • Затем я обнаружил QGLAbstractScene, но не вижу преимуществ по сравнению с двумя вышеупомянутыми решениями, поскольку не могу определить процесс рендеринга на сцене. Но, может быть, это не то место, где его определить?

Каков наилучший подход к управлению такой сценой в Qt3D?

Под «лучшим» я имею в виду: что я собираюсь сделать неправильно? Что я могу сделать лучше? Какие еще вещи я должен принять во внимание? Я пропустил что-то важное в библиотеке Qt3D?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …