用于碰撞检测实现的四叉树

时间:2015-01-26 16:14:48

标签: c++ tree quadtree

我正在尝试为我的3D环境创建一个四叉树(所有元素都在平坦的地形上,所以它们可以用二维数据表示),但我在实现更精细的部分时有点迷失。它

我将首先描述我当前的四叉树,然后继续讨论它的缺陷,然后再问问题。

我目前拥有的是一个四叉树,它采用一个非常特定的矩形,我在其中定义x,z,width和forward。以下是我的操作概述。

将对象插入四叉树:

检查当前节点是否有子节点。如果是,请检查对象是否能够完全适合四个节点中的任何一个。如果可能,递归并重复。如果对象不完全适合四个节点或者根本没有节点,它会将它添加到std向量,而不是检查它是否应该拆分。如果它分裂,则将其拆分并将当前对象拆分为各自的节点。

从四叉树中删除对象:

检查对象是否在当前节点内。而不是儿童。如果找到,则将对象弹出向量。

更新四叉树:

移动和静态对象存储在不同的四叉树中。移动四叉树将始终删除移动和重新插入的任何内容。静态四叉树只是发冷。

检索对象

首先找到它所属的四个节点中的哪一个,然后递归移动,获取所有节点的当前对象并将其添加到最后返回的向量中。

所以这是我的缺陷:并非我的所有作品都位于树叶中。我不知道我应该对那些在节点之间相交的人做些什么。这也使得碰撞检测检查在四叉树中有点愚蠢;为什么我需要将rects放在父节点中?我对Retrieve对象函数非常不满。

我的第二个缺陷是我只能使用矩形。虽然这对于制作四叉树和调试它很有用,但我想继续前进并能够直接将我的对象放入我的游戏中。

所以这是我的问题 我读过Quadtree for 2D collision detection。一切似乎都足够好,直到“对象可以属于四叉树内的几个集合。你需要在四叉树之外需要一个额外的线性集合来枚举每个没有重复的对象。”

我不知道这意味着什么,或者如何做到这一点。碰撞检测的操作似乎也比我现在的要好得多。我想知道他的意思和完成方式。

我的第二个问题是关于将对象插入树中。我在游戏中的所有对象都将成为基类的一部分。我应该让他们直接添加基类吗?或者我应该将对象转换为rects而不是添加指向对象的指针?我正在为我的游戏加载一些模型,它们被拉伸并用glScalef()进行游戏。因此,在缩放之后获得缩放和模型的位置似乎非常困难(但可能)。

另一方面,我缩放模型的主要原因是因为我基本上是为迷宫游戏制作墙。所以我需要他们完美地适应,我不能在玛雅数学。

2 个答案:

答案 0 :(得分:1)

你如何使用四叉树的3D?也许你的意思是2d?因为通常八叉树用于3d。 关于你的第一个问题。您的对象可能属于四叉树中的多个四边形。当您检索对象时,您需要检查与您的碰撞,只需检查您是否已检测到两个对象之间的碰撞,如果您这样做,则不要再次进行检测以绕过重复。例如,一个四边形中有2个对象。检查第1和第2之间的碰撞,然后检查第2和第1之间的碰撞。您需要先检查是否已检测到此冲突。

请尝试阅读this链接了解详情。

答案 1 :(得分:0)