具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
为了更好的理解本申请提供的实施例,将部分名词解释如下:
Voxel:即体素,由2D空间的像素概念衍化而来,是3D空间中的最小分割单位;它是占有一定体积的颗粒,实际应用过程中,通常会把它在高度方向上进行合并,以正四棱柱的形式来表述;被体素占有的那部分实体空间是不可行走或穿越的,通常把体素的上表面作为可行走区域。
NavMesh:导航网格(Navigation Mesh),是一种用于在复杂空间中导航寻路、标记哪些地方可行走的多边形网格数据结构。
根据本发明实施例的一个方面,提供了一种虚拟场景的处理方法,可选地,作为一种可选的实施方式,上述虚拟场景的处理方法可以但不限于应用于如图1所示的环境中。
在游戏启动之后,服务器106先在虚拟三维地图的目标平面区域中查找具有用于表示三维场景元素的体素的目标平面位置;在查找到目标平面位置的情况下,获取目标平面位置上的体素的体素数据;在内存中存储目标平面位置上的体素的体素数据,其中,在目标平面位置包括多个平面位置、且多个平面位置中的每个平面位置上具有一层或多层体素的情况下,多个平面位置中的至少两个平面位置上的体素所对应的层数不同,达到了在目标平面区域中的目标平面位置包括多个平面位置时,只存储目标平面位置上具有目标体素的体素数据的目的,也就是说,目标平面区域中的多个平面位置上的体素所对应的层数不完全相同,仅存储目标平面位置上的体素的体素数据,进而解决了现有技术中,虚拟场景处理的数据结构复杂,导致的数据存储所占内存较大的技术问题。
可选地,在本实施例中,上述终端设备102可以是配置有目标客户端的终端设备,可以包括但不限于以下至少之一:手机(如Android手机、iOS手机等)、笔记本电脑、平板电脑、掌上电脑、MID(Mobile Internet Devices,移动互联网设备)、PAD、台式电脑、智能电视等。目标客户端可以是视频客户端、即时通信客户端、浏览器客户端、教育客户端等。上述网络104可以包括但不限于:有线网络,无线网络,其中,该有线网络包括:局域网、城域网和广域网,该无线网络包括:蓝牙、WIFI及其他实现无线通信的网络。上述服务器106可以是单一服务器,也可以是由多个服务器组成的服务器集群,或者是云服务器。上述仅是一种示例,本实施例中对此不作任何限定。
可选地,作为一种可选的实施方式,如图2所示,上述虚拟场景的处理方法包括:
步骤S202,在虚拟三维地图的目标平面区域中查找目标平面位置,其中,目标平面位置上具有用于表示三维场景元素的体素。
步骤S204,在查找到目标平面位置的情况下,获取目标平面位置上的体素的体素数据。
步骤S206,在内存中存储目标平面位置上的体素的体素数据,其中,在目标平面位置包括多个平面位置、且多个平面位置中的每个平面位置上具有一层或多层体素的情况下,多个平面位置中的至少两个平面位置上的体素所对应的层数不同。
可选的,在本实施例中,上述虚拟场景的处理方法包括但不限于应用于在游戏启动之后,在服务器侧执行上述虚拟场景中的虚拟场景数据的存储方案。
其中,上述虚拟三维地图可以包括但不限于游戏中的地图,游戏地图中具有很多的虚拟场景,玩家可以控制虚拟对象在虚拟三维地图上完成目标任务。
如图3所示,体素数据存储结构示意图,在图3的左侧图可以看出,多个目标平面位置中的一个目标平面位置上具有多层体素数据,在右侧进行体素数据存储时,在右侧进行体素存储结构可知,存在多个平面位置,即每个单元格是看成是一个平面位置,在多个平面位置中至少两个平面位置上的体素所对应的层数不同,例如,图3右侧图中的左上角的一个单元格和右下角的一个单元格,这两个单元格上的体素所对应的层数不同,可见,单个场景进程内的体素存储方式为化整为零,按需分配,分片存储,进而避免每层体素都全部存储,造成很大的内存空间浪费。
可选的,本实施方案可以包括但不限于游戏3D服务端建模,是对玩家在的游戏场景的抽象表示。如图4所示,虚拟场景中的美术场景示意图,在图4中,玩家看到的是贴图后的效果图,贴图后的效果图即游戏画面,游戏画面中包括虚拟操作对象和游戏的虚拟环境,该虚拟操作对象可以是游戏系统控制也可以是玩家控制。但是游戏服务器端需要抽象成某种数据格式才能存储和表示,比如,导航网格NavMesh表示或体素表示。其中,图5所示,虚拟场景中的地面局部的Navmesh网格示意图,在图5中的地面存在线条示意的网络。图6所示,虚拟场景中某个局部建筑的体素示意图。在图6左侧示意出游戏中部分虚拟场景的体素示意图。
通过本申请提供的实施例,先在虚拟三维地图的目标平面区域中查找具有用于表示三维场景元素的体素的目标平面位置;在查找到目标平面位置的情况下,获取目标平面位置上的体素的体素数据;在内存中存储目标平面位置上的体素的体素数据,其中,在目标平面位置包括多个平面位置、且多个平面位置中的每个平面位置上具有一层或多层体素的情况下,多个平面位置中的至少两个平面位置上的体素所对应的层数不同,达到了在目标平面区域中的目标平面位置包括多个平面位置时,只存储目标平面位置上具有目标体素的体素数据的目的,也就是说,目标平面区域中的多个平面位置上的体素所对应的层数不完全相同,仅存储目标平面位置上的体素的体素数据,进而解决了现有技术中,虚拟场景处理的数据结构复杂,导致的数据存储所占内存较大的技术问题。
其中,通过本实施例提供的方案,体素存储算法大大节省了内存存储空间,节省机器成本。以50张总大小1km*lkm精度为50cm*50cm的地图场景为例,单进程占用内存可由6.5GB减少为1.1G;以每台机器4个场景进程持有100个地图场景为例,单机可节省内存约8GB。
可选的,在本实施例中,获取目标平面位置上的体素的体素数据,可以包括:获取目标平面位置上的各层体素的体素数据;在内存中存储目标平面位置上的体素的体素数据,可以包括:在内存中存储目标平面位置以及目标平面位置上的各层体素的体素数据。
在本实施例中,目标平面位置上可以包括多层体素数据,在内存中存储目标平面位置以及目标平面位置上的各层体素的体素数据,进而在客户端从服务器中内存中请求数据时,不仅可以知晓各层体素的体素数据,还可以知晓各层体素数据对应的目标平面位置,可方便快速加载虚拟三维场景的数据。
可选的,获取目标平面位置上的各层体素的体素数据,可以包括:在目标平面位置包括第一平面位置、且第一平面位置上具有多层体素表示的三维场景元素的情况下,获取第一平面位置上的多层体素的体素数据;在内存中存储目标平面位置以及目标平面位置上的各层体素的体素数据,可以包括:在内存中存储第一平面位置以及第一平面位置上的多层体素的体素数据。
在本实施例中,目标平面位置中可以包括但不限于一层或多层体素,将多层体素数据分层存储。其中,存储的每层体素数据包括该体素所在的平面位置信息,进而可以方便数据的加载。
需要说明的是,获取目标平面位置上的各层体素的体素数据,可以包括:在目标平面位置包括第二平面位置、且第二平面位置上具有单层体素表示的三维场景元素的情况下,获取第二平面位置上的单层体素的体素数据;在内存中存储目标平面位置以及目标平面位置上的各层体素的体素数据,可以包括:在内存中存储第二平面位置以及第二平面位置上的单层体素的体素数据。
在本实施例中,目标平面位置可以包括但不限于包括一层体素,将体素数据和体素所在的平面位置信息同时进行存储,进而在获取体素数据的情况下,可以知晓体素所在的平面位置信息。
可选的,上述方法还可以包括:在查找到目标平面位置的情况下,将目标平面位置的标记设置为第一标记,其中,第一标记用于表示目标平面位置上存在静态体素、以及目标平面位置上存在静态体素的层;在目标平面区域中包括除目标平面位置之外的其他平面位置的情况下,将其他平面位置的标记设置为第二标记,其中,第二标记用于表示其他平面位置上不存在静态体素。
在本实施例中,对目标平面位置进行标记,可以方便对体素数据的下一步处理,例如,在根据体素数据进行虚拟操作对象的碰撞检测,以及确定对AI虚拟操作对象的路径。
其中,在目标平面区域中的目标平面位置标记第一标记,目标平面位置之外的其他平面位置标记为第二标记,其中,第二标记表示其他平面上不存在静态体素,也就是说,目标平面位置上的静态体素标记为第一标记,其余平面位置上不存在静态体素标记为第二标记,可以将静态体素标记。
由于目标平面存在标记数据,因此,可以获取目标平面位置上存在静态体素、以及目标平面位置上存在静态体素的层的标记。
在本实施例中,对同一XY平面位置上的有无体素数据进行缓存,以bit位标记某层有无体素,记作LayerMaskCache,以达到在大量基于体素的碰撞校验时快速获取某一个点的位置上有无体素以及体素高度信息数据的目的。
可选的,上述方法还可以包括:获取目标平面区域中的第一虚拟对象所在的第三平面位置;在第三平面位置的标记表示第三平面位置上存在静态体素、且第三平面位置上存在静态体素的层为目标层的情况下,根据内存中存储的与第三平面位置相关的体素的体素数据,获取目标层上的静态体素的上沿高度和下沿高度;在第一虚拟对象的高度在上沿高度和下沿高度之间的情况下,确定第一虚拟对象出现碰撞。
在本实施例中,根据内存中存储的与第三平面位置相关的体素的体素数据,可以获取目标层上的静态体素的上沿高度和下沿高度,在第一虚拟对象在上沿高度和下沿高度之间的情况下,确定第一虚拟对象出现碰撞。进而可以根据体素数据监测第一虚拟对象是否存在碰撞。
可选的,根据内存中存储的与第三平面位置相关的体素的体素数据,获取目标层上的体素的上沿高度和下沿高度,可以包括:在目标层为起始层的情况下,在内存中存储的第三平面位置上的体素的体素数据中,获取目标层上的静态体素的上沿高度和下沿高度;在目标层不为起始层的情况下,在内存中获取第三平面位置所在的目标分片上的体素的体素数据,在目标分片上的体素的体素数据中获取第三平面位置上的目标层上的静态体素的上沿高度和下沿高度。
其中,起始层可以包括但不限于是第0层,也就是说,在目标层包括多层的情况下,起始层是第0层。
在本实施例中,需要根据目标层的位置信息,获取对应的体素数据,即在目标层是0层的情况下,获取的是目标层上静态体素的上沿高度和下沿高度,在目标层不为0层的情况下,获取的是目标分片上的体素的体素数据,以及根据计算确定目标分片上的体素的体素数据中的目标平面位置上的目标层上的静态体素的上沿高度和下沿高度。进一步的根据上沿高度和下沿高度检测第一虚拟对象的碰撞。
需要说明的是,在第一虚拟对象的高度不在上沿高度和下沿高度之间的情况下,判断第三平面位置上是否存在动态体素;在第三平面位置上存在动态体素的情况下,获取动态体素的上沿高度和下沿高度;在第一虚拟对象的高度在动态体素的上沿高度和下沿高度之间的情况下,确定第一虚拟对象出现碰撞。
在本实施例中,对体素的整体存储结构进行了分片存储,缓存分层体素标记,在节省内存空间的同时也加快了碰撞检测速度。
需要说明的是,在经过本实施例中数据的存储优化设计后,可以根据数据用于碰撞校验过程,如图7所示,目标虚拟操作对象碰撞检测的流程图。
步骤S701,给定(x,y,z)位置;
其中,(x,y,z)位置用于表示移动的人或飞行的人(即游戏3D建模中的虚拟对象),Z表示的是虚拟对象的高度。
步骤S702,计算出(gridX,gridY);
例如,将图3看成是分片数据,计算移动的人或飞行的人所在的分片分割的单元格的位置。其中,gridX,gridY与存储bit位的单位相同。
步骤S703,获取(gridX,gridY)上的缓存层LayerMaskCache;
步骤704,判断LayerMaskCache是否为0,在是的情况下,执行步骤S715,在否的情况下,执行步骤S705;
步骤S705,判断第0层是否有体素,在是的情况下,执行步骤S706,在否的情况下,执行步骤S707;
其中,第0层相当于是起始层,即判断起始层是否有体素。
步骤S706,直接获取第0层体素的上下沿高度(H,L);
在步骤S706中,在第0层存在体素的情况下,获取第0层体素的上沿高度H和下沿高度L。
步骤S707,判断更高层是否有体素,在是的情况下,执行步骤S716,在否的情况下,执行步骤S710;
步骤S708,判断Z是否在(H,L)之间,在是的情况下,执行步骤S709,在否的情况下,执行步骤S710;
步骤S709,此处有碰撞;
步骤S710,判断是否有动态体素,在是的情况下,执行步骤S711,在否的情况下,执行步骤S715;
步骤S711,获取动态体素的分片数据;
步骤S712,计算出分片内容偏移(offesetX,offsetY);
步骤S713,获取动态体素的上下沿高度(H,L);
在步骤S711-S713中,在虚拟对象所在的位置不为起始层的情况下,在内存中获取目标平面位置所在的目标分片上的体素的体素数据,在目标分片上的体素的体素数据中获取目标平面位置上的目标层上的静态体素的上沿高度H和下沿高度L。
步骤S714,判断Z是否在(H,L)之间,在是的情况下,执行步骤S709,在否的情况下,执行步骤S715;
步骤S715,此处无碰撞;
步骤S716,获取第n层体素的分片数据;
步骤S717,计算出分片内容偏移(offesetX,offsetY);
步骤S718,获取第n层体素的上下沿高度(H,L);
步骤S719,判断Z是否在(H,L)之间,在是的情况下,执行步骤S709,在否的情况下,执行步骤S707。
可选的,在本实施例中,上述方法还可以包括:获取虚拟三维地图中为第二虚拟对象设置的起点位置和终点位置;在存在与起点位置相邻的第一体素的情况下,从起点位置开始沿目标方向步进目标距离,得到第一位置,其中,目标方向为起点位置到终点位置的方向;在存在与第一位置相邻的第二体素、且第二体素所在的平面位置与第一体素所在的平面位置之间的高度差小于或等于预定阈值的情况下,将第二体素所在的平面位置设置为目标路径中的位置,其中,目标路径为从起点位置移动到终点位置的路径。
需要说明的是,在存在与起点位置相邻的第一体素的情况下,可以理解为,起始点位置S与体素之间的距离满足预设阈值,例如,起始点与体素之间的距离满足阈值5。上述仅是一种实施方式,具体的不作限定。
也就是说,确定目标路径中的与体素相邻的多个的点,将多个点连续构成AI的路径,该路径将是AI在虚拟游戏中的行走路径。
其中,上述方法还包括:在将第二体素所在的平面位置设置为目标路径中的位置之后,重复执行以下步骤,直到到达终点位置,或者,满足退出条件,其中,上一个位置的初始值为第二体素所在的平面位置,上一个体素的初始值为第二体素:从上一个位置开始沿目标方向步进目标距离,得到当前位置;在存在与当前位置相邻的当前体素、且当前体素所在的平面位置与上一个体素所在的平面位置之间的高度差小于或等于预定阈值的情况下,将当前体素所在的平面位置设置为目标路径中的位置,并将上一个位置更新为当前位置,将上一个体素更新为当前体素;在不存在与当前位置相邻的当前体素,或,当前体素所在的平面位置与上一个体素所在的平面位置之间的高度差大于预定阈值的情况下,确定满足退出条件。
在本实施例中,结合体素和导航网格可以确定AI虚拟操作对象的行走路径。
可选的,在本实施例中,上述方法还可以包括:
S1,在满足退出条件的情况下,在虚拟三维地图中确定出连通起点位置和终点位置的一组网格;
S2,在一组网格中确定连通起点位置和终点位置的一组候选路径点;
S3,在一组候选路径点中确定是否存在第一路径点集合,其中,第一路径点集合中的路径点与对应的体素相邻;
S4,在确定出第一路径点集合的情况下,将第一路径点集合中的路径点相邻的体素所在的平面位置设置为目标路径中的位置,其中,目标路径为从起点位置移动到终点位置的路径。
在游戏内3D场景以体素和导航网格NavMesh来共同表达(静态场景用NavMesh+体素,动态场景(可以变化的场景元素,不一定是移动的)用体素,NavMesh:导航网格),体素主要用于场景设计,技能、移动、飞行、游泳、潜水等基于体素判定,NavMesh用于描述地表细节,怪物AI(虚拟游戏中的系统控制的虚拟操作对象)、寻路、复杂移动相关则使用NavMesh判定。以AI寻路为例,由于大部分的地表都是相对平整的,通常情况下优先利用体素进行碰撞检测可以快速计算出一个在XY平面为直线的简单且有效的路径。当直线路径不可达时,利用NavMesh再利的强大寻路能力进行网格寻路,寻找到Mesh上的路径点后再进行贴地处理,得到最终的路径点。如图8所示,体素和NavMesh相结合的AI寻路算法流程图。
步骤S801,给定起点终点位置S,E;
其中,起点位置S和终点位置E是游戏系统为AI操作对象寻路的起点和终点。
步骤S802,判断起点S是否贴近体素,在是的情况下,执行步骤S803,在否的情况下,执行步骤S811;
步骤S803,沿S,E作射线;
步骤S804,沿射线步进X距离;
在步骤S804中,沿射线按照距离X取点,其中,取点的方式可以通过差值计算出的。
步骤S805,根据X作插值计算出点M;
其中,针对体素的寻路算法,除了简单稳定的直线插值算法外,也可以采用A星算法。
步骤S806,判断点M是否贴近体素,在是的情况下,执行步骤S807,在否的情况下,执行步骤S812;
其中,在通过差值确定的多个点,需要判断每个点是否存在贴近(相邻)的体素。
步骤S807,得到体素点T;
步骤S808,判断点T是的满足行走高度落差,在是的情况下,执行步骤S809,在否的情况下,执行步骤812;
步骤S809,把点T加入到路径中;
步骤S810,判断是否到达终点E,在是的情况下,执行步骤S815,在否的情况下,执行步骤S804;
步骤S811,寻路成功生成路径;
步骤S812,根据S,E定位到NavMesh上的Poly;
步骤S813,判断定位是否成功,在是的情况下,执行步骤S814,在否的情况下,执行步骤S815;
步骤S814,查找起始Poly到目标poly的连通poly路径;
步骤S815,寻路失败;
步骤S816,判断查找是否成功,在是的情况下,执行步骤S817,在否的情况下,执行步骤S815;
步骤S817,根据poly连通路径计算拐点生成路径点;
步骤S818,对路径点进行贴近体素处理;
步骤S819,丢弃不能贴近体素的路径点;
步骤S820,生成最终路径点。
在本实施例中,获取虚拟三维地图中为虚拟对象设置的起点位置S和终点位置E;在存在与起点位置S贴近(相邻)的第一体素的情况下,从起点位置S开始沿目标方向步进目标距离X,得到第一位置,其中,目标方向为起点位置S到终点位置E的方向;在存在与第一位置贴近(相邻)的第二体素、且第二体素所在的平面位置与第一体素所在的平面位置之间的高度差小于或等于预定阈值的情况下,将第二体素所在的平面位置设置为目标路径中的位置,其中,目标路径为从起点位置移动到终点位置的路径。
在本实施例中,对NavMesh和体素应用场景的合理选择,既利用了体素结构规整,算法稳定高效的优点也保留了NavMesh表达复杂地形精确度高的优势,良好支撑了复杂多样的游戏内玩法。图9示,虚拟场景中某次移动寻路路径点的示意图。如图9中的小圆圈构成的线路可以是AI虚拟操作对象的行走路线。
可选的,在本实施例中,上述方法还可以包括:在共享资源管理进程所控制的第一共享内存中存储虚拟三维地图中的地图资源数据,其中,地图资源数据包括虚拟三维地图中的体素的体素数据,地图资源数据设置为允许被多个场景进程访问。
在本实施例中,虚拟三维地图中的地图资源数据可以实现被多个进程使用,避免内存的冗余。
其中,在本实施例中,可以允许读个场景进程访问共享资源管理进程所控制的共享内存中存储虚拟三维地图中的地图资源数据。
其中,在同一个地图场景可能会有很多分线(不同的场景实例),但每个分线的基础数据都是相同的,如果每个场景进程都各自存储一份场景数据,会造成很大的内存冗余。图10所示,进程间地图场景资源数据共享存储示意图,在图10中由一个共享地图资源管理进程来加载和管理数据,其他场景进程不再单独持有地图资源数据(包括静态体素数据,NavMesh网格数据),而是共享地访问由资源管理进程管理的数据。同时,本方案还实现了动态体素和静态体素的分离,动态体素也采用分片的形式按需加载和管理。
可选的,在本实施例中,上述方法还可以包括:在第二共享内存中存储虚拟三维地图中的目标网格数据,其中,目标网格数据用于表示虚拟三维地图中的一组网格的网格形状和网格位置、以及一组网格的相邻关系,一组网格用于表示虚拟三维地图中的场景元素。
在共享内存中可以存在虚拟三维地图中的一组网格的网格形状和网格位置、以及一组网格的相邻关系,丰富了虚拟三维地图中的场景元素的数据存储的信息。
通常的NavMesh的数据是按照tile(拼贴,片)组织,每个tile内的数据都是索引的方式,在数据加载时初始化dtMeshTile数据结构建立指针映射,数据动态分配。在本实施例中,通过对tile内存分配函数进行定制,并重建tile和tile_hash的映射方式,使用共享内存来保存网格数据,除了支持数据在进程间共享,还可支持服务端进程民常宕机时数据不丢失,增加了程序的稳定性,并可加快服务的恢复速度。如图11所示,NavMesh内存改造过程示意图。
在本实施例中,对NavMesh的改造,一方面节省了内存占用,另一方面保证了服务进程异常宕机而数据不丢失,增强了服务器的稳定性。
相对于现有技术中,在内存中存储,进程中的私有数据,本实施例中改进:数据和关系存储在共享内存,该共享内存与进程没有关系,存储中的内容,网格(多边形,tile)的数据(顶点位置,边),网格之间的相邻关系。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
根据本发明实施例的另一个方面,还提供了一种用于实施上述虚拟场景的处理方法的虚拟场景的处理装置。如图12所示,该装置包括:查找单元1201、第一获取单元1203以及第一存储单元1205。
查找单元1201,用于在虚拟三维地图的目标平面区域中查找目标平面位置,其中,目标平面位置上具有用于表示三维场景元素的体素。
第一获取单元1203,用于在查找到目标平面位置的情况下,获取目标平面位置上的体素的体素数据。
第一存储单元1205,用于在内存中存储目标平面位置上的体素的体素数据,其中,在目标平面位置包括多个平面位置、且多个平面位置中的每个平面位置上具有一层或多层体素的情况下,多个平面位置中的至少两个平面位置上的体素所对应的层数不同。
可选的,在本实施例中,第一获取单元1203,可以包括:第一获取模块,用于获取目标平面位置上的各层体素的体素数据;第一存储单元1205,可以包括:第一存储模块,用于在内存中存储目标平面位置以及目标平面位置上的各层体素的体素数据。
其中,上述第一获取模块,可以包括:第一获取子模块,用于在目标平面位置包括第一平面位置、且第一平面位置上具有多层体素表示的三维场景元素的情况下,获取第一平面位置上的多层体素的体素数据;
上述存储模块,可以包括:存储子模块,用于在内存中存储第一平面位置以及第一平面位置上的多层体素的体素数据。
其中,上述第一获取单元1203,可以包括:第二获取模块,用于在目标平面位置包括第二平面位置、且第二平面位置上具有单层体素表示的三维场景元素的情况下,获取第二平面位置上的单层体素的体素数据;第一存储单元1025,可以包括:第二存储模块,用于在内存中存储第二平面位置以及第二平面位置上的单层体素的体素数据。
通过本申请提供的实施例,查找单元1201在虚拟三维地图的目标平面区域中查找目标平面位置,其中,目标平面位置上具有用于表示三维场景元素的体素;第一获取单元1203在查找到目标平面位置的情况下,获取目标平面位置上的体素的体素数据;第一存储单元1205在内存中存储目标平面位置上的体素的体素数据,其中,在目标平面位置包括多个平面位置、且多个平面位置中的每个平面位置上具有一层或多层体素的情况下,多个平面位置中的至少两个平面位置上的体素所对应的层数不同。达到了在目标平面区域中的目标平面位置包括多个平面位置时,只存储目标平面位置上具有目标体素的体素数据的目的,也就是说,目标平面区域中的多个平面位置上的体素所对应的层数不完全相同,进而解决了现有技术中,虚拟场景处理的数据结构复杂,导致的数据存储所占内存较大的技术问题。
可选的,上述装置还可以包括:第一标记单元,用于在查找到目标平面位置的情况下,将目标平面位置的标记设置为第一标记,其中,第一标记用于表示目标平面位置上存在静态体素、以及目标平面位置上存在静态体素的层;第二标记单元,用于在目标平面区域中包括除目标平面位置之外的其他平面位置的情况下,将其他平面位置的标记设置为第二标记,其中,第二标记用于表示其他平面位置上不存在静态体素。
可选的,上述装置还可以包括:第二获取单元,用于获取目标平面区域中的第一虚拟对象所在的第三平面位置;第三获取单元,用于在第三平面位置的标记表示第三平面位置上存在静态体素、且第三平面位置上存在静态体素的层为目标层的情况下,根据内存中存储的与第三平面位置相关的体素的体素数据,获取目标层上的静态体素的上沿高度和下沿高度;第一确定单元,用于在第一虚拟对象的高度在上沿高度和下沿高度之间的情况下,确定第一虚拟对象出现碰撞。
其中,上述第三获取单元,可以包括:第三获取模块,用于在目标层为起始层的情况下,在内存中存储的第三平面位置上的体素的体素数据中,获取目标层上的静态体素的上沿高度和下沿高度;第四获取模块,用于在目标层不为起始层的情况下,在内存中获取第三平面位置所在的目标分片上的体素的体素数据,在目标分片上的体素的体素数据中获取第三平面位置上的目标层上的静态体素的上沿高度和下沿高度。
可选的,上述装置还可以包括:判断单元,用于在第一虚拟对象的高度不在上沿高度和下沿高度之间的情况下,判断第三平面位置上是否存在动态体素;第四获取单元,用于在第三平面位置上存在动态体素的情况下,获取动态体素的上沿高度和下沿高度;第二确定单元,用于在第一虚拟对象的高度在动态体素的上沿高度和下沿高度之间的情况下,确定第一虚拟对象出现碰撞。
可选的,上述装置还可以包括:第五获取单元,用于获取虚拟三维地图中为第二虚拟对象设置的起点位置和终点位置;第一得到单元,用于在存在与起点位置相邻的第一体素的情况下,从起点位置开始沿目标方向步进目标距离,得到第一位置,其中,目标方向为起点位置到终点位置的方向;第一设置单元,用于在存在与第一位置相邻的第二体素、且第二体素所在的平面位置与第一体素所在的平面位置之间的高度差小于或等于预定阈值的情况下,将第二体素所在的平面位置设置为目标路径中的位置,其中,目标路径为从起点位置移动到终点位置的路径。
可选的,上述装置还可以包括:重复单元,用于在将第二体素所在的平面位置设置为目标路径中的位置之后,重复执行以下步骤,直到到达终点位置,或者,满足退出条件,其中,上一个位置的初始值为第二体素所在的平面位置,上一个体素的初始值为第二体素:第二得到单元,用于从上一个位置开始沿目标方向步进目标距离,得到当前位置;第二设置单元,用于在存在与当前位置相邻的当前体素、且当前体素所在的平面位置与上一个体素所在的平面位置之间的高度差小于或等于预定阈值的情况下,将当前体素所在的平面位置设置为目标路径中的位置,并将上一个位置更新为当前位置,将上一个体素更新为当前体素;第三确定单元,用于在不存在与当前位置相邻的当前体素,或,当前体素所在的平面位置与上一个体素所在的平面位置之间的高度差大于预定阈值的情况下,确定满足退出条件。
可选的,上述装置还可以包括:第四确定单元,用于在满足退出条件的情况下,在虚拟三维地图中确定出连通起点位置和终点位置的一组网格;第五确定单元,用于在一组网格中确定连通起点位置和终点位置的一组候选路径点;第六确定单元,用于在一组候选路径点中确定是否存在第一路径点集合,其中,第一路径点集合中的路径点与对应的体素相邻;第三设置单元,用于在确定出第一路径点集合的情况下,将第一路径点集合中的路径点相邻的体素所在的平面位置设置为目标路径中的位置,其中,目标路径为从起点位置移动到终点位置的路径。
可选的,上述装置还可以包括:第二存储单元,用于在共享资源管理进程所控制的第一共享内存中存储虚拟三维地图中的地图资源数据,其中,地图资源数据包括虚拟三维地图中的体素的体素数据,地图资源数据设置为允许被多个场景进程访问。
可选的,上述装置还可以包括:第三存储单元,用于在第二共享内存中存储虚拟三维地图中的目标网格数据,其中,目标网格数据用于表示虚拟三维地图中的一组网格的网格形状和网格位置、以及一组网格的相邻关系,一组网格用于表示虚拟三维地图中的场景元素。
根据本发明实施例的又一个方面,还提供了一种用于实施上述虚拟场景的处理方法的电子设备,该电子设备可以是图1所示的终端设备或服务器。本实施例以该电子设备为服务器为例来说明。如图13所示,该电子设备包括存储器1302和处理器1304,该存储器1302中存储有计算机程序,该处理器1304被设置为通过计算机程序执行上述任一项方法实施例中的步骤。
可选地,在本实施例中,上述电子设备可以位于计算机网络的多个网络设备中的至少一个网络设备。
可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:
S1,在虚拟三维地图的目标平面区域中查找目标平面位置,其中,目标平面位置上具有用于表示三维场景元素的体素;
S2,在查找到目标平面位置的情况下,获取目标平面位置上的体素的体素数据;
S3,在内存中存储目标平面位置上的体素的体素数据,其中,在目标平面位置包括多个平面位置、且多个平面位置中的每个平面位置上具有一层或多层体素的情况下,多个平面位置中的至少两个平面位置上的体素所对应的层数不同。
可选地,本领域普通技术人员可以理解,图13所示的结构仅为示意,电子装置电子设备也可以是智能手机(如Android手机、iOS手机等)、平板电脑、掌上电脑以及移动互联网设备(Mobile Internet Devices,MID)、PAD等终端设备。图13其并不对上述电子装置电子设备的结构造成限定。例如,电子装置电子设备还可包括比图13中所示更多或者更少的组件(如网络接口等),或者具有与图13所示不同的配置。
其中,存储器1302可用于存储软件程序以及模块,如本发明实施例中的虚拟场景的处理方法和装置对应的程序指令/模块,处理器1304通过运行存储在存储器1302内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的虚拟场景的处理方法。存储器1302可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器1302可进一步包括相对于处理器1304远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。其中,存储器1302具体可以但不限于用于存储目标平面区域、目标平面位置以及体素数据等信息。作为一种示例,如图13所示,上述存储器1302中可以但不限于包括上述虚拟场景的处理装置中的查找单元1201、第一获取单元1203及第一存储单元1205。此外,还可以包括但不限于上述虚拟场景的处理装置中的其他模块单元,本示例中不再赘述。
可选地,上述的传输装置1306用于经由一个网络接收或者发送数据。上述的网络具体实例可包括有线网络及无线网络。在一个实例中,传输装置1306包括一个网络适配器(Network Interface Controller,NIC),其可通过网线与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,传输装置1306为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。
在其他实施例中,上述终端设备或者服务器可以是一个分布式系统中的一个节点,其中,该分布式系统可以为区块链系统,该区块链系统可以是由该多个节点通过网络通信的形式连接形成的分布式系统。其中,节点之间可以组成点对点(P2P,Peer To Peer)网络,任意形式的计算设备,比如服务器、终端等电子设备都可以通过加入该点对点网络而成为该区块链系统中的一个节点。
根据本申请的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述虚拟场景处理方面或者虚拟场景处理方面的各种可选实现方式中提供的虚拟场景处理方法。其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
可选地,在本实施例中,上述计算机可读的存储介质可以被设置为存储用于执行以下步骤的计算机程序:
S1,在虚拟三维地图的目标平面区域中查找目标平面位置,其中,目标平面位置上具有用于表示三维场景元素的体素;
S2,在查找到目标平面位置的情况下,获取目标平面位置上的体素的体素数据;
S3,在内存中存储目标平面位置上的体素的体素数据,其中,在目标平面位置包括多个平面位置、且多个平面位置中的每个平面位置上具有一层或多层体素的情况下,多个平面位置中的至少两个平面位置上的体素所对应的层数不同。
可选地,在本实施例中,本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(Read-Only Memory,ROM)、随机存取器(Random Access Memory,RAM)、磁盘或光盘等。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。