在过去的几天里,我一直在混迹八叉树和四叉树。我可以构建它们,对其进行迭代,然后吐出我需要的信息。我也知道它们在碰撞检测中非常有用,在碰撞检测中,您将屏幕细分为更小的部分,以便能够检测特定部分的屏幕上的运动,而不仅仅是一直遍历整个屏幕。但是,我无法理解如何使用八叉树或四叉树来生成多维数据集类型的世界。
这是我一直在思考的一些想法:
1)您使用四叉树/八叉树对一组立方体进行细分(10x10x10),然后对其进行细分,直到至少一片叶子均匀为止;然后删除所有其他不统一的叶子,为您提供不同大小的多维数据集。
2)在空间(x,y,z)中细分一个点,直到得到一个至少具有相同大小或到达节点深度的叶子的多维数据集,然后使用所有这些位置(x, y,z)作为不同类型块的位置。
谁能解释在构建这样的3D环境中使用八叉树或四叉树背后的逻辑?是基于x,y,z还是基于恒定的立方测量?我不确定如何进行。
最佳答案
Octree确实可以帮助您专注于将多维数据集世界块分成相等的部分。它们发挥的技巧是,当您不断将多维数据集馈入Octree分支时,您会自动将它们细分为片段,稍后可以在邻近的基础上提取它们(即Chunk01(128,0,0)Chunk02(256,0,0 )等。)
当您将多维数据集存储到八叉树时,您还定义了它们的“类型”(描述它们的 Material 或某种枚举)。通过这样做,您还可以让Octree将这些多维数据集(如果它们成为邻居)(例如草,石头,沙子等)组合在一起。然后,这使得octree算法可以为您处理一些智能,包括如何将它们折叠/压缩为1倍大的正方形/矩形图元,从而使您减少立方体的数量。
归根结底,您有两种方法来处理多维数据集世界,第一种是希望最终用户相信您一次创建了1x多维数据集世界,但实际上您实际上是在合并网格/顶点数以得出作为表面块的错觉实际上只是1倍大的网格,而不是100的立方体。只有当用户与多维数据集进行交互(即删除/添加)时,您才重新计算网格并将多个多维数据集的幻象变为现实..但是您立即将其交换回大型合并网格。
一旦八叉树开始运行,并且您将大块合并为单个网格形式(通过将顶点阵列输入GPU缓冲区),您还必须在八叉树之外围绕剔除进行一些其他工作。有很多方法可以做到这一点,通常我最推荐使用体积剔除(光线跟踪),但是我认为这样做可以做得更好。
在这里的示例中:https://vimeo.com/71330826我基本上采用了不同的方法,因为我知道了相机的中心点在哪里,并且我还跟踪了相机所面向的方向,所以我基本上将其用作邻近焦点剔除,从而如果所讨论的块是在相机后面,我销毁了它们,从而减少了我的GPU负载。
您还会注意到,每个“块”仍在外面可见,因为我从创建时就剔除了每个块的内部,但是鉴于每个块都在处理自己的工作量,因此我仍然渲染实际的块“墙”在相机下方...我稍后会通过跟踪用户的Z深度和相机范围来进行修复