【问题标题】:Get list of visible voxels in a grid获取网格中可见体素的列表
【发布时间】:2011-10-05 22:06:15
【问题描述】:

我正在开发一款 Minecraft 风格的游戏,我需要一种方法来减少渲染世界的数量。目前,我正在使用一种天真的、渲染一切的方法,它存在明显的缩放问题。我需要一种方法来获取一组方块,并以某种方式找出哪些方块正在接触空气、水或任何其他半透明方块。

我对使用 NumPy 或 SciPy 等外部模块持开放态度,尽管他们的一些文档让我有点不知所措。或者,遍历每个块并获取邻居列表也是可以接受的,尽管在 Python 而不是 C 中进行这些计算的性能成本会相当高。

作为记录,我已经尝试查看 NetworkX,但它似乎更多地用于科学分析或寻路,而不是可见性检查。

【问题讨论】:

    标签: python voxels


    【解决方案1】:

    如果您只需要这样做一次,性能应该不是问题。如果您还可以在世界发生变化时增量更新方块的.isBoundary 属性,您将永远不必再这样做了。

    但是,如果您的世界太大或充满洞和洞穴以及透明交错与非透明,您仍然会遇到问题。如果您需要动态确定什么是可见的,您可以保留一个八叉树 (http://en.wikipedia.org/wiki/Octree),您可以在其中拥有巨大的空气/水/等。作为单个节点(巨型块),标记为“透明”。然后使用“paintbucket”算法(修改为执行 Dijkstra 算法,因此很容易通过检查当前块和原点之间是否存在块来检测您何时“绕过拐角”)快速找出哪个块就在眼前。如果玩家移动缓慢,远距离事物的更新可能会显着延迟。

    【讨论】:

    • 听起来是一种相当可靠的技术,即使它比我想要的要多一点。是否有一些图书馆可以为我做到这一点?我不能为性能编写自己的 C,我希望在整个开发过程中尽可能多地保留。
    • @James:一般来说,不应该考虑降级到较低级别的语言来提高性能,除非你正在编写一个庞大的程序,你已经隔离了一个关键部分,并且回报是巨大的(例如新用户、大额现金红利等)。不过,对此的看法可能有所不同。我建议看看 MMORPG 和其他 3d 游戏如何解决这些规模问题;它可能是一个已解决的问题,也可能不是(由于游戏的块状性质)。除此之外,您的解决方案很容易编写几行代码并进行测试,看看您现在是否真的需要更大的枪。
    【解决方案2】:

    您可以使用Z-Buffer 解决方案。关于速度,我会尽可能多地用 python 编写并使用pypy。我相信 EVE Online(一款成功的 3D MMO)是用 stackless python 编写的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2012-12-23
      • 2021-04-10
      • 1970-01-01
      相关资源
      最近更新 更多