【问题标题】:How to use a quad/oct tree for a block world如何在方块世界中使用四叉树/八叉树
【发布时间】:2012-07-16 12:55:32
【问题描述】:

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

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

1)您使用四边形/八角树细分一个集合立方体(10x10x10),并细分它直到至少有一个叶子是均匀的;然后删除所有其他不均匀的叶子,为您提供不同大小的立方体。

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

谁能解释在构建这样一个 3D 环境时使用八叉树或四叉树背后的逻辑?它是基于 x、y、z 还是基于恒定的立方体测量?我非常不确定如何进行。

【问题讨论】:

  • 八叉树的大小和深度与叶子节点的大小差不多,它们是可逆的。一个大小为 (x, y, z) 的八叉树有 10 个分割,其叶大小为 (x, y, z)/2^10。

标签: c++ octree


【解决方案1】:

八叉树确实可以帮助您专注于将立方体世界块分成相等的部分。他们玩的技巧是,当您不断将立方体放入八叉树分支时,您会自动将这些细分为您以后可以在接近的基础上提取的部分(即 Chunk01(128,0,0) Chunk02(256,0,0 ) 等等..)

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

归根结底,您有两种处理立方体世界的方法,第一种是您希望最终用户相信您一次制作了 1 个立方体,但实际上您实际上是在合并您的网格/顶点算上这种错觉,因为一块表面实际上只是 1 倍大的网格,而不是 100 个立方体。只有当用户与立方体交互(即删除/添加)时,您才会重新计算网格并将多个立方体的幻觉变为现实......但随后您会立即将其换回一个巨大的合并网格。

一旦你的八叉树运行并且你将你的块合并为单个网格形式(通过将顶点数组馈送到 GPU 缓冲区中),你还必须在八叉树之外围绕剔除做一些额外的工作。有很多方法可以做到这一点,体积剔除(光线追踪)通常是我发现最推荐的方法,但我认为这可以做得更好。

在我的示例中:https://vimeo.com/71330826 我基本上以不同的方式处理它,因为我知道相机中心点在哪里,并且我还跟踪相机面向的方向,然后基本上将其用作邻近聚焦剔除,如果有问题的块在相机后面,我摧毁了它们,减少了我的 GPU 负载。

您还会注意到,每个“块”的外部仍然可见,因为我从创建的每个块的内部剔除,但鉴于每个块都在处理自己的工作负载,我仍然渲染实际块相机下方的“墙”……我后来通过跟踪用户的 Z 深度和相机边界来修复它

【讨论】:

    【解决方案2】:

    四叉树是 2D 的,所以用它们来表示 3D 空间真的没有意义。

    有多种使用八叉树的方法。如果您使用固定数量的等长立方体,实现肯定会更简单。然而,这几乎肯定不一定是最高效的实现,四叉树/八叉树都是关于效率的。

    【讨论】:

    • 四叉树主要是 2D,它们可以是“2.5D”(也可以存储高度)。我真的很想要一个六角树的用途,但是很难把你的头绕在第 4 维上。你无法再将其可视化,但它仍然具有数学意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2017-08-09
    相关资源
    最近更新 更多