如何将quad / oct树用于块世界

时间:2012-07-16 12:55:32

标签: c++ quad octree

在过去的几天里,我一直在搞乱八叉树和四叉树。我可以构建它们,迭代它们,并吐出我需要的信息。我也知道它们在碰撞检测中非常有用,你可以在屏幕上将其细分为较小的部分,以便能够在特定部分检测屏幕上的移动,而不是一直遍历整个屏幕。但是,我无法理解如何使用八叉树或四叉树来生成立方体类型的世界。

以下是我一直在思考的一些想法:

1)使用quad / oct树细分集合立方体(10x10x10),并将其细分直至至少一片叶子均匀;然后删除所有其他不统一的叶子,为您提供多维数据集的变体大小。

2)您将空间(x,y,z)中的一个点细分,直到获得一个至少有一个叶子具有相同大小或达到节点深度的立方体,并使用所有这些位置(x,y,z)作为不同类型块的位置。

任何人都可以解释在构建这样的3D环境时使用八叉树或四叉树的逻辑吗?它是基于x,y,z还是基于恒定的立方体测量?我不确定如何继续。

2 个答案:

答案 0 :(得分:1)

Octree's真正帮助你专注于保持你的立方体世界块被分成相等的部分。他们玩的诀窍在于,当你继续将多维数据集输入Octree分支时,你会自动将它们细分为以后可以在邻近基础上提取的碎片(即Chunk01(128,0,0)Chunk02(256,0,0) )等。)

当您将多维数据集存储到八叉树中时,您还可以定义它们的“类型”(材料或某种描述它们的枚举)。通过这样做,你也允许八叉树将这些立方体组合在一起,如果它们成为邻居(即草,石头,沙子等)。然后,这使八叉树算法能够为您处理一些智能,围绕如何将它们折叠/压缩成1x更大的方形/矩形基元,从而减少多维数据集计数。

在一天结束时,您有两种方法来进行立方体世界,第一种是您希望最终用户相信您一次创建了1x世界多维数据集,但实际上您实际上是在合并网格/顶点计算这种幻觉作为一个表面的大块实际上只是1x大网格而不是100多维的立方体。只有当用户与多维数据集交互(即删除/添加)时,才会重新计算网格,并将多个多维数据集的幻觉变为现实。但是,您可以立即将其交换回一个巨大的合并网格。

一旦你的八叉树运行并且你的块整合成单个网格形式(通过将一个顶点阵列送入GPU缓冲区),你还需要在八叉树外进行一些额外的工作来进行剔除。有很多方法你可以做到这一点,音量剔除(光线追踪)通常是我发现最推荐的,但我认为这可以做得更好。

在我的例子中:https://vimeo.com/71330826我基本上采用不同的方式,因为我知道相机中心点在哪里,我也跟踪相机朝向的方向,然后基本上将其用作接近聚焦剔除因此,如果有问题的块在摄像机后面,我会消灭它们,从而减少我的GPU负载。

另外你会注意到每个“Chunk”仍然可以在外面看到它的面部,因为我剔除了每个chunk的内部被创建但是如果每个Chunk正在处理它自己的工作量我仍然渲染实际的块相机下方的“墙壁”...我后来通过跟踪用户的Z深度和相机界限来修复

答案 1 :(得分:0)

四叉树是二维的,因此用它们来表示三维空间真的没有意义。

有多种方法可以使用八叉树。如果使用固定数量的常量和大小的立方体,则实现肯定更简单。但是,这几乎肯定不一定是最有效的实现,而四/八项都是关于效率的。