基于稀疏八叉树的并行刚体碰撞检测方法及装置制造方法及图纸

技术编号:34361858 阅读:17 留言:0更新日期:2022-07-31 07:40
本发明专利技术公开了一种基于稀疏八叉树的并行刚体碰撞检测方法及装置,包括:根据待碰撞检测刚体构建包围盒树,对生成碰撞区域划分,获取各小单元空间的索引;依据待碰撞检测刚体的重心及各小单元空间的索引,构建压缩八叉树的叶子节点;对生成的内部节点进行排序,生成压缩八叉树的后序遍历;结合内部节点与压缩八叉树的后序遍历,生成压缩八叉树;通过计算压缩八叉树中每个节点与其父节点之间的深度差,获取中间节点,生成完整八叉树;从完整八叉树的叶子节点开始自底向上查询重叠区域,找到发生碰撞的叶子节点对。本发明专利技术使用Z空间填充曲线(Z

【技术实现步骤摘要】
基于稀疏八叉树的并行刚体碰撞检测方法及装置


[0001]本专利技术属于计算机图形学与人机交互领域,具体涉及一种基于稀疏八叉树的并行刚体碰撞检测方法及装置。

技术介绍

[0002]八叉树是一种在计算机仿真领域非常常见的数据结构,广泛应用于碰撞检测、光线跟踪、以及三维场景的简化等领域。随着人们对仿真真实感和帧率需求的提升,越来越多的仿真算法不在满足于CPU的计算,开始使用GPU并行加速求解。然而GPU虽然并行的计算速度比较快,但是目前的GPU设计架构还不支持递归算法和动态的内存分配,导致某些GPU算法与CPU算法实现过程有较大的差别。许多复杂的数据结构和算法不适用于使用GPU实现。传统的八叉树采用自顶向下的方式进行构建,这种方式难以使用GPU进行并行的构建。Ferrando通过使用结合CPU和GPU的不同的优势来创建八叉树的算法[FerrandoN,M.A.Gos
á
lvez,J.Cerd
á
,et al.Octree

based,GPU implementation of a continuous cellular automaton for the simulation of complex,evolving surfaces[J].Computer Physics Communications,2011,182(3):628

640.]。八叉树的结构由CPU来创建,节点与节点之间的数据通过GPU来计算和传输。这种方法在一定程度上弥补了CPU和GPU各自的短板,但是也造成了CPU和GPU之间通信的开销。熊等人提出一种基于混合八叉树的动态对象碰撞检测算法[熊心一,姚宇.基于混合八叉树的动态对象碰撞检测算法[J].计算机应用,2019(A01):96

99.]。该算法结合了静态八叉树和动态八叉树的特点,在一定程度上降低了空间消耗,但该算法无法应用于实时计算,效率有待提高。

技术实现思路

[0003]本专利技术主要针对传统的刚体碰撞检测算法效率低的问题,提出一种基于稀疏八叉树的并行刚体碰撞检测方法及装置,其通过使用Z空间填充曲线(Z

SFC)和索引,进而构建自底向上的八叉树,从而极大的降低了碰撞检测的复杂度,同时该方法适合使用GPU进行并行求解,使得大规模刚体碰撞实时检测和计算成为可能。
[0004]具体来说,本专利技术的技术方案如下:
[0005]一种基于稀疏八叉树的并行刚体碰撞检测方法,其步骤包括:
[0006]1)根据待碰撞检测刚体构建包围盒树,依据包围盒树的根节点生成碰撞区域,并对碰撞区域进行划分,对获取的各小单元空间进行编码,生成各小单元空间的索引;
[0007]2)依据待碰撞检测刚体的重心及各小单元空间的索引,构建压缩八叉树的叶子节点;
[0008]3)将两个相邻叶子节点的最小公共父节点作为内部节点,对不同层的内部节点进行并行排序,生成压缩八叉树的后序遍历,并结合内部节点与压缩八叉树的后序遍历,生成压缩八叉树;
[0009]4)通过计算压缩八叉树中每个节点与其父节点之间的深度差,获取中间节点,生
成完整八叉树;
[0010]5)从完整八叉树的叶子节点开始自底向上查询重叠区域,找到发生碰撞的叶子节点对。
[0011]进一步地,所述包围盒树包括:轴平行包围盒树和有向包围盒树。
[0012]进一步地,通过以下步骤构建包围盒树:
[0013]1)对各待碰撞检测刚体P
i
的轮廓进行重构,i为待碰撞检测刚体的序号;
[0014]2)把待碰撞检测刚体P1作为包围盒树的根节点,将其它的待碰撞检测刚体P
i
作为包围盒树的一节点;
[0015]3)判断待碰撞检测刚体P1与其它的待碰撞检测刚体P
i
所在的区域是否存在交集;
[0016]4)若有交集且其它的待碰撞检测刚体P
i
与待碰撞检测刚体P1的子集有交集,则将其它的待碰撞检测刚体P
i
的相应节点加入到与待碰撞检测刚体P1的相应节点的子集最小的公共子节点之后;若没有交集,则根据待碰撞检测刚体P1与其它的待碰撞检测刚体P
i
生成一公共区域,并生成公共节点。
[0017]进一步地,对碰撞区域进行划分的方法包括:Z空间填充曲线。
[0018]进一步地,编码的方法包括:莫顿码。
[0019]进一步地,通过以下步骤构建压缩八叉树的叶子节点:
[0020]1)获取待碰撞检测刚体的重心,得到叶子节点的坐标;
[0021]2)依据各小单元空间的索引,将叶子节点的坐标表示为索引形式;
[0022]3)将索引形式的叶子节点坐标保存在一长度为2n

