八叉树 - 移动物体会影响哪些细胞?

时间:2016-02-20 17:42:58

标签: algorithm opengl collision-detection collision octree

我想使用八叉树作为OGL场景表示,我在那里有一些移动物体。我还想使用这个八叉树来加速碰撞检测。是否有任何好的算法可以为您提供移动物体穿透的八叉树(此类路径的所有单元/节点)中的路径?

假设我有一个移动物体,我知道速度(因此两个位置,移动的开始和一帧中的移动结束)。

我的想法是简单地遍历整个树并对包含移动物体和其余细胞的细胞进行碰撞检测。这会给我所有这些,但这不是一个矫枉过正吗? 谢谢!

1 个答案:

答案 0 :(得分:3)

如果您有移动物体的起始位置和结束位置,那么您将拥有一条光线来定义物​​体的运动。八叉树中的一个节点是一个长方体,它是一个相当简单的多面体。您可以将碰撞/交叉测试视为射线长方体相交测试。

在此页面上查看对象 - 对象交集算法:

http://www.realtimerendering.com/intersections.html#II247

该页面指向Github上的光线多面体交叉点的代码:

https://github.com/erich666/GraphicsGems/blob/master/gemsii/RayCPhdron.c

从一个简单的例子开始,假设你的物体只是沿着这条运动线行进的点。然后你可以使用光线长方体交点找到对象的路径。如果八叉树的节点不包含光线,则没有必要深入搜索该节点的子节点。 (从上到下搜索整个八叉树,首先会破坏创建八叉树的目的。)即使你的对象是一个有许多顶点的复杂事物,编写代码来做一个点的简单光线/长方体交叉点将是有益的。

Schneider和Eberly的计算几何图书计算机图形几何工具对多面体线的交叉处理有很好的处理,包括一个易于理解的伪代码页。如果您要花费大量时间编写3D几何图形编码,那么您需要在书架上复印该图书。 Eberly在他的网站上也有许多有用的PDF:

https://www.geometrictools.com/

如果您创建了八叉树,使得每个节点都有一个指向其直接邻居的指针,那么这可能会加快搜索速度。不过,我不建议在开始时实施 - 先创建一些简单的东西,而不是一次解决多个实现任务。

举一个稍微复杂的例子,如果你有一个3个顶点的三角形定向,使得三角形的曲面法线平行于运动方向,那么三角形与你的长方体节点的交叉测试八叉树很简单;测试从每个顶点开始并平行于运动方向的光线的光线 - 长方体交点。

从那里,您的方法可能会有所不同,具体取决于移动物体的复杂程度以及您对“碰撞”的需求。检测。例如,您可能不仅允许将交叉点视为碰撞,而且还允许将一个对象非常近地传递给另一个对象。我不知道你的应用是什么,你的物体有多复杂,物体是否近似凸起等,但你可以考虑测试与物体的凸包的碰撞,或者可能用球/立方体测试它包含了对象中的所有点。