有关使用冗余对象设置Qt3D场景的建议

时间:2012-09-09 18:33:40

标签: c++ qt opengl 3d qt3d

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

游戏场景有静态部分(“世界”)和一些物体(建筑物和可移动单元)。一些建筑物将来可能会被动画化,但大多数都非常静态(但当然是可以破坏的)。

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

场景中的冗余对象:

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

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

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

整体管理场景:

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

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

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

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

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

在Qt3D中管理此类场景的最佳方法是什么?

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

0 个答案:

没有答案