发明内容
本发明实施例的目的在于提供一种碰撞测试方法、装置、电子设备及存储介质,以提高碰撞测试的计算效率。具体技术方案如下:
第一方面,本发明实施例提供了一种碰撞测试方法,所述方法包括:
获取目标物的待移动位置,所述目标物为待移动的物体;
从预设的可连通网格单元集合中,确定所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元;其中,所述可连通网格单元集合包括组成障碍物之间可连通空间的网格单元;
如果所述待移动位置在所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元中任一网格单元内,则确定所述目标物从所述当前位置移动到待移动位置时,与所述障碍物不发生碰撞。
可选的,所述方法还包括:
如果所述待移动位置不在所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元中任一网格单元内,则确定所述目标物从所述当前位置移动到待移动位置时,与所述障碍物发生碰撞。
可选的,所述方法还包括:在确定所述目标物从所述当前位置移动到待移动位置时,与所述障碍物不发生碰撞的情况下,或在所述待移动位置在所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元中任一网格单元内的情况下,将所述目标物从所述当前位置移动到所述待移动位置。可选的,所述网格单元为四面体;
所述可连通网格单元集合是按照以下方式获得的:
获取可连通立方体集合,所述可连通立方体集合包括组成障碍物之间可连通空间的立方体;
对所述可连通体立方体集合中的立方体进行四面体划分,得到所述可连通网格单元集合。
可选的,所述获取可连通立方体集合的步骤,包括:
获取场景立方体集合,所述场景立方体集合包括组成目标立方体的立方体,所述目标立方体覆盖所述场景内所有障碍物;
确定所述场景中各个障碍物所在的立方体,并进行去重,得到障碍物立方体集合;
利用膨胀算法,对所述障碍物立方体集合进行膨胀处理;
从所述场景立方体集合中去除膨胀后的障碍物立方体集合,得到可连通立方体集合。
可选的,所述获取场景立方体集合的步骤,包括:
计算覆盖所述场景内所有障碍物的目标立方体;
根据预设算法,对计算的目标立方体进行立方体划分,得到场景立方体集合。
可选的,所述计算覆盖所述场景内所有障碍物的目标立方体步骤,包括:
计算覆盖所述场景内所有障碍物的最小立方体,将所述最小立方体确定为覆盖所述场景内所有障碍物的目标立方体。
可选的,所述预设算法为八叉树算法;
所述从预设的可连通网格单元集合中,确定所述目标物的当前位置所处的四面体的步骤,包括:
按照八叉树的数据结构,保存所述可连通网格单元集合,生成可连通空间八叉树;
按照八叉树遍历方法,从所述可连通空间八叉树中确定所述目标物的当前位置所处的四面体。
可选的,所述目标物为虚拟相机。
可选的,所述网格单元为四面体或三角形。
第二方面,本发明实施例提供了一种碰撞测试装置,所述装置包括:
第一获取模块,用于获取目标物的待移动位置,所述目标物为待移动的物体;
第一确定模块,用于从预设的可连通网格单元集合中,确定所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元;其中,所述可连通网格单元集合包括组成障碍物之间可连通空间的网格单元;
第二确定模块,用于如果所述待移动位置在所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元中任一网格单元内,则确定所述目标物从所述当前位置移动到待移动位置时,与所述障碍物不发生碰撞。
可选的,所述装置还包括:
第三确定模块,用于如果所述待移动位置不在所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元中任一网格单元内,则确定所述目标物从所述当前位置移动到待移动位置时,与所述障碍物发生碰撞。
可选的,所述装置还包括:
移动模块,用于在确定所述目标物从所述当前位置移动到待移动位置时,与所述障碍物不发生碰撞的情况下,或在所述待移动位置在所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元中任一网格单元内的情况下,将所述目标物从所述当前位置移动到所述待移动位置。
可选的,所述网格单元为四面体;
所述装置还包括:
第二获取模块,用于获取可连通立方体集合,所述可连通立方体集合包括组成障碍物之间可连通空间的立方体;
第一处理模块,用于对所述可连通体立方体集合中的立方体进行四面体划分,得到所述可连通网格单元集合。
可选的,所述第二获取模块包括:
获取子模块,用于获取场景立方体集合,所述场景立方体集合包括组成目标立方体的立方体,所述目标立方体覆盖所述场景内所有障碍物;
第一处理子模块,用于确定所述场景中各个障碍物所在的立方体,并进行去重,得到障碍物立方体集合;
膨胀子模块,用于利用膨胀算法,对所述障碍物立方体集合进行膨胀处理;
第二处理子模块,用于从所述场景立方体集合中去除膨胀后的障碍物立方体集合,得到可连通立方体集合。
可选的,所述获取子模块包括:
计算单元,用于计算覆盖所述场景内所有障碍物的目标立方体;
处理单元,用于根据预设算法,对计算的目标立方体进行立方体划分,得到场景立方体集合。
可选的,所述计算单元包括:
计算子单元,用于计算覆盖所述场景内所有障碍物的最小立方体,将所述最小立方体确定为覆盖所述场景内所有障碍物的目标立方体。
可选的,所述第一确定模块具体用于:
按照八叉树的数据结构,保存所述可连通网格单元集合,生成可连通空间八叉树;
按照八叉树遍历方法,从所述可连通空间八叉树中确定所述目标物的当前位置所处的四面体。
可选的,所述目标物为虚拟相机。
可选的,所述网格单元为四面体或三角形。
第三方面,本发明实施例提供了一种电子设备,包括处理器和存储器,其中:
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现上述任一碰撞测试方法所述的方法步骤。
第四方面,本发明实施例提供了一种计算机可读存储介质,其特征在于,该计算机可读存储介质内存储有计算机程序,该计算机程序被处理器执行时实现上述任一碰撞测试方法所述的方法步骤。
第五方面,本发明实施例提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述任一碰撞测试方法所述的方法步骤。
第六方面,本发明实施例提供了一种计算机程序,当其在计算机上运行时,使得计算机执行上述任一碰撞测试方法所述的方法步骤。
本发明实施例提供了一种碰撞测试方法、装置、电子设备及存储介质,首先,获取目标物的待移动位置,所述目标物为待移动的物体;从预设的可连通网格单元集合中,确定所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元;其中,所述可连通网格单元集合包括组成障碍物之间可连通空间的网格单元;如果所述待移动位置在所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元中任一网格单元内,则确定所述目标物从所述当前位置移动到待移动位置时,与所述障碍物不发生碰撞。
由于可连通网格单元集合中包括的是组成障碍物之间可连通空间的网格单元,目标物在网格单元内移动,或从一个网格单元移动相邻的网格单元都不会与障碍物发生碰撞,因此,如果所述待移动位置在所确定的任一网格单元内,所述目标物从所述当前位置移动到待移动位置时,就不会与所述障碍物不发生碰撞。针对目标物的每一次移动,目标物当前所处的网格单元和与该网格单元相邻的网格单元的数量决定碰撞测试的计算量,不需要与每个障碍物都做碰撞测试计算。当障碍物的数量较大时,可以减少碰撞测试的计算量,且计算量不会因为障碍物的变多或变少有较大的波动,因此,可以提高碰撞测试的计算效率。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
现有技术中,当确定待移动的目标物移动过程中是否会与障碍物发生碰撞时,针对一个待移动位置,计算是否发生碰撞的次数取决于障碍物的数量,因此,如果障碍物较多,计算量就会非常大,导致碰撞测试的计算效率较低。为了解决该技术问题,本发明实施例提供了一种碰撞测试方法、装置、电子设备及存储介质。
下面将结合具体实施例对本发明实施例提供的碰撞测试方法进行详细说明。
参照图1,本发明实施例提供碰撞测试方法包括如下步骤:
S101、获取目标物的待移动位置;
其中,目标物为待移动的物体,目标物可以为虚拟相机,当然,在其他实施方式中,目标物还可以是其他待移动的物体,例如,可以为提供场景照明的虚拟灯具。
目标物的待移动位置在当前位置到目标位置的路径上,根据目标物移动的最小单位,确定目标物下一步所要移动到的位置。其中,目标位置是用户通过滚动鼠标的滚轮,或者通过键盘输入的。
例如,当目标物处于A位置时,获取用户输入的目标位置即B位置,则根据目标物移动的最小单位,对A位置到B位置的路径进行离散化处理。如果A位置到B位置之间存在四个目标物移动的最小单位,则可以得到A位置与B位置之间的三个中间位置,具体为沿从A位置到B位置的路径依次分布的C位置、D位置和E位置;如果A位置到B位置之间仅存在一个目标物移动的最小单位,则不存在中间位置。如果得到的多个中间位置具体包括C位置、D位置和E位置,则当目标物当前处于A位置时,可以确定C位置为待移动位置;当目标物当前处于C位置时,可以确定D位置为待移动位置。如果A位置到B位置之间不存在中间位置,则当目标物当前处于A位置时,可以确定B位置为待移动位置。
S102、从预设的可连通网格单元集合中,确定目标物的当前位置所处的网格单元,以及与当前位置所处的网格单元相邻的网格单元;其中,可连通网格单元集合包括组成障碍物之间可连通空间的网格单元,障碍物之间可连通空间是除去障碍物之后的空间,障碍物是目标物移动时,不允许目标物穿过的物体。
网格单元的形状是预先设定的,如果该碰撞测试方法应用于三维空间,则网格单元可以为三维网格单元,如四面体、五面体或六面体等三维网格单元,这些三维网格单元可以为规则的多面体;如果该碰撞测试方法应用于二维空间,则网格单元可以为二维网格单元,如三角形、四边形或五边形等二维网格单元。
存储网格单元时,可以分别存储网格单元的索引号,以及索引号与关于网格单元的数据的对应关系,如网格单元的顶点坐标与索引号的对应关系,这样通过网格单元的索引号就可以确定网格单元的数据。其中,网格单元的数据可以用来计算目标物与网格单元相对位置关系的数据,具体是用来计算目标物是否在网格单元内的。
示例性的,以网格单元为四面体为例,可连通网格单元集合中,针对任一个四面体,至多存在四个与其相邻的四面体,两个四面体相邻是指两个四面体存在一个共用的面。存储四面体时,可以分别存储四面体的索引号,以及关于四面体的数据如四面体顶点坐标与索引号的对应关系,这样通过四面体的索引号就可以确定各个四面体的数据。其中,四面体的数据可以用来计算目标物与四面体相对位置关系的数据,具体是用来计算目标物是否在四面体内。
当然,在其他实施方式中,针对可连通网格单元集合中每个网格单元可以直接存储该网格单元的数据。
预设的可连通网格单元集合可以是指在本步骤之前获得的可连通网格单元集合,具体的,可以是预存在本地的可连通网格单元集合,也可以是动态加载的可连通网格单元集合。通过设置预设的可连通网格单元集合可以控制其所包括的网格单元的形状,从而可以控制与每个网格单元相邻的网格单元的最大数量。例如,如果网格单元为四面体,则与每个网格单元相邻的网格单元的最大数量是4个。
S103、如果待移动位置在目标物的当前位置所处的网格单元,以及与当前位置所处的网格单元相邻的网格单元中任一网格单元内,则确定目标物从当前位置移动到待移动位置时,与障碍物不发生碰撞。。
具体的,判断目标物是否在其当前所处的网格单元内,以及是否在与该网格单元相邻的网格单元内,如果目标物的待移动位置在目标物的当前位置所处的网格单元内,则当前位置到待移动位置之间不存在障碍物,目标物从当前位置移动到待移动位置不会与障碍物碰撞。如果目标物的待移动位置在任一与当前位置所处网格单元相邻的网格单元内,由于两个位置对应的网格单元是相邻的,目标物从当前位置移动到待移动位置不会与障碍物碰撞。
应用图1所示实施例,由于可连通网格单元集合中包括的是组成障碍物之间可连通空间的网格单元,目标物在网格单元内移动,或从一个网格单元移动相邻的网格单元都不会与障碍物发生碰撞,因此,如果所述待移动位置在所确定的任一网格单元内,所述目标物从所述当前位置移动到待移动位置时,就不会与所述障碍物不发生碰撞。针对目标物的每一次移动,目标物当前所处的网格单元和与该网格单元相邻的网格单元的数量决定碰撞测试的计算量,不需要与每个障碍物都做碰撞测试计算。当障碍物的数量较大时,可以减少碰撞测试的计算量,且计算量不会因为障碍物的变多或变少有较大的波动,因此,可以提高碰撞测试的计算效率。
另外,相比于现有技术中采用包围球和包围盒等手段对障碍物做碰撞检测,降低了计算的复杂度。
本发明实施例的一种实施方式中,如果待移动位置不在目标物的当前位置所处的网格单元,以及与当前位置所处的网格单元相邻的网格单元中任一网格单元内,即待移动位置不在目标物的当前位置所处的网格单元内,也不在当前位置所处的网格单元相邻的网格单元中任一网格单元内,则确定目标物从当前位置移动到待移动位置时,与障碍物发生碰撞。
在移动目标物会与障碍物发生碰撞的情况下,可以认为目标物从当前位置移动到待移动位置是无效的移动,可以不作出任何响应。
本发明实施例的一种实施方式中,该碰撞测试方法还包括:在确定目标物从当前位置移动到待移动位置时,与障碍物不发生碰撞的情况下,或在待移动位置在目标物的当前位置所处的网格单元,以及与当前位置所处的网格单元相邻的网格单元中任一网格单元内的情况下,将目标物从当前位置移动到待移动位置。其中,在待移动位置在目标物的当前位置所处的网格单元,以及与当前位置所处的网格单元相邻的网格单元中任一网格单元内的情况即在待移动位置在目标物的当前位置所处的网格单元内,或在当前位置所处的网格单元相邻的网格单元中任一网格单元内的情况下。
在这种情况下移动目标物,目标物不会与障碍物发生碰撞,而且由于碰撞测试的计算效率有所提高,因此,可以使得目标物平稳的移动,从而可以减少移动卡顿现象。如果目标物是虚拟相机,则可以减少场景画面的卡顿现象。
本发明实施例的一种实施方式中,应用于三维空间时,网格单元可以为四面体,则可连通网格单元集合是按照以下方式获得的:
(1)、获取可连通立方体集合,可连通立方体集合包括组成障碍物之间可连通空间的立方体;
其中,可以将本地预存的可连通立方体集合作为获取的可连通立方体集合,可连通立方体集合包括组成障碍物之间可连通空间的立方体,就是说,可连通立方体集合中的立方体组成障碍物之间的连通空间,是可以供目标物移动的空间,且不包含与障碍物有重叠的立方体。
(2)、对可连通立方体集合中的立方体进行四面体划分,得到可连通网格单元集合。
可以将每个立方体划分成预设数量个四面体,如12个,当然,在其他实施方式中,划分成其他不同数量的四面体也是可以的,或者划分成其他形状的三维网格单元也是可以的,如规则的多面体,在此不做具体限定。
进一步的,参照图2,获取可连通立方体集合的步骤,包括:
S201、获取场景立方体集合,场景立方体集合包括组成目标立方体的立方体,目标立方体覆盖场景内所有障碍物;
本步骤可以通过以下方式实现:
(1)、计算覆盖场景内所有障碍物的目标立方体;
本实施方式中,计算覆盖场景内所有障碍物的目标立方体步骤,可以包括:
计算覆盖场景内所有障碍物的最小立方体,将最小立方体确定为覆盖场景内所有障碍物的目标立方体。
当然,在其他实施方式中,计算覆盖场景内所有障碍物的其他大小的立方体也是可以的,即包含最小立方体的立方体也可以作为目标立方体,在此不做具体限定。
在本发明实施例的其它实施方式中,可以设置场景中目标立方体之外的空间是不允许目标物移动的空间,或者为允许目标物随意移动的空间。
在当场景中目标立方体之外的空间为允许目标物随意移动的空间的情况下,如果所述待移动位置不在所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元中任一网格单元内,则确定所述目标物从所述当前位置移动到待移动位置时,与所述障碍物发生碰撞,可以包括:
如果所述待移动位置不在所述目标物的当前位置所处的网格单元,以及与所述当前位置所处的网格单元相邻的网格单元中任一网格单元内,且也不在场景中目标立方体之外的空间内,则确定所述目标物从所述当前位置移动到待移动位置时,与所述障碍物发生碰撞。
(2)、根据预设算法,对计算的目标立方体进行立方体划分,得到场景立方体集合。预设算法可以为八叉树算法,具体划分时,针对待划分的目标立方体,可以将其划分成大小相等的八个立方体,从大到小,按照这种方式依次向下划分,直到所有的立方体都为预设大小的立方体。其中,预设大小可以是根据场景中的最小单元来人为设定的,或根据经验来人为设定的。
S202、确定场景中各个障碍物所在的立方体,并进行去重,得到障碍物立方体集合。
在存在至少两个障碍物对应一个立方体的情况下,所确定的所有立方体中,就存在多个同一个立方体,将相同的立方体保留一个即去重,可得到障碍物立方体集合。
S203、利用膨胀算法,对障碍物立方体集合进行膨胀处理。
其中,膨胀算法可以是一种现有的计算机图形学算法,通过膨胀处理后,相当于增大了障碍物的体积。
S204、从场景立方体集合中去除膨胀后的障碍物立方体集合,得到可连通立方体集合。
由于对障碍物立方体集合进行了膨胀处理,使得可连通立方体集合相对缩小了,因此,可以进一步保证目标物在移动时,避免与障碍物发生碰撞。
示例一,针对场景对应的立方体进行八叉树划分,具体划分成三层,第一层立方体索引号为1,第二层的立方体索引号分别为11、12、13、14、15、16、17和18,第三层的立方体为:立方体11对应的索引号分别为111、112……118等8个立方体,立方体12对应的索引号分别为121、122……128等8个立方体,依次类推,立方体18对应的索引号分别为181、182……188等8个立方体。假如,膨胀后的障碍物立方体集合包括索引号分别为111和112,181-188,151-158等18个立方体,则可连通立方体集合包括:索引号分别为113-118,121-128,131-138,141-148,161-168,171-178的46个立方体。
进一步的,该碰撞测试方法还可以包括:
按照八叉树的数据结构,保存可连通网格单元集合,生成可连通空间八叉树;其中,可连通空间八叉树的叶子节点为最终切分后获得各个立方体,叶子节点保存组成对应立方体的所有四面体;
需要说明的是,这里的可连通空间八叉树具体的结构中,每个节点对应的子节点可能是8个或0个以外的其他数量个。
示例二,基于示例一,根据本步骤,得到的可连通空间八叉树包括三层,具体的,第一层节点为索引号为1的立方体,1也是第一层中节点的索引号,第二层节点包括:索引号为11-17的7个立方体分别对应索引号分别为11-17的节点,第三层节点中,每个节点为一个立方体,具体是索引号分别为113-118,121-128,131-138,141-148,161-168,171-178的46个立方体中各个立方体,这46个立方体作为叶子节点,各自保存对各自的对应的所有四面体,也就是说一个立方体对应的所有四面体对应一个节点。
可连通空间八叉树中,存储各个立方体与四面体的索引号,以及索引号与表示立方体的数据的对应关系,索引号与表示四面体的数据的对应关系。
从预设的可连通网格单元集合中,确定目标物的当前位置所处的网格单元的步骤,包括:
按照八叉树遍历方法,从可连通空间八叉树中确定目标物的当前位置所处的四面体。
具体的,根据目标物的当前位置,可以从第二层立方体中查找目标物,确定可能存在目标物的立方体,然后再从确定的立方体在第三层中对应的四面体中查找,确定目标物的当前位置所处的四面体,这种查找方式计算量较小,效率较高。
示例性的,在三维的游戏场景中对虚拟相机的移动进行碰撞测试。
首先,要对游戏场景进行预处理,得到可连通网格单元集合,预处理流程包括如下步骤:
计算覆盖场景内所有障碍物的最小立方体。
根据八叉树算法,对计算的最小立方体进行立方体划分,得到场景立方体集合,划分后得到的立方体满足预设的立方体大小要求。
确定场景中各个障碍物所在的立方体,并进行去重,得到障碍物立方体集合。
利用膨胀算法,对障碍物立方体集合进行膨胀处理。
从场景立方体集合中去除膨胀后的障碍物立方体集合,得到可连通立方体集合。
对可连通立方体集合中的立方体进行四面体划分,得到可连通网格单元集合。
另外,在预处理过程中,还可以按照八叉树的数据结构,根据可连通立方体集合和可连通网格单元集合,生成可连通空间八叉树;其中,可连通空间八叉树的叶子节点为最终切分后获得各个立方体,叶子节点保存组成对应立方体的所有四面体。
然后,基于上述预处理结果进行具体的碰撞测试,具体包括如下步骤。
获取根据上述预处理过程得到的可连通网格单元集合和可连通空间八叉树。
获取目标物的待移动位置。
从获取到的可连通网格单元集合中,根据八叉树遍历方法,确定目标物的当前位置所处的四面体,再确定与当前位置所处的四面体相邻的四面体;其中,可连通网格单元集合包括组成障碍物之间可连通空间的四面体。
判断待移动位置是否在所确定的任一四面体内;如果待移动位置在所确定的任一四面体内即待移动位置在目标物当前位置所处的四面体内,或在与当前位置所处的四面体相邻的任一四面体内,则确定目标物从当前位置移动到待移动位置时,与障碍物不发生碰撞,和/或,将虚拟相机从当前位置移动至待移动位置。
由于可连通网格单元集合中包括的是组成障碍物之间可连通空间的四面体,目标物在四面体内移动,或从一个四面体移动相邻的四面体都不会与障碍物发生碰撞,因此,通过判断待移动位置是否在所确定的任一四面体内,如果待移动位置在所确定的任一四面体内,就可确定出目标物从当前位置移动到待移动位置时,与障碍物不发生碰撞。又由于可连通网格单元集合中,针对任一四面体,与其相邻的四面体最多有四个,也就是说所确定的四面体最多存在五个,针对每个待移动位置,最多进行五次判断即可。相比于现有技术,碰撞测试的计算量较少,且不会因为障碍物的变多或变少有较大的波动,因此,可以提高碰撞测试的计算效率。
在这种情况下移动虚拟相机,虚拟相机不会与障碍物发生碰撞,而且由于碰撞测试的计算效率有所提高,因此,可以使得虚拟相机平稳的移动,则可以减少场景画面的卡顿现象。
示例性的,在二维的游戏场景进行碰撞测试。
首先,要对游戏场景进行预处理,得到可连通网格单元集合,预处理流程包括如下步骤:
计算覆盖场景内所有障碍物的目标正方形,可以为最小正方形。
根据四叉树算法,对计算的目标正方形进行正方形划分,得到场景正方形集合。
确定场景中各个障碍物所在的正方形,并进行去重,得到障碍物正方形集合。
利用膨胀算法,对障碍物正方形集合进行膨胀处理。
从场景正方形集合中去除膨胀后的障碍物正方形集合,得到可连通正方形集合。
对可连通正方形集合中的正方形进行三角形划分,得到可连通网格单元集合。
另外,在预处理过程中,还可以按照四叉树的数据结构,保存可连通网格单元集合,生成可连通空间四叉树;其中,可连通空间四叉树的叶子节点为最终切分后获得各个正方形,叶子节点保存组成对应正方形的所有三角形。
然后,基于上述预处理结果进行具体的碰撞测试,具体包括如下步骤。
获取根据上述预处理过程得到的可连通空间四叉树。
获取目标物的待移动位置。
从可连通空间四叉树中,根据四叉树遍历方法,确定目标物的当前位置所处的网格单元,再确定与当前位置所处的网格单元相邻的网格单元。
判断待移动位置是否在所确定的任一网格单元内;如果待移动位置在所确定的任一网格单元内,则确定目标物从当前位置移动到待移动位置时,与障碍物不发生碰撞,和/或,将虚拟相机从当前位置移动至待移动位置。
由于可连通网格单元集合中包括的是组成障碍物之间可连通空间的三角形,虚拟相机在三角形内移动,或从一个三角形移动相邻的三角形都不会与障碍物发生碰撞,因此,通过判断待移动位置是否在所确定的任一三角形内,如果待移动位置在所确定的任一三角形内即在待移动位置当前所处的三角形内,或在与待移动位置当前所处的三角形相邻的任一三角形内,就可确定出虚拟相机从当前位置移动到待移动位置时,与障碍物不发生碰撞。又由于可连通三角形集合中,针对任一三角形,与其相邻的三角形最多有三个,也就是说所确定的三角形最多存在四个,针对每个待移动位置,最多进行四次判断即可。相比于现有技术,碰撞测试的计算量较少,且不会因为障碍物的变多或变少有较大的波动,因此,可以提高碰撞测试的计算效率。在这种情况下移动虚拟相机,虚拟相机不会与障碍物发生碰撞,而且由于碰撞测试的计算效率有所提高,因此,可以使得虚拟相机平稳的移动,则可以减少场景画面的卡顿现象。
基于与上述方法实施例相同的发明构思,本发明实施例还提供了一种碰撞测试装置。
参照图3,本发明实施例还提供的碰撞测试装置包括如下模块:
第一获取模块31,用于获取目标物的待移动位置,目标物为待移动的物体。
第一确定模块32,用于从预设的可连通网格单元集合中,确定目标物的当前位置所处的网格单元,以及与当前位置所处的网格单元相邻的网格单元;其中,可连通网格单元集合包括组成障碍物之间可连通空间的网格单元;网格单元可以为四面体或三角形。
第二确定模块33,用于如果待移动位置在目标物的当前位置所处的网格单元,以及与当前位置所处的网格单元相邻的网格单元中任一网格单元内,则确定目标物从当前位置移动到待移动位置时,与障碍物不发生碰撞。
由于可连通网格单元集合中包括的是组成障碍物之间可连通空间的网格单元,目标物在网格单元内移动,或从一个网格单元移动相邻的网格单元都不会与障碍物发生碰撞,因此,如果待移动位置在所确定的任一网格单元内,就可确定出目标物从当前位置移动到待移动位置时,与障碍物不发生碰撞。碰撞测试计算量由目标物当前所处的网格单元和与该网格单元相邻的网格单元的数量确定,不需要与每个障碍物都做碰撞测试计算。通过设置预设的可连通网格单元集合,可以减少碰撞测试的计算量,且计算量不会因为障碍物的变多或变少有较大的波动,因此,可以提高碰撞测试的计算效率。
本发明实施例的一种实施方式中,该装置还可以包括:
第三确定模块,用于如果待移动位置不在目标物的当前位置所处的网格单元,以及与当前位置所处的网格单元相邻的网格单元中任一网格单元内,则确定目标物从当前位置移动到待移动位置时,与障碍物发生碰撞。
进一步的,该装置还可以包括:
移动模块,用于在确定目标物从当前位置移动到待移动位置时,与障碍物不发生碰撞的情况下,或在待移动位置在目标物的当前位置所处的网格单元,以及与当前位置所处的网格单元相邻的网格单元中任一网格单元内的情况下,将目标物从当前位置移动到待移动位置。
本发明实施例的一种实施方式中,网格单元为四面体;该装置还可以包括:
第二获取模块,用于获取可连通立方体集合,可连通立方体集合包括组成障碍物之间可连通空间的立方体;
第一处理模块,用于对可连通体立方体集合中的立方体进行四面体划分,得到可连通网格单元集合。
进一步的,参照图4,第二获取模块包括:
获取子模块41,用于获取场景立方体集合,场景立方体集合包括组成目标立方体的立方体,目标立方体覆盖场景内所有障碍物;
第一处理子模块42,用于确定场景中各个障碍物所在的立方体,并进行去重,得到障碍物立方体集合;
膨胀子模块43,用于利用膨胀算法,对障碍物立方体集合进行膨胀处理;
第二处理子模块44,用于从场景立方体集合中去除膨胀后的障碍物立方体集合,得到可连通立方体集合。
进一步的,获取子模块41包括:
计算单元,用于计算覆盖场景内所有障碍物的目标立方体;
处理单元,用于根据预设算法,对计算的目标立方体进行立方体划分,得到场景立方体集合。
进一步的,计算单元包括计算子单元,计算子单元用于计算覆盖场景内所有障碍物的最小立方体,将最小立方体确定为覆盖场景内所有障碍物的目标立方体。
本发明实施例的一种实施方式中,第一确定模块32具体用于:
按照八叉树的数据结构,保存可连通网格单元集合,生成可连通空间八叉树;其中,可连通空间八叉树的叶子节点为最终切分后获得各个立方体,叶子节点保存组成对应立方体的所有四面体;
按照八叉树遍历方法,从可连通空间八叉树中确定目标物的当前位置所处的四面体。
本发明实施例还提供了一种电子设备,如图5所示,包括处理器210和存储器220,其中,
存储器220,用于存放计算机程序;
处理器210,用于执行存储器220上所存放的程序时,实现如下步骤:
获取目标物的待移动位置,目标物为待移动的物体;
从预设的可连通网格单元集合中,确定目标物的当前位置所处的网格单元,以及与当前位置所处的网格单元相邻的网格单元;其中,可连通网格单元集合包括组成障碍物之间可连通空间的网格单元;
如果待移动位置在目标物的当前位置所处的网格单元,以及与当前位置所处的网格单元相邻的网格单元中任一网格单元内,则确定目标物从当前位置移动到待移动位置时,与障碍物不发生碰撞。
关于该方法各个步骤的具体实现以及相关解释内容可以参见上述图1所示的方法实施例,在此不做赘述。
另外,处理器701执行存储器703上所存放的程序而实现的应用设置方法的其他实现方式,与前述方法实施例部分所提及的实现方式相同,这里也不再赘述。
上述电子设备可以具备有实现上述电子设备与其他设备之间通信的通信接口。
上述的处理器210,通信接口,存储器220通过通信总线完成相互间的通信,此处所提到的通信总线可以是外设部件互连标准(Peripheral Component Interconnect,PCI)总线或扩展工业标准结构(Extended Industry Standard Architecture,EISA)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。
存储器220可以包括随机存取存储器(Random Access Memory,RAM),也可以包括非易失性存储器(Non-Volatile Memory,NVM),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
上述的处理器210可以是通用处理器,包括中央处理器(Central ProcessingUnit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(DigitalSignal Processing,DSP)、专用集合成电路(Application Specific IntegratedCircuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
由于可连通网格单元集合中包括的是组成障碍物之间可连通空间的网格单元,目标物在网格单元内移动,或从一个网格单元移动相邻的网格单元都不会与障碍物发生碰撞,因此,如果待移动位置在所确定的任一网格单元内,目标物从当前位置移动到待移动位置时,就不会与障碍物不发生碰撞。针对目标物的每一次移动,目标物当前所处的网格单元和与该网格单元相邻的网格单元的数量决定碰撞测试的计算量,不需要与每个障碍物都做碰撞测试计算。当障碍物的数量较大时,可以减少碰撞测试的计算量,且计算量不会因为障碍物的变多或变少有较大的波动,因此,可以提高碰撞测试的计算效率。
在本发明提供的又一实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述实施例中任一的碰撞测试方法。
由于可连通网格单元集合中包括的是组成障碍物之间可连通空间的网格单元,目标物在网格单元内移动,或从一个网格单元移动相邻的网格单元都不会与障碍物发生碰撞,因此,如果待移动位置在所确定的任一网格单元内,目标物从当前位置移动到待移动位置时,就不会与障碍物不发生碰撞。针对目标物的每一次移动,目标物当前所处的网格单元和与该网格单元相邻的网格单元的数量决定碰撞测试的计算量,不需要与每个障碍物都做碰撞测试计算。当障碍物的数量较大时,可以减少碰撞测试的计算量,且计算量不会因为障碍物的变多或变少有较大的波动,因此,可以提高碰撞测试的计算效率。
在本发明提供的再一实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述任一碰撞测试方法的方法步骤。
由于可连通网格单元集合中包括的是组成障碍物之间可连通空间的网格单元,目标物在网格单元内移动,或从一个网格单元移动相邻的网格单元都不会与障碍物发生碰撞,因此,如果待移动位置在所确定的任一网格单元内,目标物从当前位置移动到待移动位置时,就不会与障碍物不发生碰撞。针对目标物的每一次移动,目标物当前所处的网格单元和与该网格单元相邻的网格单元的数量决定碰撞测试的计算量,不需要与每个障碍物都做碰撞测试计算。当障碍物的数量较大时,可以减少碰撞测试的计算量,且计算量不会因为障碍物的变多或变少有较大的波动,因此,可以提高碰撞测试的计算效率。
在本发明提供的再一实施例中,还提供了一种计算机程序,当其在计算机上运行时,使得计算机执行上述任一碰撞测试方法的方法步骤。
由于可连通网格单元集合中包括的是组成障碍物之间可连通空间的网格单元,目标物在网格单元内移动,或从一个网格单元移动相邻的网格单元都不会与障碍物发生碰撞,因此,如果待移动位置在所确定的任一网格单元内,目标物从当前位置移动到待移动位置时,就不会与障碍物不发生碰撞。针对目标物的每一次移动,目标物当前所处的网格单元和与该网格单元相邻的网格单元的数量决定碰撞测试的计算量,不需要与每个障碍物都做碰撞测试计算。当障碍物的数量较大时,可以减少碰撞测试的计算量,且计算量不会因为障碍物的变多或变少有较大的波动,因此,可以提高碰撞测试的计算效率。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、装置、电子设备、计算机可读存储介质、计算机程序产品以及计算机程序实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。