Articles of 四叉树

2D RTS游戏中的单位的高效容器

正如标题所说,我正在开发2D空间RTS游戏。 我所有的单位都是太空船,基本上只是互相射击,但他们也必须做很多其他的事情:他们必须“发现”(通知,绘制等)其他船舶和行星不属于所有者这艘船在这艘船的“扫描仪”的任意范围内(因为它们会被隐藏起来),如果这艘船被告知在敌船上开火,它需要find最近的敌人(如果没有射击范围),然后明显地射击。 我一直在想,如果将要有大量的船只(100到1000年),我可以使用什么样的高效数据容器?为什么? 另外值得注意的是,船只必须由船东区分(我可以和一个玩家开战,所以我显然不希望我的船只search其他玩家的船只),所有权可能会由一些整数1 =玩家1,2 =玩家2等)或者可能是“玩家”对象(0x4ff =玩家1,0x5ea =玩家2等)的唯一指针/存储器地址或其他一些简单的标识符。 我最初考虑使用vector数组(C ++),数组的索引代表玩家,每个vector都是属于该玩家的船只; 然后把所有属于你所参与战斗的玩家的所有船只放到一个优先队列中,这个优先队列的根将是最靠近一艘特定(友方)船只的敌方船只,并决定是否在范围之内,速度慢,内存昂贵,并没有真正解决如何扫描船舶/行星。 然后,我读了一些有关四叉树的相关文章,这导致了其他类似的树数据结构,如R树,也用于最佳空间查询,但我不完全明白它们是如何工作的,以及它们是否它们对我来说是最好的,所以我们在这里。

结合四叉树与基于目标的vector场,在Java?

前言 如果您对设置不感兴趣,请跳至问题本身 我正在研究一个“基于瓦片”(复杂的)自上而下的地牢爬行器 我已经实现了迷宫迷宫系统(比方形更圆,出口是迷宫的中心而不是边缘等),其读取像大型细胞/块,当玩家在相邻细胞时由反应扩散产生的特定房间细节这是可访问的,每当玩家进入范围意义时,都会这样做,探索的房间可以改变。 然后,我实现了一个Barnes-hut四叉树,用于检测实体和可破坏环境 我也有一个以玩家为中心的基于目标的vector场,有数百个小实体使用。 中,小型敌方单位在每个单元格范围外产生的视野范围内,只在当前单元格内产生。 除此之外,boss单位也会产生额外的敌方单位,并且可以在普通视图中这样做,boss单位在地图周围产生,现在我使用D * Litealgorithm来寻find当前玩家单元的path,虽然我以前实现了一个HPA *方法,我仍然有代码。 然后在随机环境的范围内交给vector场。 问题 我想,我的vector场比较庞大,需要缩小 题 在Java中,我可以实现我的vector字段作为我的四叉树的子公司,所以它只生成信息的单位在他们的地区? 如果是这样,一般意义上的情况如何? (或具体如果你真的觉得它) 增编/澄清 反应扩散产生的地形是可破坏的和变化的,迷宫的初始形态不变,不可破坏,大多数初级迷宫中只有9个细胞随时被记忆。 生成的地形被认为是对敌方单位的障碍物,因此vector场在所述区域被破坏之前不会产生所述区域的信息。 我试图在我的四叉树的叶子下面实现类似这样的事情(就像向量场一样,它只覆盖了玩家单元格),我也试过这个作为子节点的一部分。 到目前为止,我还没有能够正确地开展工作,我甚至不确定是否应该这样做,如果它是一个好主意,或者甚至是现实可能的话。 我的下一个猜测是尝试使用四叉树的更新方法来通知实体的向量字段,但我仍然不能完全弄清楚我该怎么做,只是这种模糊的感觉应该工作的具体情况。

扫和修剪与四倍树

我需要一些广泛的阶段algorithm为我的2D游戏(shmup,子弹地狱)。 一个或另一个解决scheme有什么主要优势?

碰撞检测:模拟令人费解的减速/如何有效地计算每个维度的极值

