专利名称:一种实时碰撞检测系统的实现方法
技术领域:
本发明涉及计算机游戏及虚拟现实技术领域,尤其涉及一种实时碰撞检测系统的实现方法。
背景技术:
碰撞检测技术用于判定一对或多对物体在给定时间域内的同一时刻是否占有相同区域。它是机器人运动规划、计算机仿真、虚拟现实、游戏等领域不可回避的问题之一。在当今的大型3D场景游戏中,实时碰撞检测技术非常常见,它能够使游戏中各种效果的表现更加精准,玩家的体验更加真实,但是复杂场景的实时检测的效率有时还不能令人满意,影响到游戏的整体性能,影响游戏体验。而对于一些射击类的大型网络游戏,如果仅仅进行客户端的检测,服务端的碰撞结果就只能由客户端返回,但是这样就给了外挂可乘之机,虽然可能可以通过其他方式避免,但也会相对复杂。如果在服务端也进行碰撞检测,以现有的碰撞检测技术而言,服务端无法承受大数据量的碰撞检测,或者需要性能更高效的服务器,增加游戏的运营的支出。基于格子的碰撞系统在早期比较常见,它实现简单,执行效率快,像早期的仙剑奇侠传和其他碰撞怪的角色扮演游戏(RPG),以及一些推箱子、打砖块、俄罗斯方块等游戏,都是基于这种类型的碰撞检测。基于格子的碰撞检测系统碰撞的精度不够,不属于严格意义上的碰撞检测。基于二叉空间分割(BSP)树的碰撞检测比较适合复杂的封闭场景,场景根据一定的分配策略将空间划分为2部分,然后再对子结点进行递归划分,直到达到分配策略的要求。碰撞模型的图元数据都保存在叶子中。这种碰撞的分割策略很重要,技术已经很成熟, 效率很高。但是基于BSP树的碰撞检测,BSP树的生成需要很长的预处理时间,不适合加载时计算;BSP划分经常会产生原多边形数三到四倍的多边形,考虑到不用保存法线、颜色、 UV等信息也要增加将近一倍的资源容量,因此不适合处理大型场景的碰撞。在一个大的游戏中将模型资源的容量从200M增加到400M相信是大部分人都不愿接受的。
发明内容
本发明提供了一种实时碰撞检测系统的实现方法,能够实时高效的处理大型场景的碰撞。本发明实施例提供的一种实时碰撞检测系统的实现方法包括如下步骤A、将场景分割成四叉树,制作场景中需要发生碰撞的物体的碰撞模型,生成碰撞模型的模型数据文件以及场景的四叉树及结点信息文件;B、读取所述四叉树及结点信息文件,创建管理模型的四叉树;读取模型数据文件, 根据碰撞模型的数量读取碰撞模型中的三角形数据,创建保存三角形数据的数组,并生成碰撞模型的沿轴排列包围盒AABB,根据最长坐标轴对碰撞模型进行排序,然后建立AABB 树;
C、在客户端和服务器侧检测在射线检测距离内的射线与四叉树的碰撞,以及射线与四叉树叶结点、AABB树及三角形的碰撞,其中在客户端测试最近的碰撞点,在服务器侧判断是否碰撞。较佳地,步骤A所述将场景分割成四叉树包括Al、判断场景中是否存在根节点,若是,执行步骤A2,否则结束本流程;A2、判断场景中模型的AABB与当前节点的xz平面是否发生碰撞,若是执行步骤 A3,否则结束本流程;A3、判断当前节点是否为叶子节点且当前节点包含的模型数目小于N,若是执行步骤A5,否则执行步骤A4;A4、判断当前节点是否为最深节点,若是,执行步骤A5,否则执行步骤A6 ;A5、在当前节点中添加模型数据的索引,然后结束本流程;A6、判断是否遍历完四叉树的四个子节点,若是,执行步骤A7,否则执行步骤AlO ;A7、判断是否遍历完当前节点包含的模型数据,若是执行步骤A8,否则返回步骤 A6 ;A8、判断是否到达最上层结点,若是,结束本流程,否则执行步骤A9;A9、返回上一层结点,并继续执行步骤A6 ;A10、设置当前结点的子结点为当前结点,并继续执行步骤A2。较佳地,所述碰撞模型为场景中物体的渲染模型的简化模型。较佳地,步骤A所述绘制场景中需要发生碰撞的物体的碰撞模型包括设置碰撞模型的逻辑等级;所述检测射线与四叉树叶结点、AABB树及三角形的碰撞符合如下原则射线仅与高于自身逻辑等级的碰撞模型对应的AABB发生碰撞。较佳地,所述碰撞模型的逻辑等级分成低,中,高共三级。较佳地,所述四叉树及结点信息文件的文件头部分包括文件标识、碰撞模型数量和四叉树结点数量;文件体中包括N组结点信息以及结点包含模型信息,N为四叉树中的结点总数;四叉树及结点信息文件还包括结点关系信息。较佳地,所述四叉树及结点信息文件中的第i组结点信息的具体内容包括第i个结点的X轴最小值、Z轴最小值、X轴最大值、Z轴最大值、该节点的深度以及结点标识,i为自然数,且1彡i彡N。较佳地,所述四叉树及结点信息文件中的第i组结点包含模型信息包括结点包含碰撞模型数量以及该结点包含的全部碰撞模型索引。较佳地,所述四叉树及结点信息文件中的结点关系信息包括结点索引、孩子标志、 孩子结点索引以及1至4个孩子结点。较佳地,所述模型数据文件的文件头包括文件标识和三角形网格数量,文件体包括三角形信息和模型数据信息;所述三角形信息中包括多于1个三角形网格信息,每个三角形网格信息中包括该三角形网格中包含的三角形数量、三角形信息;模型数据信息中包括每一个碰撞模型的模型AABB、碰撞逻辑等级、三角形网格索引、三角形数量以及转换矩阵。较佳地,步骤C所述在客户端测试最近的碰撞点包括客户端测试所有与射线发生碰撞的模型的三角形数据,计算最近的碰撞点,并返回碰撞测试结果。较佳地,步骤C所述在服务器侧判断是否碰撞包括当服务器检测到射线与某一个三角形发生碰撞时,立即返回测试成功。较佳地,步骤C所述检测在射线检测距离内的射线与四叉树的碰撞检测包括如下流程Cl、判断根结点是否是叶子结点,若是,执行步骤C2,否则执行步骤C3 ;C2、检测叶子结点中模型碰撞,然后结束本流程;C3、判断射线是否与根结点AABB碰撞,若是执行步骤C4,否则结束本流程;C4、判断该根结点是否存在未检验的子结点,若是执行步骤C7,否则执行步骤C5 ;C5、判断该根结点是否有父结点,若是执行步骤C6,否则结束本流程;C6、返回父节点,并转至步骤C4 ;C7、判断子结点是否是叶子结点,若是执行步骤C8,否则执行步骤ClO ;C8、判断该叶子结点是否存在模型数据,若是执行步骤C9,否则执行步骤C6 ;C9、测试射线与叶子结点中模型的碰撞,然后返回步骤C5 ;C10、测试射线与子结点的碰撞;Cll 若碰撞成功,执行步骤C12,若碰撞失败,返回步骤C4 ;C12:判断该子节点是否是叶子结点,若是,返回步骤C4,否则以这个子节点为当前结点,然后返回步骤C4。较佳地,步骤C所述检测在射线检测距离内的射线与四叉树叶结点和AABB及三角形的碰撞包括如下流程C13、判断当前场景是否存在碰撞模型,若是,执行步骤C14,否则结束本流程;C14、判断射线测试等级是否大于模型的逻辑碰撞等级,若是,执行步骤C15,否则返回步骤C13 ;C15、判断射线与模型AABB碰撞是否成功,若是,执行步骤C16,否则返回步骤 C13 ;C16、转换射线和起始点到模型本地坐标系;C17、设置根结点;C18、测试射线与当前结点模型的AABB的碰撞;C19、若碰撞成功,执行步骤C20,否则转至步骤C23 ;C20、判断当前结点是否是叶子结点,若是执行步骤C24,否则执行步骤C21 ;C21、判断子节点是否遍历完毕,若是,执行步骤C23,否则执行步骤C22 ;C22、访问子节点,并返回步骤C18 ;C23、判断是否存在父节点,若是返回步骤C21,否则结束本流程;C24、判断是否存在三角形集合,若是执行步骤C25,否则执行步骤C23 ;C25、测试射线与三角形的碰撞;C26、判断碰撞是否成功,若是执行步骤C27,否则返回步骤C24 ;C27、判断本次碰撞是否比最近碰撞距离最近,若是,执行步骤C28,否则返回步骤 C24 ;C28、记录碰撞点,并返回步骤C24。
从以上技术方案可以看出,将场景分割成四叉树,并检测在射线检测距离内的射线与四叉树的碰撞检测以及射线与四叉树叶结点和AABB及三角形的碰撞,客户端和服务器分别执行不同的碰撞检测任务,其中服务端当检测到有碰撞时,系统立即返回碰撞成功, 客户端检测,需要测试最近的碰撞点,这样可以极大减少服务器端的碰撞检测计算量,能够高效的处理大型场景的碰撞,满足服务端大批量高效的计算,同时又避免了外挂的可能。
图1为本发明实施例提出的基于逻辑等级的实时碰撞检测方法流程示意图;图2为本发明实施例提供的将场景分割成四叉树的详细流程图;图3为四叉树及结点信息文件的结构示意图;图4为模型数据文件的结构示意图;图5为本发明实施例提供的射线与四叉树的碰撞检测流程图;图6为本发明实施例提供的射线与四叉树叶结点和AABB树及三角形的碰撞检测流程。
具体实施例方式图1示出了本发明实施例提出的一种实时碰撞检测系统的实现方法流程,包括如下步骤步骤101 将场景分割成四叉树;步骤102 制作场景中需要发生碰撞的物体的带逻辑等级的碰撞模型;步骤103 生成场景的碰撞模型的模型数据文件以及场景的四叉树信息的四叉树信息文件;步骤104 读取所述四叉树信息文件,创建管理模型的四叉树,读取模型数据文件,根据碰撞模型的数量读取碰撞模型中的三角形数据,创建保存三角形数据的数组,并生成碰撞模型的沿轴排列包围盒(AABB,Aligned Axis Bounding Box),根据最长坐标轴对碰撞模型进行排序,然后建立AABB树;步骤105 检测在射线检测距离内的射线与四叉树的碰撞,以及射线与四叉树叶结点、AABB树及三角形的碰撞。AABB保存了三角形的集合,AABB的构建是通过三角形在模型中的相对位置进行划分,这样能够更快的检测与三角形数据的碰撞。服务端进行射线检测时,当检测到有碰撞时,系统立即返回碰撞成功,因为服务端并不需要知道碰撞的具体位置,只需要判定是否发生碰撞。客户端检测,需要测试最近的碰撞点,所以测试效率会相对降低。因为客户端需要根据测试的碰撞点,进行后续处理,例如碰撞效果的渲染等。当测试等级大于碰撞模型本身的逻辑等级时,判定未发生碰撞,在满足一定真实性的情况下,提高了系统的执行效率。为使本发明技术方案的特点及技术效果更加清楚,以下通过具体实施例对本发明技术方案进行进一步详细阐述。步骤101所述将场景分割为四叉树具体包括
将场景分割成四叉树,判断场景中模型的AABB的xz面与由场景分割成的四叉树的各个结点由上至下的碰撞情况,如果发生碰撞,将判断此结点子结点碰撞情况,直至满足条件(子节点模型数小于一定数量或到达最深结点)放入子结点,由此管理场景中的所有模型。图2示出了本发明实施例提供的将场景分割成四叉树的详细流程,包括如下步骤步骤201 判断场景中是否存在根节点,若是,执行步骤202,否则结束本流程。步骤202 判断场景中模型的AABB与当前节点的xz平面是否发生碰撞,若是执行步骤203,否则结束本流程。步骤203 判断当前节点是否为叶子节点且当前节点包含的模型数目N,若是执行步骤205,否则执行步骤204。N为根据分配策略预先设定的自然数,代表四叉树最小节点所能容纳的模型的上限。步骤204 判断当前节点是否为最深节点,若是,执行步骤205,否则执行步骤206。步骤205 在当前节点中添加模型数据的索引,然后结束本流程。步骤206 判断是否遍历完四叉树的四个子节点,若是,执行步骤207,否则执行步骤 210。步骤207:判断是否遍历完当前节点包含的模型数据,若是执行步骤208,否则返回步骤206。步骤208 判断是否到达最上层结点,若是,结束本流程,否则执行步骤209。步骤209 返回上一层结点,并继续执行步骤206。步骤210 设置当前结点的子结点为当前结点,并继续执行步骤202。绘制场景中需要发生碰撞的物体的碰撞模型,碰撞模型需要与场景中物体的渲染模型基本吻合,但是相对于渲染模型进行极大的简化,以提高射线碰撞检测的速率。同时,在静物模型编辑器中,在静物模型中添加碰撞模型的信息,根据静物直观的表象,这个直观的表象就是看起来静物的实际的低,中,高,但是确定这个模型到底属于什么等级,还需要再静物编辑器中设置模型的逻辑等级。碰撞模型的逻辑等级分成低,中,高共三级,射线检测时,也将包含逻辑等级信息,射线仅与高于自身逻辑等级的碰撞模型发生碰撞。例如,一个低等级的射线可以测试与中等级和高等级的模型的碰撞,中等级的射线可以测试与高等级模型的碰撞。最后生成场景的包含碰撞模型的模型数据文件以及场景的四叉树信息文件,这样可以使程序在加载的过程不再重新计算生成一次四叉树,提高程序效率。生成的文件有2 个,一个是四叉树及结点信息文件,另一个是所有碰撞模型的模型数据文件。四叉树及结点信息文件的结构如图3所示,文件头部分包括文件标识G字节)、碰撞模型数量G字节)、四叉树结点数量G字节)。文件体中还包括N组结点信息以及结点包含模型信息,N为四叉树中的结点总数。四叉树及结点信息文件还包括结点关系信息。第i组(1彡i彡N)结点信息的具体内容包括第i个结点的X轴最小值111_ fMinX G字节)、Z轴最小值m_fMinZ (4字节)、X轴最大值m_fMaXX G字节)、Z轴最大值m_ fMaxZ G字节)、该节点的深度m_nD^th (4字节)、结点标识m_nID G字节)。第i组结点包含模型信息包括结点包含碰撞模型数量G字节)、以及该结点包含的全部碰撞模型索引(4字节)。结点关系信息包括结点索引G字节)、孩子标志(1字节)、孩子结点索引G字节)以及1至4个孩子结点。模型数据文件的结构如图4所示,其文件头包括文件标识G字节)和三角形网格数量G字节)。模型数据文件的文件体包括三角形信息和模型数据信息。三角形信息中包括多于1个的三角形网格信息,每个三角形网格信息中包括该三角形网格中包含的三角形数量G字节)、三角形信息(36字节)。模型数据信息中包括每一个碰撞模型的模型 AABB(24字节)、碰撞逻辑等级G字节)、三角形网格索引G字节)、三角形数量G字节) 以及转换矩阵(64字节)。所述步骤104具体包括子步骤104-1 读取碰撞测试系统四叉树文件,读取模型数量和四叉树结点数量, 将所有的结点读出保存在碰撞测试系统的数组中,以及每个结点中包含的模型的索引信息;子步骤104-2 读取结点关系信息,根据关系信息重建四叉树。子步骤104-3 读取模型数据文件,根据模型的数量,读取所有的模型中的三角形数据,创建保存模型三角形数据的数组,读取所有的模型信息。子步骤104-4 生成模型的AABB树,AABB树保存了三角形的集合,AABB树的构建是通过三角形在模型中的相对位置进行划分,这样能够更快的检测与三角形数据的碰撞。步骤105所述碰撞检测包括两部分内容,分别是射线与四叉树的碰撞检测以及射线与四叉树叶结点和AABB及三角形的碰撞。测试射线是否穿过四叉树结点,如果发生碰撞,继续测试子结点,当查找到碰撞成功的叶子结点,如果结点内有碰撞模型,再判断模型的逻辑等级是否通过,如果通过则检测与碰撞模型的AABB的碰撞。如果与模型的AABB发生碰撞,通过模型的转换矩阵的逆矩阵将射线的起始点和方向向量转换到模型的本地坐标系进行测试,因为碰撞模型的三角形数据都是本地坐标系下的数据。射线与四叉树的碰撞检测流程详见图5所示,包括如下步骤步骤501 判断根结点是否是叶子结点,若是,执行步骤502,否则执行步骤503。步骤502 检测叶子结点中模型碰撞,然后结束本流程。步骤503 判断射线是否与根结点AABB碰撞,若是执行步骤504,否则结束本流程。步骤504:判断该根结点是否存在未检验的子结点,若是执行步骤507,否则执行步骤505。存在未检验的子结点的情况可以是子结点不为空,且4个子结点没有遍历完;如果子结点为空或者已遍历完4个子结点,则不存在未检验的子结点。步骤505 判断该根结点是否有父结点,若是执行步骤506,否则结束本流程。步骤506 返回父节点,并转至步骤504继续检验子结点的操作。步骤507 判断子结点是否是叶子结点,若是执行步骤508,否则执行步骤510。叶子结点是没有子结点的结点,即叶子节点的子节点都为空。步骤508 判断该叶子结点是否存在模型数据,若是执行步骤509,如果不存在,执行步骤506。
步骤509 测试射线与叶子结点中模型的碰撞,然后返回步骤505。步骤510 测试射线与子结点的碰撞。步骤511 若碰撞成功,执行步骤512。如果碰撞失败,返回504,继续检验子结点步骤512 判断该子节点是否是叶子结点,若是,返回步骤504,若否,执行步骤 513。步骤513 :以这个子节点为当前结点,然后返回步骤504。测试射线与模型AABB树的碰撞,测试射线与当前结点的AABB的碰撞,如果碰撞成功,测试子节点与射线的碰撞,以此递归,如果射线与叶子结点碰撞成功,然后检测与叶子结点中包含的三角形的碰撞。通过三角形与射线的碰撞计算碰撞点。再通过转换矩阵将碰撞点转换到世界坐标系。图6示出了射线与四叉树叶结点和AABB树及三角形的碰撞检测流程,包括如下步骤步骤601 判断当前场景是否存在碰撞模型,若是,执行步骤602,否则结束本流程。步骤602:判断射线测试等级是否大于模型的逻辑碰撞等级,若是,执行步骤603, 否则返回步骤601。步骤603 判断射线与模型AABB碰撞是否成功,若是,执行步骤604,否则返回步骤 601。步骤604 转换射线和起始点到模型本地坐标系。步骤605:设置根结点。步骤606 测试射线与当前结点模型的AABB的碰撞。步骤607,若碰撞成功,执行步骤608,否则转至步骤611。步骤608 判断当前结点是否是叶子结点,若是执行步骤612,否则执行步骤609。步骤609 判断子节点是否遍历完毕,若是,执行步骤611,否则执行步骤610。步骤610 访问子节点,并返回步骤606。步骤611 判断是否存在父节点,若是返回步骤609,否则结束本流程。步骤612 判断是否存在三角形集合,若是执行步骤613,否则执行步骤611。步骤613 测试射线与三角形的碰撞。步骤614 判断碰撞是否成功,若是执行步骤615,否则返回步骤612。步骤615 判断本次碰撞是否比最近碰撞距离更近,若是,执行步骤616,否则返回步骤612。步骤616 记录碰撞点,并返回步骤612。客户端侧,碰撞测试需要返回碰撞的最近点,射线检测需要测试所有与射线发生碰撞的模型的三角形数据,计算最近的碰撞点,并返回碰撞测试结果。服务器侧,碰撞测试仅仅需要测试是否发生碰撞,当检测到射线与某一个三角形发生碰撞时,立即返回测试成功,不再进行测试,以提高测试效率。所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
1权利要求
1.一种实时碰撞检测方法,其特征在于,包括如下步骤A、将场景分割成四叉树,制作场景中需要发生碰撞的物体的碰撞模型,生成碰撞模型的模型数据文件以及场景的四叉树及结点信息文件;B、读取所述四叉树及结点信息文件,创建管理模型的四叉树;读取模型数据文件,根据碰撞模型的数量读取碰撞模型中的三角形数据,创建保存三角形数据的数组,并生成碰撞模型的沿轴排列包围盒AABB,根据最长坐标轴对碰撞模型进行排序,然后建立AABB树;C、在客户端和服务器侧检测在射线检测距离内的射线与四叉树的碰撞,以及射线与四叉树叶结点、AABB树及三角形的碰撞,其中在客户端测试最近的碰撞点,在服务器侧判断是否碰撞。
2.根据权利要求1所述的方法,其特征在于,步骤A所述将场景分割成四叉树包括 Al、判断场景中是否存在根节点,若是,执行步骤A2,否则结束本流程;A2、判断场景中模型的AABB与当前节点的XZ平面是否发生碰撞,若是执行步骤A3,否则结束本流程;A3、判断当前节点是否为叶子节点且当前节点包含的模型数目小于N,若是执行步骤 A5,否则执行步骤A4;A4、判断当前节点是否为最深节点,若是,执行步骤A5,否则执行步骤A6 ;A5、在当前节点中添加模型数据的索引,然后结束本流程;A6、判断是否遍历完四叉树的四个子节点,若是,执行步骤A7,否则执行步骤AlO ;A7、判断是否遍历完当前节点包含的模型数据,若是执行步骤A8,否则返回步骤A6 ;A8、判断是否到达最上层结点,若是,结束本流程,否则执行步骤A9 ;A9、返回上一层结点,并继续执行步骤A6 ;A10、设置当前结点的子结点为当前结点,并继续执行步骤A2。
3.根据权利要求1所述的方法,其特征在于,所述碰撞模型为场景中物体的渲染模型的简化模型。
4.根据权利要求1所述的方法,其特征在于,步骤A所述绘制场景中需要发生碰撞的物体的碰撞模型包括设置碰撞模型的逻辑等级;所述检测射线与四叉树叶结点、AABB树及三角形的碰撞符合如下原则射线仅与高于自身逻辑等级的碰撞模型对应的AABB发生碰撞。
5.根据权利要求4所述的方法,其特征在于,所述碰撞模型的逻辑等级分成低,中,高共三级。
6.根据权利要求4所述的方法,其特征在于,所述四叉树及结点信息文件的文件头部分包括文件标识、碰撞模型数量和四叉树结点数量;文件体中包括N组结点信息以及结点包含模型信息,N为四叉树中的结点总数;四叉树及结点信息文件还包括结点关系信息。
7.根据权利要求6所述的方法,其特征在于,所述四叉树及结点信息文件中的第i组结点信息的具体内容包括第i个结点的X轴最小值、Z轴最小值、X轴最大值、Z轴最大值、该节点的深度以及结点标识,i为自然数,且1彡i彡N。
8.根据权利要求6所述的方法,其特征在于,所述四叉树及结点信息文件中的第i组结点包含模型信息包括结点包含碰撞模型数量以及该结点包含的全部碰撞模型索引。
9.根据权利要求6所述的方法,其特征在于,所述四叉树及结点信息文件中的结点关系信息包括结点索弓丨、孩子标志、孩子结点索引以及1至4个孩子结点。
10.根据权利要求6至9任一项所述的方法,其特征在于,所述模型数据文件的文件头包括文件标识和三角形网格数量,文件体包括三角形信息和模型数据信息;所述三角形信息中包括多于1个三角形网格信息,每个三角形网格信息中包括该三角形网格中包含的三角形数量、三角形信息;模型数据信息中包括每一个碰撞模型的模型AABB、碰撞逻辑等级、 三角形网格索引、三角形数量以及转换矩阵。
11.根据权利要求10所述的方法,其特征在于,步骤C所述在客户端测试最近的碰撞点包括客户端测试所有与射线发生碰撞的模型的三角形数据,计算最近的碰撞点,并返回碰撞测试结果。
12.根据权利要求10所述的方法,其特征在于,步骤C所述在服务器侧判断是否碰撞包括当服务器检测到射线与某一个三角形发生碰撞时,立即返回测试成功。
13.根据权利要求10所述的方法,其特征在于,步骤C所述检测在射线检测距离内的射线与四叉树的碰撞检测包括如下流程Cl、判断根结点是否是叶子结点,若是,执行步骤C2,否则执行步骤C3 ; C2、检测叶子结点中模型碰撞,然后结束本流程;C3、判断射线是否与根结点AABB碰撞,若是执行步骤C4,否则结束本流程; C4、判断该根结点是否存在未检验的子结点,若是执行步骤C7,否则执行步骤C5 ; C5、判断该根结点是否有父结点,若是执行步骤C6,否则结束本流程; C6、返回父节点,并转至步骤C4;C7、判断子结点是否是叶子结点,若是执行步骤C8,否则执行步骤ClO ; C8、判断该叶子结点是否存在模型数据,若是执行步骤C9,否则执行步骤C6 ; C9、测试射线与叶子结点中模型的碰撞,然后返回步骤C5 ; C10、测试射线与子结点的碰撞;Cll 若碰撞成功,执行步骤C12,若碰撞失败,返回步骤C4;C12 判断该子节点是否是叶子结点,若是,返回步骤C4,否则以这个子节点为当前结点,然后返回步骤C4。
14.根据权利要求10所述的方法,其特征在于,步骤C所述检测在射线检测距离内的射线与四叉树叶结点和AABB及三角形的碰撞包括如下流程C13、判断当前场景是否存在碰撞模型,若是,执行步骤C14,否则结束本流程; C14、判断射线测试等级是否大于模型的逻辑碰撞等级,若是,执行步骤C15,否则返回步骤C13 ;C15、判断射线与模型AABB碰撞是否成功,若是,执行步骤C16,否则返回步骤C13 ; C16、转换射线和起始点到模型本地坐标系; C17、设置根结点;C18、测试射线与当前结点模型的AABB的碰撞;C19、若碰撞成功,执行步骤C20,否则转至步骤C23 ;C20、判断当前结点是否是叶子结点,若是执行步骤C24,否则执行步骤C21 ;C21、判断子节点是否遍历完毕,若是,执行步骤C23,否则执行步骤C22 ;C22、访问子节点,并返回步骤C18 ;C23、判断是否存在父节点,若是返回步骤C21,否则结束本流程; C24、判断是否存在三角形集合,若是执行步骤C25,否则执行步骤C23 ; C25、测试射线与三角形的碰撞;C26、判断碰撞是否成功,若是执行步骤C27,否则返回步骤C24 ;C27、判断本次碰撞是否比最近碰撞距离更近,若是,执行步骤C28,否则返回步骤C24 ;C28、记录碰撞点,并返回步骤C24。
全文摘要
本发明提供了一种实时碰撞检测系统的实现方法,包括如下步骤A、将场景分割成四叉树,制作场景中需要发生碰撞的物体的带逻辑等级的碰撞模型,生成碰撞模型的模型数据文件以及场景的四叉树及结点信息文件;B、读取所述四叉树及结点信息文件,创建管理模型的四叉树;读取模型数据文件,根据碰撞模型的数量读取碰撞模型中的三角形数据,创建保存三角形数据的数组,并生成碰撞模型的沿轴排列包围盒AABB,根据最长坐标轴对碰撞模型进行排序,然后建立AABB树;C、在客户端和服务器侧检测在射线检测距离内的射线与四叉树的碰撞,以及射线与四叉树叶结点、AABB树及三角形的碰撞,其中在客户端测试最近的碰撞点,在服务器侧判断是否碰撞。
文档编号G06T11/00GK102509317SQ20111028967
公开日2012年6月20日 申请日期2011年9月27日 优先权日2011年9月27日
发明者张明阳, 龚静 申请人:北京像素软件科技股份有限公司