获取网格中可见体素的列表

时间:2011-07-15 06:39:22

标签: python voxels

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

我愿意使用像NumPy或SciPy这样的外部模块,虽然他们的一些文档有点过头了。或者,迭代每个块并获得邻居列表也是可以接受的,尽管用Python而不是C进行这些计算的性能成本非常高。

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

2 个答案:

答案 0 :(得分:4)

如果您只需要执行一次,性能不应成为问题。如果您在更改世界时也逐步更新块的.isBoundary属性,则无需再次执行此操作。

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

答案 1 :(得分:2)

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