背景:正如这里所讨论的: 无界空间中的快速二维碰撞检测我正在研究一种用于模拟的碰撞检测algorithm。 这种情况的独特之处在于,模拟中的对象可能都在非常小的区域(例如1000×1000)或非常大的区域(例如9bil x 10bil)。 此外,由于目标速度很高,像这样的变化可能会非常迅速地发生,所以我需要一些复杂的algorithm来处理这种情况。 最后,我去了quadtrees( http://en.wikipedia.org/wiki/Quadtree )。 当我写完四叉树类并确定它正常工作后,我将其上传到我的模拟中。 问题:起初,四叉树奇妙地工作。 我只是第一次testing它,所以我没有提供更新边界的每一个步骤的对象与最小的x值/最大的x值/最小的y值/最大的y值,我只是喂大面积我知道这个testing案例(10 mil x 10 mil)就足够了。 在一个涉及1600个对象的testing中,我的模拟运行几乎比用来检查每个对象的蛮力解决scheme快四倍! (约28帧而不是7帧)非常好! 然后,我通过寻找每个帧的最小/最大x / y(这是问题的起点),继续为四叉树提供模拟的更新“边界”。 在更新每个对象的位置之后,我只是检查一下,看它是否是每个维度中的新的最小/最大极限: double tempradius = (*getMoveableEntityVector()[n]).Retradius(); double tempx = (*getMoveableEntityVector()[n]).Retxpos(); double tempy = (*getMoveableEntityVector()[n]).Retypos(); if (n == 0) { //if it's the first object initialize the variables based off it minx = tempx – tempradius; […]

与四元组一起使用Lazer

我有一个四叉树实现,与我需要的处理敌人,射弹和英雄之间的碰撞。 然而,这些types的实体大部分都是基于点的,而且半径不同,但是就这一点而言。 我有一个武器的想法拉泽或射线武器本质上是一条线。 这样的东西怎么样适合像四叉树这样的东西? 通常情况下,当我们有一个四叉树时,我们基本上是让这个数据结构处理点群,找出我们需要的对象的子集。 那么我们怎样才能处理一些线条? 愚蠢的做法是只查询敌人,对所有的敌方物体做圆环线交叉testing。 这显然没有效率,特别是当我们已经有一个四叉树。 我的一个想法是只放一些虚拟的抛物体沿线,并提交给四叉树。 那么如果我们从这些假人那里得到任何返回的对象,那么我们可以使用它的圆线交点testing。 任何有关如何使用射线武器的想法,需要与四叉树的一些线路交叉testing,将不胜感激。 谢谢。

我怎样才能将我的地形分割成四边形,以便每个四边形都有一个可渲染的顶点/索引缓冲区? (DirectX11,C ++)

我正在创建一个四叉树来将我的地形分块存储,目前有一定程度的实现。 我现在从一个三角形对的网格开始,使正方形和分裂成四边形。 我有我的顶点分成四边形,但我正在努力与指数。 这是我如何生成飞机 snip 这给了我一个索引列表和一个顶点列表。 这是由四叉树分割并分割成不同的顶点列表并存储在不同的节点中。 这工作得很好,顶点似乎是正确的,但是我不知道如何根据整个地形的高度和宽度来创建每个顶点列表的索引。 我将如何为四叉树中的每个节点创建索引列表,还是有更好的方法来做到这一点? 如果我只是使用每个节点的整个索引列表,我会得到奇怪的结果 编辑 :有一个问题,生成我的飞机,我正在解决这个问题,看看它是否能解决我的问题。 编辑 :我已经编辑了主题标题更适合的东西。 我已经解决了与网格生成问题,我正在使用更小的网格来使问题更清楚。 我正在使用2×2网格(9个垂直,24个索引,8个三角形),这个网格被分成4个四边形(每个四边形4个垂直,每个四边形2个三角形),几乎可以工作,只是一个边的一个小问题。 我知道这可能是小规模的复制,但在大规模淘汰时,实际上应该可以节省性能。 任何人都可以发现是怎么回事? 顶点问题? 拆分四边形时,应该用三角形,顶点还是索引? 如果我们用三角形分割并且三角形重叠2个四边形会发生什么(尽管这不应该发生)

使用四叉树进行高效的碰撞检测

我最近开始用LWJGL学习Java和OpenGL,我正在做一些简单的游戏开始。 起初,当我要实现碰撞检测时,我立刻认为必须有一个更聪明的事情,而不是循环每一对对象(这是一个丑陋的O(n²)操作),所以我做了一些研究。 看来在2D里面,对于大多数人来说是一种叫做四叉树的数据结构。 由于我在大学里一直在使用二叉树(并且实现它们),所以在实现一个简单的四叉树方面我觉得很困难,但是现在真正阻碍我的是移动: 我在这里看到的很多实现都以一种我认为效率低下的方式来对待,但我想不出什么更好的。 他们所做的就是在游戏执行的每一帧中,他们清除整个四叉树,并再次添加所有需要检查的对象,以便在四叉树中更新位置更新。 有没有更有效的方法来做到这一点? 我认为这些对象应该在四叉树内部被replace,并且考虑到这些replace,节点应该被添加/删除。 我不知道我是否过度思考。 即使使用清除和重新添加方法,它也可以将n²操作变成几乎n·log(n)的操作。 但是这只是在理论上,我不得不添加另一个线性操作(清除和重新添加四叉树),所以我担心它不会在实际速度上做任何改进… 另外还有一个相关的疑问。 我看到很多人在四叉树方面采用不同的方法。 有些人说,对于一个给定的等级来说,不能完全适合象限的物体至less应该存放在一个等级上,而另外一些人则认为把物体只存放在四叉树的叶子中是比较好的,所有这些象限都应该被储存起来。 当然,我们在这里讨论引用(我正在使用java,所以我无法处理任何其他内容…),我的意思是这不会是一个严重的记忆问题,所以我不是考虑到这一点。 无论如何,我只是想知道:哪一个可能会更好? 为什么? 任何帮助和其他相关的意见将不胜感激 提前致谢

在libGDX中是否有一个现有的Quadtree实现?

我见过很多网站建议使用Quadtree按级别和节点分割数组以获得更好的性能,例如在CollisionSystem ,需要处理大量的冲突。 我需要问这个问题,因为我打算创建我自己的Quadtree类,如果它不存在的话。

分块QuadTree的创建和处理

我是基于LOD的技术的新手,所以请对您对我的天真问题的评论放松一下。 前言: 我的目标是一个简单的地形渲染器(首选的C + +和OGL),加载一个组织成33×33顶点块的高度图(比如990 x 990 x 8bit)。 没有按需分页,只是从高度图数据中抽样顶点直接进入块的顶点缓冲区。 渲染应该通过四叉树完成,而叶子会渲染整个块(33×33顶点)。 在阅读了撒切尔·乌尔里希的“适应性四叉树”这篇文章之后,还有大量的关于堆栈交换的LOD和其他许多文章和问题,但是我似乎还是太糊涂了,不知道怎么去实际操作。 Ulrich直接(在他的演示代码)呈现为三角形粉丝(当时是合适的),但我的先决条件是一次三角形,因此是分块的方法。 1)使用一个四叉树(这很容易理解,至less在概念上,而且很可能 – 不会像以后的“地理mipmap”那样导致专利战争),在某些时候,树必须是创建。 我的猜测是首先加载(或生成)一个高度图,然后根据这个图预先分析一个四叉树。 这是一个可行的方法吗? 各种各样的文章似乎期望读者先验地知道这个事实,所以没有清楚的说明。 如果预先计算,则所有可能的子节点将被预先分配在RAM中,并且以一定距离到节点宽度的LOD准则自上而下地走向,这将迫使子节点接管。 2)如果预先分配,如果需要较低的LOD,将如何提供大块。 也就是说,块是32×32 quats => 33×33顶点,索引缓冲区包含33×33的索引将按原样渲染整个块。 现在,具有较低LOD级别的邻居节点已经不再是了,它的索引缓冲区不仅需要跨越它的四个子区块,还必须有一个索引缓冲区,它将每个第二个顶点索引为以及维持只有一个单一的差异水平(或如此我的理解)。 所以我再次猜测每个节点(不管是不是叶子)都必须有(至less)一个索引缓冲区,并且在创建整个树的过程中也必须创建/计算这个索引缓冲区。 (我将放置在引擎的加载部分,而不是接近渲染循环的任何地方)。 我真的不明白的是,如何用上面的方法进行渲染(如果是这样的话,那就是)…当节点位于上方时(就较低的LOD级别而言,即较粗糙的分辨率)必须绘制其内容,这是否意味着所有块的顶点缓冲区(在叶节点下)必须被绑定? 那么这个节点的索引缓冲区如何处理所有块中的顶点呢?或者,如果有一个空的33×33的补丁,准备从这个较低级别的节点索引的各个块中收集顶点? (在写这个的时候,听起来很俗气) 我很想看到这个答案。 我会接受与四叉树和替代建议的无CAN-DO,但四叉树解决scheme是我所希望的。 我自己的替代解决scheme(这是我脑海中的一个重击),是一种“无限快照四叉树”,它以一个根开始,并在运行中创建节点,但只存储所需的节点数量来渲染可见的世界。 然而,一个节点必须携带所有信息来重新创建它的父级,并且能够创建一个chunck-geometry。 这种方法的细分深度(实际上)是无限的(这里没有考虑到精确性的问题),但是这个邻居联系的混乱已经超越了善与恶。 最好的祝福。 爱德华

使用单个四叉树或多个四叉树进行布尔检查?

我目前正在开发一款适用于个人电脑的2D横向射击游戏(想想metroidvania,但同时还有更多的事情发生)。 使用XNA。 我正在为我的空间分区系统使用四叉树。 所有的对象都将被标准的边界几何体(盒子或球体)所包围,在几何碰撞之后实现可能的像素完美的碰撞检测(取决于我可以如何优化)。 这些是我的碰撞情景,其中<>表示对象重叠(多玩家合作是玩家<>玩家场景的原因): Collision scenarios (true = collision occurs): Player <> Player = false Enemy <> Enemy = false Player <> Enemy = true PlayerBullet <> Enemy = true PlayerBullet <> Player = false PlayerBullet <> EnemyBullet = true PlayerBullet <> PlayerBullet = false EnemyBullet <> Player = true EnemyBullet <> Enemy = […]