邻域搜索的效率化
SPH等粒子法,由于需要考虑到邻域粒子带来的影响,通常邻域搜索都会消耗大量时间。如果我们只是单纯的计算所有粒子组合的欧氏距离的话,计算时间只会呈指数增加。
而空间分割法的出现,使邻域搜索实现了效率化。 空间分割法是一种,把希望检索到的物体存在的空间以格子等方式分隔开,只计算自身及相邻分割领域内包含物体的距离,可以使计算时间大幅减少的方法。空间分割法的处理顺序是,
- 物体的记录
- 分割空间
- 计算出各物体所属的分割领域
- 邻域搜索
- 计算出 搜索中心坐标所属区域
- 列出自身和相邻区域的物体
- 计算列出物体间的距离
如上所述,分成记录和检索两部分。记录只在场景中的物体(粒子)位置变化的时候实行,检索则是在有必要的时候连续进行。
空间分割法的难点在于空间以怎样的方式分割。其代表性方法为,
- 等间距格子(下图左)
- 八叉树,四叉树构造(下图右)
- kD树构造
等等。下图的四叉树构造,与等间距网格相比,检索效率更高,但是物体记录却更费事。使用粒子法的时候,为了使每一帧粒子都能实现动态移动,每一帧都要进行区域记录。为此,分割·记录较为容易的等间距网格法则会被经常使用。等间距网格,与有分层结构的其他分割方法相比,更容易进行记录同步化处理。
図1 等间距格子
(左)和四叉树
(左)
GPU的实现
参照Particle Simulation using CUDA (PDF)(code源文件在NVIDIA的GPU Computing SDK中) ,来实现SPH法的扩充。
首先,介绍使用Particle Simulation using CUDA进行粒子搜索方法,如图所示。