当前位置: 首页 > 知识库问答 >
问题:

用于冲突检测实现的四叉树

娄振
2023-03-14

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

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

我目前拥有的是一个四边形树,它接受一个非常具体的矩形,我在其中定义了x,z,宽度和前向。以下是我的操作概述。

将对象插入四元树:

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

从四叉树中删除对象:

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

更新四叉树:

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

检索对象

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

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

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

因此,这是我读过的Quadtree for 2D碰撞检测的问题。一切似乎都足够好了,直到“对象可以属于四边形树内的多个集合。你将需要在四边形之外有一个额外的线性集合来枚举每个对象,而不会有重复项。

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

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

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

共有2个答案

祝宾白
2023-03-14

你可以试着用莫顿曲线来寻找重叠区域。我还认为你需要一个八叉树:http://dmytry.com/texts/collision_detection_using_z_order_curve_aka_Morton_order.html.以下是重叠对象的示例:https://books.google.fr/books?id=1mu099DN9UwC

邢寒
2023-03-14

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

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

 类似资料:
  • 我只使用Box2D进行碰撞检测。我的代码与Ray Wenderlich教程中的代码类似。 我遇到了这个方法的问题。由于代码绕过了Box2D模拟,因此没有碰撞响应。因此,精灵可以重叠。我知道Box2D冲突API提供了一个单位法向量来帮助解决冲突。然而,这个矢量传达的是方向,而不是大小。因此,我无法确定应该将重叠的sprites移动多远。有人知道如何使用Box2D冲突API手动解决重叠问题吗?

  • 我试图在C语言中实现一个四叉树,但是我有一个读访问冲突,我花了几个小时试图弄清楚。请注意,我已将所有成员变量公开,仅用于调试工作。 每当我试图细分一个象限,即根象限,我得到 抛出异常:读取访问冲突。标准::_Vector_alloc 四叉树由一个指向连续象限数组的指针和点组成。这些指针被传递到每一个象限,所以它们能够写入而不需要复制。 我做错了什么?你能提出改进的建议吗? 这是我的四叉树类: 四叉

  • 我有一个2维数组叫做,也就是32x32。每个元素表示清除路径,表示墙。 窗口分辨率为800x800,这意味着

  • 问题内容: 如何检测两个元素是否发生冲突? 这两个div是简单的彩色框,彼此垂直,因此没有复杂的形状或角度。 问题答案: 一般思路-获得框的偏移量和尺寸,并检查它们是否重叠。 如果要更新,可以使用: 另外,请注意,您可以针对特定示例优化功能。 因为它们是固定的,所以您不必重复读取框的尺寸(就像我在代码中一样)。您可以在页面加载时读取它们(将其读取到变量中),然后仅读取变量 小盒子的水平位置不会改变

  • 我正在尝试为我的大学工作制作一个基于2D平台的游戏(在SFML)。我不是要求任何人为我编写一些代码,但如果有人能提供一些指示,我将非常感激:) 目前我有大约13门课,包括: BaseEntity(大多数游戏对象都是由此派生的) 玩家(继承自BE) 魔法宝石(玩家需要这些来通过关卡晋级) 平台 SolidBlock(从平台继承) 可以说,我已经构建了大部分的游戏“积木”--每个类都有自己的更新函数,

  • 下面的代码只是从屏幕顶部创建小正方形,然后移动到底部。我还有一个UIImageView(播放器),它由x轴上的加速计控制。目标不是接触动画对象。就像一个简单的比赛游戏。虽然我没有错误,但我无法检测到碰撞。我在代码中找不到错误。有什么问题吗?