1的数组A中,其中n为待碰撞检测刚体P
i
的数量;
[0023]4)根据索引形式的叶子节点,对数组A中的n个元素进行排序,构建压缩八叉树的叶子节点。
[0024]进一步地,通过以下步骤得到压缩八叉树的后序遍历:
[0025]1)分配n

1个GPU线程;
[0026]2)对于由数组A前半部分中的两个相邻叶子节点A[i]与A[i+1]生成的内部节点,存储在数组A[n+i]中;
[0027]3)根据各小单元空间的索引,对不同层的内部节点进行并行排序,并删除数组A后半部分中的重复项;对于没有相同索引的每两个相邻内部节点,并行地从当前节点开始遍历数组A的后半部分,并删除重复项;
[0028]4)根据各小单元空间的索引对数组A进行并行排序,得到压缩八叉树的后序遍历。
[0029]进一步地,通过以下步骤生成压缩八叉树:
[0030]1)分配两倍于数组A大小的数组B,并将数组A中的数据复制到数组B中;
[0031]2)分配p+q

1个GPU线程,其中p为叶子节点的数量,q为内部节点的数量;
[0032]3)对于数组B前半部中的每两个相邻叶子节点B[i]与B[i+1],并行生成内部节点,并将存储在B[n+i]中;
[0033]4)根据小单元空间的索引对生成结果进行并行排序;
[0034]5)对于具有相同索引且至少其中一个不是副本的节点,建立内部节点父子关系,生成压缩八叉树。
[0035]进一步地,通过以下步骤生成完整八叉树:
[0036]1)分配不小于数组A长度的线程;
[0037]2)计算每个节点与其父节点的深度差并累加,以获取插入内部节点所需的内存总数;
[0038]3)并行计算每个节点与其父节点之间的深度差,且当深度差大于设定阈值时,并行的在每个节点与其父节点之间插入中间节点,以生成完整八叉树。
[0039]一种存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上述所述的方法。...

【技术保护点】

【技术特征摘要】
1.一种基于稀疏八叉树的并行刚体碰撞检测方法,其步骤包括:1)根据待碰撞检测刚体构建包围盒树,依据包围盒树的根节点生成碰撞区域,并对碰撞区域进行划分,对获取的各小单元空间进行编码,生成各小单元空间的索引;2)依据待碰撞检测刚体的重心及各小单元空间的索引,构建压缩八叉树的叶子节点;3)将两个相邻叶子节点的最小公共父节点作为内部节点,对不同层的内部节点进行并行排序,生成压缩八叉树的后序遍历,并结合内部节点与压缩八叉树的后序遍历,生成压缩八叉树;4)通过计算压缩八叉树中每个节点与其父节点之间的深度差,获取中间节点,生成完整八叉树;5)从完整八叉树的叶子节点开始自底向上查询重叠区域,找到发生碰撞的叶子节点对。2.如权利要求1所述的方法,其特征在于,所述包围盒树包括:轴平行包围盒树和有向包围盒树;通过以下步骤构建包围盒树:1)对各待碰撞检测刚体P
i
的轮廓进行重构,i为待碰撞检测刚体的序号;2)把待碰撞检测刚体P
i
作为包围盒树的根节点,将其它的待碰撞检测刚体P
i
作为包围盒树的一节点;3)判断待碰撞检测刚体P1与其它的待碰撞检测刚体P
i
所在的区域是否存在交集;4)若有交集且其它的待碰撞检测刚体P
i
与待碰撞检测刚体P1的子集有交集,则将其它的待碰撞检测刚体P
i
的相应节点加入到与待碰撞检测刚体P1的相应节点的子集最小的公共子节点之后;若没有交集,则根据待碰撞检测刚体P1与其它的待碰撞检测刚体P
i
生成一公共区域,并生成公共节点。3.如权利要求1所述的方法,其特征在于,对碰撞区域进行划分的方法包括:Z空间填充曲线。4.如权利要求1所述的方法,其特征在于,编码的方法包括:莫顿码。5.如权利要求1所述的方法,其特征在于,通过以下步骤构建压缩八叉树的叶子节点:1)获取待碰撞检测刚体的重心,得到叶子节点的坐标;2)依据各小单元空间的索引,将叶子节点的坐标表示为索引形式;3)将索引形式的叶子节点坐标保存在一长度为2n
...

【专利技术属性】
技术研发人员:何小伟何浩乔颖王宏安
申请(专利权)人:中国科学院软件研究所
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1