【问题标题】:How to organise the structure of a 3D game?如何组织一个3D游戏的结构?
【发布时间】:2010-12-07 00:47:39
【问题描述】:

这是一个有点模糊的问题,但请耐心等待。我正在使用 Python/Pyglet 和 openGL 编写游戏。我目前的结构是有一个名为“世界”的对象,其中是其他对象,其中包含其他对象等。我这样做是因为例如游戏的一部分是一个平台,上面有其他对象,当我倾斜平台时,我希望平台上的物体随之倾斜。所以我做了platform.draw(),它调用了glRotate、glTranslate,然后绘制了每个保存模型视图矩阵的对象,这样平台上的所有对象都一起移动。 第一个问题是,这是一种合理的组织方式还是我应该使用其他方法?

我没有相机课程,目前我只是在翻译整个世界或其中的一部分以产生运动的错觉。但是,将来我希望能够在对象之间切换视点,例如从从上方俯视世界切换到从世界中的一个对象的第一人称视图。那么第二个问题是什么是构建我的程序以便在未来可以实现的最佳方式?

【问题讨论】:

    标签: python architecture 3d pyglet


    【解决方案1】:

    可能不是一个完整的答案,但我认为完整的答案需要一整本书......

    您在层次结构中对世界的表示与通常所说的“场景图”非常相似,在许多情况下这是一个好主意。一个很好的图书馆例子就是Open Scene Graph

    关于“平移世界”,除非你真的每次都在变换所有顶点,否则也完全没问题。这只是相对角度的问题,您真正拥有的与相机矩阵相同。您可以将转换视为将相机放置在世界中,或者将世界移动到相机前面。

    【讨论】:

    • 问题是,当我想对我世界中的一个对象做某事时,我不得不做 world.object1.object2.object3.do_something(),它变得有点难看。我还必须将指向世界其他地方的指针传递给每个对象,并不是说这真的是一个大问题。
    【解决方案2】:

    您可以将逻辑放入单独的模块/单独的类/函数中。 在我的 2D 游戏中,我有一个 GameLogic 类,它简化了为某些事件注册它的方法或安排它们(以及取消注册+取消安排它们),我创建了一个 @state_wrapper 装饰器,它注入一个简单的新型对象作为状态-该方法的存储。如果您这样做,您不必将指针传递给您的所有世界对象,只有事件方法必须访问您的对象。

    但我不会说这是最好的解决方案;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 2011-08-06
      相关资源
      最近更新 更多