3

我是 Qt3D 模块的新手,目前正在使用 Qt3D 在 Qt5/C++ 中编写游戏。这个问题是关于“我在正确的道路上吗?” 或“你能给我一些关于......的建议吗?”。

游戏的场景有一个静态部分(“世界”)和一些对象(建筑物和可移动单位)。一些建筑物在未来可能会被激活,但其中大部分是非常静态的(但当然是可破坏的)。

我将问题分为两部分:如何处理放置在场景中不同位置的相同模型的副本以及如何在查看器类中将场景作为一个整体进行管理。

场景中的冗余对象:

当然,这些对象共享相同的建筑物/可移动单元库,因此对于此类单元的每个实例,将这些对象的模型上传到图形卡将是愚蠢的。我通读了 QGLSceneNode 的文档,从中我猜它旨在在多个场景节点之间共享相同的 QGeometryData,但应用不同的转换以便将对象放置在场景中的不同位置。我猜,为建筑物的所有实例共享相同的 QGLSceneNode 是错误的方式。

我目前有一个单元“库类”,告诉我每种类型的建筑物/可移动单元的属性,其中包括几何图形,包括纹理。现在,我将为这个库类中的每个建筑物提供一个 QGeometryData,它在游戏的加载过程中上传(如果我决定在启动时对所有建筑物执行此操作......)。

创建单元的新实例时,我现在将创建一个新的 QGLSceneNode,从库中请求 QGeometryData(显式共享)并将其设置在节点上。然后我为这个新节点设置转换并将其放入我的场景中。这将我们引向我问题的第二部分:

整体管理场景:

我的“场景”目前既不是 QGLSceneNode 也不是 QGLabstractScene,而是一些 QGLSceneNodes 的结构,一个用于场景中的每个对象(或对象集合)。我看到三种方法:

  • 我目前的方法,但我想这是“错误的方法”。

  • 组成:将所有内容作为子节点放在一个根 QGLSceneNode 中。这对我来说似乎是正确的方法,直到我意识到在这样的组合中访问特定节点非常困难。但是我什么时候甚至需要访问这样的“特定”节点?大多数操作需要考虑所有节点(渲染它们,更新动画位置),甚至在信号槽基础上操作,所以我什至根本不需要手动找到节点。例如,动画可以使用 QPropertyAnimations 完成。也可以通过将游戏引擎核心中的QObject(所有建筑物都是引擎核心部分中的QObject)与相应的QGLSceneNode连接来对事件进行操作。

    但这种方法还有另一个缺点:在渲染过程中,我可能需要更改 QGLPainter 的一些属性。我不确定我需要更改哪些属性,这是因为我对 Qt3D 了解不够,无法猜测不更改属性可以做什么(例如:使用特定着色器渲染特定场景节点) .

  • 然后我找到了QGLAbstractScene,但是和上面的两种方案相比,我看不出有什么优势,因为我无法定义场景中的渲染过程。但也许它不是定义它的正确位置?

在 Qt3D 中管理这样一个场景的最佳方法是什么?

“最好”是指:我会做错什么?我能做些什么更好?我还应该考虑哪些其他事项?我是否忽略了 Qt3D 库中的任何重要内容?

4

0 回答 0