我认为大量阅读其他场景图技术正在做什么将为您带来很多好处。
背景
例如,查看Ogre3D描述。它是一个基于场景图的图形引擎,是开源的。我建议您看一下教程,看看如何使用场景节点(注意:我并不是在告诉您学习如何使用Ogre,而是告诉我们Ogre的场景节点和场景管理器具有哪些功能)
SceneNode文档:http ://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_scene_node.html
SceneManager文档:http ://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_scene_manager.html
以下链接还值得一看:http :
//sgl.sourceforge.net/#features
这是一个基于OpenGL的场景图解决方案,并且功能页显示了它可以包含的所有节点。
您的建议节点
我认为场景图应尽可能从游戏逻辑中抽象出来,这样就不会出现任何依赖关系问题。对于您的每个要点,我会说以下内容:
游戏演员,
我可能会拒绝。与Ogre相似,我将拥有一个基本的Entity类(其中将包含对象特定的逻辑)和一个带有Scene Node实体的Entity成员指针,以获取渲染对象的适当信息(位置,方向等)。
编辑:我不是说不要在这里的场景图中包括您的游戏演员(否则什么都不会出现:P)我是说要有一个引用逻辑游戏演员类的场景节点,所以您已经游戏对象的渲染和更新仍然松散耦合。
简单的静态游戏对象
是
游戏触发器?
不,对我来说,这听起来像是特定于游戏的逻辑。
游戏灯?
是
游戏摄影机?
是
武器子弹?
不能完全确定这一点,但我可能会说是,但是您可能希望所有子弹都作为子对象到达“ BulletCollection”父场景节点,这样您就可以缓存该位置,而不必遍历场景图需要删除并添加项目符号以进行渲染。
游戏爆炸和特效?
不确定,我让别人回答。
场景图覆盖率
如果级别相对较小,则应该能够将整个级别存储在场景图中,然后使用Octree(通常用于室外环境)或BSP树(通常用于室内环境)优化可见性。
如果您的关卡要大得多,并且您不想执行任何关卡加载,那么这将在流中发挥作用,但这完全是另一个问题。我将从一个较小的层次开始,然后逐步查看在不影响性能的情况下可以进行多大的调整。
结论
对我而言,场景图是游戏循环的“渲染”部分。您不应该将渲染和逻辑更新过于紧密地耦合在一起,否则您将遇到烦人的依赖问题。