1

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

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

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

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

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

4

2 回答 2

2

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

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

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

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

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

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

于 2013-08-03T01:31:06.580 回答
0

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

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

于 2012-07-16T13:02:08.260 回答