发明内容
有鉴于此,本说明书实施例提供了一种碰撞检测方法及装置、一种计算设备及存储介质,以解决现有技术中存在的技术缺陷。
第一方面,本说明书一实施例提供了一种碰撞检测方法,包括:
获取至少两个待检测物体,并确定每个所述待检测物体的物体粒度;
根据每个所述待检测物体的物体粒度建立对应的网格层,其中,所述网格层的网格粒度根据所述待检测物体的物体粒度确定;
确定每个所述待检测物体在其对应的网格层的网格层坐标;
根据所述至少两个待检测物体各自的网格层坐标确定所述至少两个待检测物体的碰撞关系。
可选的,根据每个所述待检测物体的物体粒度建立对应的网格层包括:
预先建立至少两个物体粒度区间;
根据每个所述待检测物体的物体粒度将每个所述待检测物体标记到对应的物体粒度区间;
若所述物体粒度区间中记录的待检测物体的数量大于或等于预设阈值,则为所述物体粒度区间建立对应的网格层。
可选的,根据每个所述待检测物体的物体粒度建立对应的网格层包括:
获取所述至少两个待检测物体中的第i个待检测物体的物体粒度,其中i为正整数;
以所述第i个待检测物体的物体粒度为物体粒度上限,建立至少两个物体粒度区间,其中,每个物体粒度区间的最大值均不超过所述物体粒度上限;
若第i+1个待检测物体的物体粒度小于所述第i个待检测物体的物体粒度,则根据所述第i+1个待检测物体的物体粒度确定对应的物体粒度区间;
若第i+1个待检测物体的物体粒度大于所述第i个待检测物体的物体粒度,则以所述第i+1个待检测物体的物体粒度作为更新后的物体粒度上限,建立新的物体粒度区间;
根据每个所述待检测物体的物体粒度将每个所述待检测物体标记到对应的物体粒度区间;
若所述物体粒度区间记录的待检测物体的数量大于或等于预设阈值,则为所述物体粒度区间建立对应的网格层。
可选的,所述方法还包括:
若所述物体粒度区间中的待检测物体的数量小于预设阈值,则将所述物体粒度区间中的待检测物体标记到与所述待检测物体被标记到物体粒度区间相邻的,且物体粒度区间最小值不小于所述待检测物体所在的物体粒度区间最大值的物体粒度区间对应的的网格层。
可选的,所述网格层坐标包括待检测物体的物体粒度,待检测物体在所述网格层的横坐标以及所述待检测物体在所述网格层的纵坐标,
确定每个所述待检测物体在其对应的网格层的网格层坐标包括:
以每个待检测物体的物体粒度为z轴,每个待检测物体在所述网格层的横坐标为x轴以及每个待检测物体在所述网格层的纵坐标为y轴,将所述网格层转换为粒度坐标系,确定每个所述待检测物体在所述粒度坐标系的坐标。
可选的,根据所述至少两个待检测物体各自的网格层坐标确定所述至少两个待检测物体的碰撞关系包括:
根据所述至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的坐标确定所述至少两个待检测物体的碰撞关系。
可选的,根据所述至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的坐标确定所述至少两个待检测物体的碰撞关系包括:
对于位于同一网格层的待检测物体,根据至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的x轴和y轴坐标确定所述至少两个待检测物体的第一碰撞关系;
对于位于不同网格层的待检测物体,根据所述至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的x轴、y轴和z轴坐标确定所述至少两个待检测物体的第二碰撞关系;
根据所述第一碰撞关系和所述第二碰撞关系确定所述至少两个待检测物体的碰撞关系。
第二方面,本说明书一实施例还提供了一种碰撞检测装置,包括:
第一获取模块,被配置为获取至少两个待检测物体,并确定每个所述待检测物体的物体粒度;
第一网格层建立模块,被配置为根据每个所述待检测物体的物体粒度建立对应的网格层,其中,所述网格层的网格粒度根据所述待检测物体的物体粒度确定;
网格层坐标确定模块,被配置为确定每个所述待检测物体在其对应的网格层的网格层坐标;
碰撞关系确定模块,被配置为根据所述至少两个待检测物体各自的网格层坐标确定所述至少两个待检测物体的碰撞关系。
可选的,所述第一网格层建立模块包括:
区间建立子模块,被配置为预先建立至少两个物体粒度区间;
第一标记子模块,被配置为根据每个所述待检测物体的物体粒度将每个所述待检测物体标记到对应的物体粒度区间;
第二网格层建立子模块,被配置为若所述物体粒度区间中记录的待检测物体的数量大于或等于预设阈值,则为所述物体粒度区间建立对应的网格层。
可选的,所述第一网格层建立模块包括:
第二获取子模块,被配置为获取所述至少两个待检测物体中的第i个待检测物体的物体粒度,其中i为正整数;
第二建立子模块,被配置为以所述第i个待检测物体的物体粒度为物体粒度上限,建立至少两个物体粒度区间,其中,每个物体粒度区间的最大值均不超过所述物体粒度上限;
第一判断子模块,被配置为若第i+1个待检测物体的物体粒度小于所述第i个待检测物体的物体粒度,则根据所述第i+1个待检测物体的物体粒度确定对应的物体粒度区间;
第二判断子模块,被配置为若第i+1个待检测物体的物体粒度大于所述第i个待检测物体的物体粒度,则以所述第i+1个待检测物体的物体粒度作为更新后的物体粒度上限,建立新的物体粒度区间;
第二标记子模块,被配置为根据每个所述待检测物体的物体粒度将每个所述待检测物体标记到对应的物体粒度区间;
第三网格层建立子模块,被配置为若所述物体粒度区间记录的待检测物体的数量大于或等于预设阈值,则为所述物体粒度区间建立对应的网格层。
可选的,所述装置还包括:
第三标记模块,被配置为若所述物体粒度区间中的待检测物体的数量小于预设阈值,则将所述物体粒度区间中的待检测物体标记到与所述待检测物体被标记到物体粒度区间相邻的,且物体粒度区间最小值不小于所述待检测物体所在的物体粒度区间最大值的物体粒度区间对应的的网格层。
可选的,所述网格层坐标包括待检测物体的物体粒度,待检测物体在所述网格层的横坐标以及所述待检测物体在所述网格层的纵坐标,
所述网格层坐标确定模块,还被配置为:
以每个待检测物体的物体粒度为z轴,每个待检测物体在所述网格层的横坐标为x轴以及每个待检测物体在所述网格层的纵坐标为y轴,将所述网格层转换为粒度坐标系,确定每个所述待检测物体在所述粒度坐标系的坐标。
可选的,所述碰撞关系确定模块,还被配置为:
根据所述至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的坐标确定所述至少两个待检测物体的碰撞关系。
可选的,所述碰撞关系确定模块包括:
第一碰撞关系确定子模块,被配置为对于位于同一网格层的待检测物体,根据至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的x轴和y轴坐标确定所述至少两个待检测物体的第一碰撞关系;
第二碰撞关系确定子模块,被配置为对于位于不同网格层的待检测物体,根据所述至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的x轴、y轴和z轴坐标确定所述至少两个待检测物体的第二碰撞关系;
碰撞关系确定子模块,被配置为根据所述第一碰撞关系和所述第二碰撞关系确定所述至少两个待检测物体的碰撞关系。
第三方面,本说明书一实施例还提供了一种计算设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机指令,所述处理器执行所述指令时实现该指令被处理器执行时实现如上所述碰撞检测方法的步骤。
第四方面,本说明书一实施例还提供了一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时实现如上所述碰撞检测方法的步骤。
本申请提供的一种碰撞检测方法及装置、一种计算设备及存储介质,其中,所述方法包括获取至少两个待检测物体,并确定每个所述待检测物体的物体粒度;根据每个所述待检测物体的物体粒度建立对应的网格层,其中,所述网格层的网格粒度根据所述待检测物体的物体粒度确定;确定每个所述待检测物体在其对应的网格层的网格层坐标;根据所述至少两个待检测物体各自的网格层坐标确定所述至少两个待检测物体的碰撞关系。采用该方法在保证碰撞检测性能提高的基础上,摒弃预处理以及代价较高的数据结构重构操作,极大的节省了***性能消耗,提升用户体验。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本说明书一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
首先,对本发明一个或多个实施例涉及的名词术语进行解释。
Doorkeeper:在本说明书实施例中的中文解释为“看门狗”,为网格层确定***,通过对进入该***的物体的监控,确定与进入的物体对应的网格层的数量以及网格层的网格粒度。Doorkeeper通过记录所有经过该***的物体的大小,对这些物体大小进行统计,利用自身对网络层的算法,确定需要建立的网格层的层数以及每层网格层的网格粒度。
在本说明书中,提供了一种碰撞检测方法及装置、一种计算设备及存储介质,在下面的实施例中逐一进行详细说明。
图1是示出了根据本说明书一实施例的计算设备100的结构框图。该计算设备100的部件包括但不限于存储器110和处理器120。处理器120与存储器110通过总线130相连接,数据库150用于保存数据。
计算设备100还包括接入设备140,接入设备140使得计算设备100能够经由一个或多个网络160通信。这些网络的示例包括公用交换电话网(PSTN)、局域网(LAN)、广域网(WAN)、个域网(PAN)或诸如因特网的通信网络的组合。接入设备140可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(NIC))中的一个或多个,诸如IEEE802.11无线局域网(WLAN)无线接口、全球微波互联接入(Wi-MAX)接口、以太网接口、通用串行总线(USB)接口、蜂窝网络接口、蓝牙接口、近场通信(NFC)接口,等等。
在本说明书的一个实施例中,计算设备100的上述以及图1中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图1所示的计算设备结构框图仅仅是出于示例的目的,而不是对本说明书范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。
计算设备100可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或PC的静止计算设备。计算设备100还可以是移动式或静止式的服务器。
其中,处理器120可以执行图2所示方法中的步骤。图2是示出了根据说明书一实施例的碰撞检测方法的示意性流程图,包括步骤202至步骤208。
步骤202:获取至少两个待检测物体,并确定每个所述待检测物体的物体粒度。
本说明书一个或多个实施例中,所述待检测物体的数量至少为两个,也可以是三个或三个以上,根据实际应用获取合适的待检测物体的数量,本申请对此不作任何限定。
实际应用中,获取的待检测物体包括待检测物体的数量至少为两个的待检测物体集,其中,所述待检测物体包括但不限于游戏场景中规则或者不规则的图形,例如人物角色或者攻击道具等。
本说明书一个或多个实施例中,可以采用Doorkeeper获取到合适数量的待检测物体之后,还可以使用Doorkeeper直接对每个待检测物体的物体粒度进行检测。
步骤204:根据每个所述待检测物体的物体粒度建立对应的网格层,其中,所述网格层的网格粒度根据所述待检测物体的物体粒度确定。
本说明书一个或多个实施例中,获取的至少两个待检测物体的粒度不同,根据每个所述待检测物体的物体粒度建立对应的网格层即每一个物体粒度不同的待检测物体均会建立一个对应的网格层。因获取的至少两个待检测物体的粒度不同,则根据每个所述待检测物体的物体粒度建立对应的网格层数量也至少为两个或两个以上。
参见图3,若获取的待检测物体的数量为3个,并且3个待检测物体的物体粒度均不相同,则根据每个待检测物体的物体粒度建立对应的3层网格层,即网格层1、网格层2和网格层3。
实际应用中,获取的待检测物体的数量和建立的网格层的数量并非一一对应,物体粒度相同的待检测物体对应建立一层网格层,网格层的数量是根据待检测物体的物体粒度确定的。
本说明书一个或多个实施例中,所述网格层的网格粒度根据所述待检测物体的物体粒度确定,确保所述待检测物体可以映射到所述网格层的网格中,使得所述待检测物体的物体粒度不会大于所述网格层的网格粒度。实际使用中,所述网格层的网格粒度大于或等于所述待检测物体的物体粒度。
本说明书一个或多个实施例中,根据每个所述待检测物体的物体粒度建立对应的网格层包括:
预先建立至少两个物体粒度区间;
根据每个所述待检测物体的物体粒度将每个所述待检测物体标记到对应的物体粒度区间;
若所述物体粒度区间中记录的待检测物体的数量大于或等于预设阈值,则为所述物体粒度区间建立对应的网格层。
本说明书一个或多个实施例中,可以采用多种划分算法对物体粒度区间进行划分,例如采用平均划分方式、递增或递减划分方式等。根据实际需要进行合理划分,本申请对此不作任何限定。
本说明书一个或多个实施例中,所述物体粒度区间与网格层非一一对应,在所述物体粒度区间中记录的待检测物体的数量大于或等于预设阈值时,才为满足该预设阈值的物体粒度区间建立对应的网格层。
例如预设阈值为20,在所述物体粒度区间中记录的待检测物体的数量大于或等于20个时,才为满足该预设阈值的物体粒度区间建立对应的网格层。
实际应用中,除采用预设阈值决定是否建立网格层外,还可以采用其他方式决定是否建立网格层,例如当前一个物体粒度区间与后一个物体粒度区间的比值大于或等于2或4时,才可以为前一个物体粒度区间建立对应的网格层。
步骤206:确定每个所述待检测物体在其对应的网格层的网格层坐标。
本说明书一个或多个实施例中,根据每个所述待检测物体的物体粒度建立对应的网格层之后,将每个所述待检测物体映射到对应的网格层中,再确定每个所述待检测物体在其对应的网格层的网格层坐标。
本说明书一个或多个实施例中,所述网格层坐标包括待检测物体的物体粒度,待检测物体在所述网格层的横坐标以及所述待检测物体在所述网格层的纵坐标。
在所述网格层坐标包括待检测物体的物体粒度,待检测物体在所述网格层的横坐标以及所述待检测物体在所述网格层的纵坐标的情况下,确定每个所述待检测物体在其对应的网格层的网格层坐标包括:
以每个待检测物体的物体粒度为z轴,每个待检测物体在所述网格层的横坐标为x轴以及每个待检测物体在所述网格层的纵坐标为y轴,将所述网格层转换为粒度坐标系,确定每个所述待检测物体在所述粒度坐标系的坐标。
参见图4,以待检测物体为2个,根据待检测物体的物体粒度建立的网格层为2层为例,对根据粒度坐标系确定每个待检测物体的坐标进行详细说明。
首先,将该2层网格层转换为粒度坐标系,所述粒度坐标系以物体粒度为z轴,以x轴和y轴表示待检测物体在粒度平面上的位置,以待检测物体的中心点在粒度平面上的坐标表示待检测物体在粒度平面上的坐标。通过所述粒度坐标系可以看出,下层网格层中的待检测物体A在粒度坐标系中的坐标为【6.5,5.5,2】,即该待检测物体在粒度为2mm的平面上,其在该平面上的坐标为(6.5,5.5)。上层网格层中的待检测物体B在粒度坐标系中的坐标为【6.5,5.5,4】,即该待检测物体在粒度为4mm的平面上,其在该平面上的坐标为(6.5,5.5)。然后,通过将物体A映射到上层网格层,物体A的映射与物体B重叠;或者通过将物体B映射到下层网格层,物体B的映射与物体A重叠,由此可以确定物体A与物体B必然发生碰撞。
步骤208:根据所述至少两个待检测物体各自的网格层坐标确定所述至少两个待检测物体的碰撞关系。
本说明书一个或多个实施例中,根据所述至少两个待检测物体各自的网格层坐标确定所述至少两个待检测物体的碰撞关系包括:
根据所述至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的坐标确定所述至少两个待检测物体的碰撞关系。
其中,根据所述至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的坐标确定所述至少两个待检测物体的碰撞关系包括:
对于位于同一网格层的待检测物体,根据至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的x轴和y轴坐标确定所述至少两个待检测物体的第一碰撞关系;
对于位于不同网格层的待检测物体,根据所述至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的x轴、y轴和z轴坐标确定所述至少两个待检测物体的第二碰撞关系;
根据所述第一碰撞关系和所述第二碰撞关系确定所述至少两个待检测物体的碰撞关系。
实际使用中,首先将待检测物体根据其物体粒度放入匹配的多层网格层中后,然后在每层网格层中对待检测物体进行碰撞关系检测得到第一碰撞检测结果,再对多个网格层中的待检测物体进行跨层碰撞检测,检测相邻网格层中的待检测物体的碰撞关系得到第二碰撞检测结果,最后从第一碰撞检测结果和第二碰撞检测结果可以得到待检测物体在多层网格层中最终的碰撞关系检测结果。
参见图5,以三层网格层a、b和c为例对待检测物体的碰撞关系检测方式进行说明。
图5中,网格层a1为网格层a的映射关系图。
对待检测物体的碰撞关系检测包括两种方式,一种是根据物体粒度较小的网格层的坐标与上一层物体粒度较大的网格层的坐标往父层方向检测,称为向上跨层检测;另一种是根据物体粒度较大的网格层的坐标与下一层物体粒度较小的网格层的坐标往子层方向检测,称为向下跨层检测。
其中,向上跨层检测方式具体为:将网格层b中的物体1映射到网格层a中某个坐标相同区域11中,检测物体1与网格层a中哪些物体发生碰撞。首先物体1必然会与网格层a中坐标相同区域11中的物体发生碰撞,然后再根据同层检测方法对物体1与网格层a坐标相同区域11周边的8个灰色格子区域中的物体进行碰撞检测。
向下跨层检测方式具体为:将网格层b中其中一个物体对应的矩形ABCD区域映射到网格层c中,然后根据该矩形ABCD区域确定网格层c中的物体检测区域:矩形A’B’C’D’,其中,该矩形A’B’C’D’区域为映射在网格层c的矩形ABCD区域的边界均向外扩展一个子层分区大小得到的,该子层分区大小为网格层c的一个网格的大小。
在向下跨层检测方式中,还需要检测映射在网格层c的矩形ABCD区域中的物体会与网格层c中的哪些物体发生碰撞。首先,矩形ABCD区域中的物体必然会与矩形A’B’C’D’区域中的物体发生碰撞,然后再根据现有的同层检测方法将矩形ABCD区域中的物体与矩形A’B’C’D’区域中除对应的矩形ABCD区域周边的其它灰色格子区域中的物体进行碰撞检测。
实际应用中,在对单层网格层中的待检测物体进行碰撞检测时,采用哈希的结构,用一个待检测物体占一格的九宫格检测方式,但是本说明书实施例的网格层有多个,而且每一个的划分粒度都不一样,就像四叉树那样每一层的空间网格粒度都是不一样的,然后不同物体粒度大小的待检测物体就放到不同网格粒度的网格层里,待检测物体的碰撞关系检测时,对于同一层的待检测物体就使用九宫格的方式检测待检测物体之间的碰撞关系,不同层的待检测物体使用类似四叉树的方式检测待检测物体之间的碰撞关系。
如此一来就完全避免了对待检测物体排重操作,而且因为不同大小的待检测物体被放入不同的网格层中,避免了同层待检测物体之间的交叠检测,使得待检测物体的碰撞检测精度始终比较精确。
本说明书一个或多个实施例中,先采用Doorkeeper获取待检测物体的每个待检测物体的物体粒度,然后根据物体粒度建立对应的多层网格层,然后将每个待检测物体根据物体粒度放入与网格层粒度相匹配的网格层中,使得获取的待检测物体可以在各层网格层内部碰撞关系检测后,再跨网格层进行碰撞关系检测,得到最后的碰撞关系检测结果即待检测物体谁与谁发生碰撞,采用这种多层网格划分法对待检测物体进行碰撞关系检测,并设计了用于进行网格层划分的Doorkeeper,Doorkeeper根据获取的待检测物体的物体粒度采用预设网格层划分算法,实现网格层的自动划分,获得的碰撞关系检测精度更高,同时也节约了大量开销。
处理器120可以执行图6所示方法中的步骤。图6是示出了根据说明书一实施例的碰撞检测方法的示意性流程图,包括步骤602至步骤618。
步骤602:获取至少两个待检测物体,并确定每个所述待检测物体的物体粒度。
步骤604:获取所述至少两个待检测物体中的第i个待检测物体的物体粒度,其中i为正整数。
步骤606:以所述第i个待检测物体的物体粒度为物体粒度上限,建立至少两个物体粒度区间,其中,每个物体粒度区间的最大值均不超过所述物体粒度上限。
步骤608:若第i+1个待检测物体的物体粒度小于所述第i个待检测物体的物体粒度,则根据所述第i+1个待检测物体的物体粒度确定对应的物体粒度区间。
步骤610:若第i+1个待检测物体的物体粒度大于所述第i个待检测物体的物体粒度,则以所述第i+1个待检测物体的物体粒度作为更新后的物体粒度上限,建立新的物体粒度区间。
步骤612:根据每个所述待检测物体的物体粒度将每个所述待检测物体标记到对应的物体粒度区间。
步骤614:若所述物体粒度区间记录的待检测物体的数量大于或等于预设阈值,则为所述物体粒度区间建立对应的网格层。
本说明书一个或多个实施例中,若所述物体粒度区间中的待检测物体的数量小于预设阈值,则将所述物体粒度区间中的待检测物体标记到与所述待检测物体被标记到物体粒度区间相邻的,且物体粒度区间最小值不小于所述待检测物体所在的物体粒度区间最大值的物体粒度区间对应的的网格层。
参见图7,若所述物体粒度区间包括【6,4】、【4,2】、【2,1】,预设阈值为10,其中,物体粒度区间【4,2】中的待检测物体的数量为8,可以确定该区间的待检测物体的数量8小于预设阈值10,则将物体粒度区间【4,2】中的待检测物体标记到与所述待检测物体被标记到物体粒度区间【4,2】相邻的,且物体粒度区间最小值不小于所述待检测物体所在的物体粒度区间最大值4的物体粒度区间对应的网格层,即物体粒度区间【6,4】对应的网格层。其中,物体粒度区间【6,4】的最小值为4,物体粒度区间【4,2】的最大值为4,则最小值不小于物体粒度区间【4,2】的物体粒度区间即为【6,4】。
本说明书一个或多个实施例中,将所述物体粒度区间简称为“桶”为例进行说明。
首先,定义两个常量step和c,Doorkeeper获取到待检测物体集之后,首先获取待检测物体集中的一个待检测物体i的物体粒度,然后将待检测物体i的物体粒度记为K,建立一个网格粒度为K的网格层,然后采用预设的划分方式根据K建立n个“桶”,这些“桶”分别包括:【k/step^n,k/step^(n-1)】,…,【k/step^2,k/step】,【k/step,k】,即第一个“桶”用区间【k/step,k】表示,第二个“桶”用【k/step^2,k/step】表示......,第n个“桶”用区间【k/step^n,k/step^(n-1)】表示,实际应用中还可以有其他公式用于划分“桶”的区间,例如上述实施例提到的平均划分(各个区间大小相等)等方式,可以根据实际需求选择“桶”区间的划分方式,本申请对此不作任何限定。
当获取到第二个待检测物体i+1的物体粒度后,获取第二个待检测物体i+1的物体粒度。
若第一个待检测物体i+1的物体粒度大于第二个待检测物体i+1的物体粒度时,则为第二个待检测物体i+1找到对应的物体粒度区间,并将第二个待检测物体i+1放入相应的“桶”中,例如如果第二个待检测物体i+1的物体粒度size∈【k/step^n,k/step^(n-1)】,就将第二个待检测物体i+1“放入”【k/step^n,k/step^(n-1)】所对应的“桶”中,这里的“放入”并不是指真的把待检测物体放入“桶”结构中,“桶”是一个数值的容器,此时只是让“桶”+1。第二个待检测物体i+1放入“桶”后,检查“桶”中待检测物体的数量,如果数量大于或等于阀值c,那么建立一张网格粒度等于“桶”区间右端点的网格层,即第二个待检测物体i+1放入了【k/step^n,k/step^(n-1)】对应的“桶”后,“桶”的值大于或等于c,那么建立一层网格粒度等于k/step^(n-1)的网格层。
若第一个待检测物体i+1的物体粒度小于第二个待检测物体i+1的物体粒度时,则那么设m=k*step,建立一个【k,m】的“桶”,并建立一层网格粒度为m的网格层,然后检查【k/step,k】这个“桶”的值是否大于或等于阀值c,若不是,删除划分粒度为k的网格层,将【k/step,k】这个“桶”中的物体放入网格粒度为m的网格层中,并将k这一个变量修改为m,即让k这一个变量总是记载着最大区间的右端点,直至Doorkeeper获取的待检测物体集中的待检测物体全部遵循该规则建立相应的网格层后结束。
实际应用中,当有一个检测物体删除后,需要判断这个检测物体是否在最大区间【k/step,k】对应的“桶”中,如果不是,假定这个物体属于【a,b】这个“桶”,那么删除网格粒度为b的网格层;如果是,删除该检测物体后若“桶”的值等于0,则删除网格粒度为k的网格层,保留其网格粒度为k/step的网格层,并将k/step修改为k,其余网格粒度依次修改。注意这里只要【k/step,k】的值大于0,不管其是否小于c都不会删除划分粒度为k的网格层。
图8示出了上述物体粒度区间以“桶”结构展示的状态示意图,其中,待检测物体的物体粒度为k、k/step、k/step^2、k/step^3、k/step^4、k/step^5,根据该物体粒度划分的“桶”包括【k/step,k】、【k/step^2,k/step】、【k/step^3,k/step^2】、【k/step^4,k/step^3】、【k/step^5,k/step^4】,并且桶【k/step,k】中的待检测物体数量小于c,桶【k/step^2,k/step】中的待检测物体数量小于c,桶【k/step^3,k/step^2】中的待检测物体数量大于c,桶【k/step^4,k/step^3】中的待检测物体数量小于c,桶【k/step^5,k/step^4】中的待检测物体数量小于c,根据上述网格层建立规则,则建立一个网格粒度为k的网格层,所述物体粒度为k/step的待检测物体放入网格粒度为k的网格层中,建立一个网格粒度为k/step^2的网格层,所述物体粒度为k/step^3、k/step^4、k/step^5的待检测物体放入网格粒度为k/step^2的网格层中。
步骤616:确定每个所述待检测物体在其对应的网格层的网格层坐标。
步骤618:根据所述至少两个待检测物体各自的网格层坐标确定所述至少两个待检测物体的碰撞关系。
本说明书一个或多个实施例中,采用物体粒度区间建立网格层,将物体粒度区间以“桶”的概念呈现,如果一个“桶”有建立对应的网格层,那么“桶”中的物体会被放入这一个对应的网格层中,但是如果一个“桶”中物体的数量太小,不建立对应的网格层,那么该“桶”中的物体则会被放入右边相邻最近的一个建立有网格层的“桶”的网格层中,遵循此规则,可以根据所有待检测物体的物体粒度建立最优层数以及粒度的网格层,使得待检测物体使用该网格层进行碰撞关系检测时,检测结果更加精准省时,极大的提升了用户的体验效果。
参见图9,本说明书一实施例还提供了一种碰撞检测装置,包括:
第一获取模块902,被配置为获取至少两个待检测物体,并确定每个所述待检测物体的物体粒度;
第一网格层建立模块904,被配置为根据每个所述待检测物体的物体粒度建立对应的网格层,其中,所述网格层的网格粒度根据所述待检测物体的物体粒度确定;
网格层坐标确定模块906,被配置为确定每个所述待检测物体在其对应的网格层的网格层坐标;
碰撞关系确定模块908,被配置为根据所述至少两个待检测物体各自的网格层坐标确定所述至少两个待检测物体的碰撞关系。
可选的,所述第一网格层建立模块904包括:
区间建立子模块,被配置为预先建立至少两个物体粒度区间;
第一标记子模块,被配置为根据每个所述待检测物体的物体粒度将每个所述待检测物体标记到对应的物体粒度区间;
第二网格层建立子模块,被配置为若所述物体粒度区间中记录的待检测物体的数量大于或等于预设阈值,则为所述物体粒度区间建立对应的网格层。
可选的,所述第一网格层建立模块904包括:
第二获取子模块,被配置为获取所述至少两个待检测物体中的第i个待检测物体的物体粒度,其中i为正整数;
第二建立子模块,被配置为以所述第i个待检测物体的物体粒度为物体粒度上限,建立至少两个物体粒度区间,其中,每个物体粒度区间的最大值均不超过所述物体粒度上限;
第一判断子模块,被配置为若第i+1个待检测物体的物体粒度小于所述第i个待检测物体的物体粒度,则根据所述第i+1个待检测物体的物体粒度确定对应的物体粒度区间;
第二判断子模块,被配置为若第i+1个待检测物体的物体粒度大于所述第i个待检测物体的物体粒度,则以所述第i+1个待检测物体的物体粒度作为更新后的物体粒度上限,建立新的物体粒度区间;
第二标记子模块,被配置为根据每个所述待检测物体的物体粒度将每个所述待检测物体标记到对应的物体粒度区间;
第三网格层建立子模块,被配置为若所述物体粒度区间记录的待检测物体的数量大于或等于预设阈值,则为所述物体粒度区间建立对应的网格层。
可选的,所述装置还包括:
第三标记模块,被配置为若所述物体粒度区间中的待检测物体的数量小于预设阈值,则将所述物体粒度区间中的待检测物体标记到与所述待检测物体被标记到物体粒度区间相邻的,且物体粒度区间最小值不小于所述待检测物体所在的物体粒度区间最大值的物体粒度区间对应的的网格层。
可选的,所述网格层坐标包括待检测物体的物体粒度,待检测物体在所述网格层的横坐标以及所述待检测物体在所述网格层的纵坐标,
所述网格层坐标确定模块906,还被配置为:
以每个待检测物体的物体粒度为z轴,每个待检测物体在所述网格层的横坐标为x轴以及每个待检测物体在所述网格层的纵坐标为y轴,将所述网格层转换为粒度坐标系,确定每个所述待检测物体在所述粒度坐标系的坐标。
可选的,所述碰撞关系确定模块908,还被配置为:
根据所述至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的坐标确定所述至少两个待检测物体的碰撞关系。
可选的,所述碰撞关系确定模块包括:
第一碰撞关系确定子模块,被配置为对于位于同一网格层的待检测物体,根据至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的x轴和y轴坐标确定所述至少两个待检测物体的第一碰撞关系;
第二碰撞关系确定子模块,被配置为对于位于不同网格层的待检测物体,根据所述至少两个待检测物体中每个所述待检测物体在所述粒度坐标系的x轴、y轴和z轴坐标确定所述至少两个待检测物体的第二碰撞关系;
碰撞关系确定子模块,被配置为根据所述第一碰撞关系和所述第二碰撞关系确定所述至少两个待检测物体的碰撞关系。
本说明书一个或多个实施例中,所述碰撞检测装置使用Doorkeeper为待检测物体集建立多层网格层,所述多层网格层按照待检测物体集中待检测物体的物体粒度大小进行层数和网格粒度的划分,然后将待检测物体集中的每个待检测物体放入相匹配的网格层中进行碰撞检测计算,具有动态调整的特性,不管应用在何种场景,均可以保持一种较好的网格层建立性能,始终可以自行设置网格层的层数和网格粒度,使得待检测物体在最优的网格层中进行碰撞检测时检测精度更高,耗时更少,提升用户体验。
参见图10,本说明书一个或多个实施例中提供的一种碰撞检测方法通过建立多层网格层的方法对物体进行碰撞检测,并且可以使用Doorkeeper对网格层的层数以及网格层粒度进行自动划分等,相比现有技术中的网格划分法以及四叉树等,本说明书的碰撞检测方法在进行物体的碰撞检测时对网格层划分精度更高,同时提高了工作效率,节约了大量的开销。
将本说明书一个或多个实施例提供的一种碰撞检测方法与现有技术中网格划分法以及四叉树进行比较,通过图10可以看出,本说明书一个或多个实施例提供的一种碰撞检测方法对同一多个物体进行碰撞检测时,本说明书的碰撞检测方法的碰撞检测耗时远远优于现有技术中网格划分法以及四叉树,其碰撞检测效果也最优。
本说明书一实施例还提供一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时实现如前所述碰撞检测方法的步骤。
上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的碰撞检测方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述碰撞检测方法的技术方案的描述。
所述计算机指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本申请所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
以上公开的本申请优选实施例只是用于帮助阐述本申请。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本申请的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本申请。本申请仅受权利要求书及其全部范围和等效物的限制。