C++ 碰撞检测的四叉树实现

C++ 碰撞检测的四叉树实现,c++,tree,quadtree,C++,Tree,Quadtree,我正在尝试为我的3D环境创建一个四叉树(所有元素都位于平坦的地形上,因此它们可以用2D数据表示),但我对它更精细部分的实现有点迷茫 我将首先描述我当前的四叉树,然后继续讨论它的缺陷,然后提出问题 我现在有一个四叉树,它接受一个非常特定的矩形,在这个矩形中我定义了x、z、宽度和前进方向。以下是我的操作概述 将对象插入四叉树: 检查当前节点是否有任何子节点。如果是,请检查对象是否能够完全适合四个节点中的任何一个。如果可能,递归并重复。如果对象不完全适合这四个节点,或者根本没有节点,它会将其添加到标准

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

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

我现在有一个四叉树,它接受一个非常特定的矩形,在这个矩形中我定义了x、z、宽度和前进方向。以下是我的操作概述

将对象插入四叉树:

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

从四叉树中删除对象:

检查对象是否在当前节点内。而不是转移到孩子身上。如果找到,将对象从向量中弹出

更新四叉树:

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

检索对象

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

所以这里是我的缺陷:并非我所有的矩形都位于叶中。我不知道应该如何处理节点之间相交的节点。这也使得四叉树中的碰撞检测检查有点愚蠢;为什么我需要在父节点中放置矩形?我对检索对象函数非常不满意

我的第二个缺点是我只能接受一个矩形。虽然这在制作四叉树和调试它时很有用,但我希望继续前进,能够直接将我的对象放在游戏中

以下是我的问题 我读过。一切似乎都很好,直到“对象可以属于四叉树内部的多个集合。您将需要四叉树外部的额外线性集合来枚举每个不重复的对象。”

我不知道这意味着什么,也不知道怎么做。碰撞检测的操作似乎也比我目前拥有的要好得多。我想知道他是什么意思,是怎么做到的

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


另一方面,我之所以要缩放模型,主要是因为我基本上是在为迷宫游戏制作墙壁。所以我需要它们完美地围绕在一起,而我无法在maya上进行数学运算。

你可以尝试使用莫顿曲线来找到重叠区域,我还认为你需要一个八叉树:。下面是重叠对象的示例:

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


请尝试阅读链接了解详细信息。

您能更具体地告诉我为什么需要使用此链接吗?我看不出它的应用。@user2418426:四叉树不是2d的吗?我认为这没关系。即使我制作了一个八叉树,我也不会使用它的3D部分,因为我的场景中的对象之间不会有Z差。@user2418426:我的意思是莫顿曲线可以帮助找到重叠的对象!?谢谢你的链接!它在回答我的一些问题时非常有用。但是,我注意到,如果对象不完全适合rect,它将被丢弃。这应该是故意的吗?我之所以可以将四叉树用于3D,是因为它是一个平坦的地形,因此所有东西都只能用2D数据表示。编辑:我的错。我误读了文章中的一些措辞。它确实处理交叉点。如果一个对象不适合矩形,它不会被丢弃,而是被添加到四边形中。对象只有在矩形中没有其任何部分时才会被丢弃。