【发布时间】:2015-03-25 02:21:23
【问题描述】:
我正在尝试为我的 3D 环境创建一个四叉树(所有元素都位于平坦的地形上,因此它们可以用 2D 数据表示),但我对实现更精细的部分有点迷茫它。
我将首先描述我当前的四叉树,然后讨论它的缺陷,然后提出问题。
我目前拥有的是一个四叉树,它包含一个非常特定的矩形,我在其中定义 x、z、宽度和向前。这是我的操作概述。
在四叉树中插入一个对象:
检查当前节点是否有子节点。如果是,请检查对象是否能够完全适合四个节点中的任何一个。如果可能,递归并重复。如果对象不完全适合四个节点或根本没有节点,它将把它添加到 std 向量中,而不是检查它是否应该拆分。如果分裂了,就分裂,把当前对象分裂成各自的节点。
从四叉树中删除一个对象:
检查对象是否在当前节点内。比转移到孩子身上。如果找到,将对象从向量中弹出。
更新四叉树:
移动和静态对象存储在不同的四叉树中。移动四叉树将始终删除已移动的内容并重新插入。静态四叉树简直令人毛骨悚然。
检索对象
首先找到它属于四个节点中的哪一个,然后递归移动,获取节点的所有当前对象并将其添加到最后返回的向量中。
所以这是我的缺陷:并非我的所有矩形都位于叶子中。我不知道应该如何处理节点之间相交的那些。这也使得四叉树中的碰撞检测检查有点愚蠢。为什么我需要将矩形放在父节点内?我对检索对象功能非常不满。
我的第二个缺点是我只能输入一个矩形。虽然这对制作四叉树和调试它很有用,但我想继续前进,能够直接将我的对象放入我的游戏中。
这是我的问题 我读过Quadtree for 2D collision detection。一切似乎都足够好,直到 “对象可以属于四叉树内的多个集合。您将需要四叉树外的额外线性集合来枚举每个对象而不会重复。”
我不知道这意味着什么,也不知道该怎么做。碰撞检测的操作似乎也比我目前拥有的要好得多。我想知道他的意思以及它是如何完成的。
我的第二个问题是关于将对象插入树中。我在游戏中的所有对象都将成为基类的一部分。我应该让他们直接添加基类吗?或者我应该将对象转换为矩形而不是添加指向对象的指针?我也在为我的游戏加载一些模型,它们被 glScalef() 拉伸和播放。因此,在缩放后获得模型的缩放和位置似乎真的很难(但可能)。
顺便说一句,我缩放模型的主要原因是因为我基本上是在为迷宫游戏制作墙壁。所以我需要它们完美匹配,而我无法在 Maya 上进行数学运算。
【问题讨论】: