发明内容
本发明提供了一种虚拟环境中的碰撞处理方法、客户端、服务器及系统,解决了现有技术中网络传输成本增加的技术问题。
本发明解决上述技术问题的技术方案如下:
第一方面,一种虚拟环境中的碰撞处理方法,应用于客户端,包括:
创建虚拟场景,所述虚拟场景包括多个客户端对应的实体模型和非实体模型;
给所述多个客户端中包括的当前客户端对应的当前实体模型添加碰撞盒,所述碰撞盒用于检测碰撞事件;
当检测到所述碰撞事件时,对所述当前实体模型的ID和与所述当前实体模型相碰撞的碰撞模型的ID进行左移位操作,并合并成Uint格式的目标参数发送至服务器;
接收所述服务器反馈的根据所述目标参数计算得到的所述当前实体模型碰撞之后的运动路径;
根据所述运动路径控制所述当前实体模型进行运动,并通过所述服务器将所述运动路径同步到所述多个客户端。
本发明的有益效果是:本技术方案在检测到碰撞事件时,仅向服务端发送当前实体模型和碰撞模型的ID,而不发送模型的详细信息,大大减少了传输数据量。
结合第一方面,在第一方面的第一种可能的实现方式中,在当检测到所述碰撞事件时,对所述当前实体模型的ID和与所述当前实体模型相碰撞的碰撞模型的ID进行左移位操作,并合并成Uint格式的目标参数发送至服务器之前,还包括:
将所述虚拟场景中的所有实体模型和非实体模型的模型信息写成Json文件发送至服务器保存,所述模型信息包括所有实体模型和非实体模型的ID。
第二方面,一种虚拟环境中的碰撞处理方法,应用于服务器,包括:
接收客户端发送的Uint格式的目标参数,对所述目标参数进行右位移操作,获取虚拟场景中所述客户端对应的当前实体模型的ID和与所述当前实体模型相碰撞的碰撞模型的ID;
根据所述当前实体模型的ID和所述碰撞模型的ID分别获取所述当前实体模型的位姿信息和所述碰撞模型的位姿信息;
根据所述当前实体模型的位姿信息和所述碰撞模型的位姿信息计算得到所述当前实体模型碰撞之后的运动路径,并反馈给所述客户端。
结合第二方面,在第二方面的第一种可能的实现方式中,在接收客户端发送的Uint格式的目标参数,对所述目标参数进行右位移操作,获取虚拟场景中所述客户端对应的当前实体模型的ID和与所述当前实体模型相碰撞的碰撞模型的ID之前,还包括:
接收并保存所述客户端发送的Json文件,所述Json文件包括所述虚拟场景中的所有实体模型和非实体模型的模型信息,所述模型信息包括ID。
第三方面,一种客户端,包括:
创建模块,用于创建虚拟场景,所述虚拟场景包括多个客户端对应的实体模型和非实体模型;
添加模块,用于给所述多个客户端中包括的当前客户端对应的当前实体模型添加碰撞盒,所述碰撞盒用于检测碰撞事件;
检测模块,用于当检测到所述碰撞事件时,对所述当前实体模型的ID和与所述当前实体模型相碰撞的碰撞模型的ID进行左移位操作,并合并成Uint格式的目标参数发送至服务器;
接收模块,用于接收所述服务器反馈的根据所述目标参数计算得到的所述当前实体模型碰撞之后的运动路径;
控制模块,用于根据所述运动路径控制所述当前实体模型进行运动,并通过所述服务器同步到所述多个客户端。
结合第三方面,在第三方面的第一种可能的实现方式中,还包括:
发送模块,用于将所述虚拟场景中的所有实体模型和非实体模型的模型信息写成Json文件发送至服务器保存,所述模型信息包括所有实体模型和非实体模型的ID。
第四方面,一种服务器,包括:
第一接收模块,用于接收客户端发送的Uint格式的目标参数,对所述目标参数进行右位移操作,获取虚拟场景中所述客户端对应的当前实体模型的ID和与所述当前实体模型相碰撞的碰撞模型的ID;
获取模块,用于根据所述当前实体模型的ID和所述碰撞模型的ID分别获取所述当前实体模型的位姿信息和所述碰撞模型的位姿信息;
计算模块,用于根据所述当前实体模型的位姿信息和所述碰撞模型的位姿信息计算得到所述当前实体模型碰撞之后的运动路径,并反馈给所述客户端。
结合第四方面,在第四方面的第一种可能的实现方式中,还包括:
第二接收模块,用于接收并保存所述客户端发送的Json文件,所述Json文件包括所述虚拟场景中的所有实体模型和非实体模型的模型信息,所述模型信息包括所有实体模型和非实体模型的ID。
第五方面,一种虚拟环境中的碰撞处理系统,包括:至少一个由第三方面限定的任一种客户端和由第四方面限定的任一种服务器。
具体实施方式
以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
如图1所示,一种虚拟环境中的碰撞处理方法,应用于客户端,包括:
步骤101,创建虚拟场景,虚拟场景包括多个客户端对应的实体模型和非实体模型。
利用Uinty3D软件创建虚拟场景,该虚拟场景中包括各个玩家(客户端)对应的实体模型,以及各种非实体模型。
步骤102,给多个客户端中包括的当前客户端对应的当前实体模型添加碰撞盒,碰撞盒用于检测碰撞事件。
可以给多个客户端对应的多个实体模型添加碰撞盒,也可以给多个客户端中包括的当前客户端对应的当前实体模型添加碰撞盒,如果不需要检测碰撞,则可以不添加碰撞盒或者移除碰撞盒,其中,碰撞盒是Uinty3D的一个组件,类似于在物体周围加了个能检测碰撞的盒子,在游戏中是看不到的。
步骤103,当检测到碰撞事件时,对当前实体模型的ID和与当前实体模型相碰撞的碰撞模型的ID进行左移位操作,并合并成Uint格式的目标参数发送至服务器。
如果当前实体模型与虚拟场景中除了当前实体模型之外的任一模型相碰撞,则生成碰撞事件,碰撞事件包括当前实体模型和与当前实体模型相碰撞的碰撞模型,该碰撞模型可以是玩家对应的实体模型,也可以是非实体模型。如果只是发送ID,大致的拼接方式为:当前ID1+对方ID2+arg(可能附带其他信息或者类型),由于服务器中的ID是不会重复,考虑到极限情况下,即多个ID的时候,Uint的范围为0~2^32-1,总共有32位,我们给ID1和ID2各自分配14位,arg分配4位,然后对ID1,ID2,arg进行左移位操作,合并为一个Uint参数targetUint发送至服务器。
步骤104,接收服务器反馈的根据目标参数计算得到的当前实体模型碰撞之后的运动路径。
步骤105,根据运动路径控制当前实体模型进行运动,并通过服务器将运动路径同步到多个客户端。
在本发明该实施例提供的一种虚拟环境中的碰撞处理方法中,在检测到碰撞事件时,仅向服务端发送当前实体模型和碰撞模型的ID,而不发送模型的详细信息,大大减少了传输数据量。
如图2所示,一种虚拟环境中的碰撞处理方法,应用于客户端,包括:
步骤201,创建虚拟场景,虚拟场景包括多个客户端对应的实体模型和非实体模型。
步骤202,给多个客户端中包括的当前客户端对应的当前实体模型添加碰撞盒,碰撞盒用于检测碰撞事件。
步骤203,将虚拟场景中的所有实体模型和非实体模型的模型信息写成Json文件发送至服务器保存,模型信息包括所有实体模型和非实体模型的ID。
把虚拟场景中加入的非实体模型的模型信息(包括ID)写成资源Json文件,放到服务器(Uinty3d可以将地图资源导出为Json文件,但是可能不太精确,而且碰撞的信息为长方体,在碰撞盒为不规则的时候不够灵活),在客户端检测到碰撞后,可以避免发送position+direction+ID等Json拼接方式,而是发送ID,服务器可以根据ID去Json文件中找出障碍物的详细信息。
步骤204,当检测到碰撞事件时,对当前实体模型的ID和与当前实体模型相碰撞的碰撞模型的ID进行左移位操作,并合并成Uint格式的目标参数发送至服务器。
步骤205,接收服务器反馈的根据目标参数计算得到的当前实体模型碰撞之后的运动路径。
步骤206,根据运动路径控制当前实体模型进行运动,并通过服务器将运动路径同步到多个客户端。
在本发明该实施例提供的一种虚拟环境中的碰撞处理方法中,在客户端向服务器发送Uint格式的目标参数之前,将虚拟场景中的非实体模型的模型信息写成资源Json文件发送至服务器保存,用于服务器根据接收到的目标参数中包括的当前实体模型的ID和碰撞模型的ID分别从资源Json文件中获取到相应的详细信息,便于执行后续运动路径的计算步骤。
如图3所示,一种虚拟环境中的碰撞处理方法,应用于服务器,包括:
步骤301,接收客户端发送的Uint格式的目标参数,对目标参数进行右位移操作,获取虚拟场景中客户端对应的当前实体模型的ID和与当前实体模型相碰撞的碰撞模型的ID。
客户端将targetUint发送到服务器,服务器获取到targetUint,进行向右移位操作,取出三个参数ID1,ID2和arg。
步骤302,根据当前实体模型的ID和碰撞模型的ID分别获取当前实体模型的位姿信息和碰撞模型的位姿信息。
如果实体碰撞的对象为其他的玩家实体,此时服务器是可以根据实体entity的MailBox消息对象获取该实体的所有信息,包括position,direction等。如果实体碰撞的为地图资源,例如障碍物,墙壁,石头等,服务端通过ID从资源Json文件中获取详细信息,之后进行避障或者状态的迁移。
步骤303,根据当前实体模型的位姿信息和碰撞模型的位姿信息计算得到当前实体模型碰撞之后的运动路径,并反馈给客户端。
在本发明该实施例提供的一种虚拟环境中的碰撞处理方法中,通过移位操作的方式,将当前实体模型和碰撞模型的ID以Uint的形式发送给服务器,服务器根据传递的ID,在保存场景信息的Json文件中找到该实体的位姿信息position和direction,然后进行计算,大大的减少了客户端和服务器之间的消息长度,实体的ID最多有14位进行存储,最大2^14,可以满足大多的实体个数要求,如果实体个数会超过该限制,可以考虑使用Uint64进行传递,移位方法类似。
如图4所示,一种虚拟环境中的碰撞处理方法,应用于服务器,包括:
步骤401,接收并保存客户端发送的Json文件,Json文件包括虚拟场景中的所有实体模型和非实体模型的模型信息,模型信息包括所有实体模型和非实体模型的ID。
在客户端和服务器使用TCP进行交互的时候,通过数据包发送出去,解析成字节流进行使用,在进行交互的时候,一般都是使用Json字符串或者Uint的方式进行发送。Json的传输方式特点:占带宽小,格式压缩,便于客户端读取,支持多种语言(C/C++/Java/Python),便于服务端解析等。
步骤402,接收客户端发送的Uint格式的目标参数,对目标参数进行右位移操作,获取虚拟场景中客户端对应的当前实体模型的ID和与当前实体模型相碰撞的碰撞模型的ID。
如果是多次发送长Json字符串,例如position+direction+ID,当碰撞过于频繁,客户端频繁创建Json对象进行拼接,服务器接受到消息后,再频繁的解析Json,由于TCP是保证数据的顺序性和正确性的,当前消息不处理结束是不会处理下一条消息,所以如果解析频繁可能会造成socket缓冲区塞满,最终发生丢弃行为,导致一些不全的包发送到服务器,造成错误。Uint的传输方式特点:占用4个字节,比Json字符串字节长度少很多,适合多个短消息发送,但是发送内容只能是Uint,没有Json方式灵活。为了避免丢包或者是数据包错误,采用Uint的发送方式,最大限度的利用这4个字节。
步骤403,根据当前实体模型的ID和碰撞模型的ID分别获取当前实体模型的位姿信息和碰撞模型的位姿信息。
步骤404,根据当前实体模型的位姿信息和碰撞模型的位姿信息计算得到当前实体模型碰撞之后的运动路径,并反馈给客户端。
在本发明该实施例提供的一种虚拟环境中的碰撞处理方法中,采用的Json传输方式传输虚拟场景中所有模型的详细信息给服务器,占带宽小且便于服务器解析;采用Uint传输方式传输需要进行频繁传输的ID信息给服务器,避免丢包或者是数据包错误。
如图5所示,一种客户端50,包括:
创建模块510,用于创建虚拟场景,虚拟场景包括多个客户端对应的实体模型和非实体模型。
添加模块520,用于给多个客户端中包括的当前客户端对应的当前实体模型添加碰撞盒,碰撞盒用于检测碰撞事件。
检测模块530,用于当检测到碰撞事件时,对当前实体模型的ID和与当前实体模型相碰撞的碰撞模型的ID进行左移位操作,并合并成Uint格式的目标参数发送至服务器。
接收模块540,用于接收服务器反馈的根据目标参数计算得到的当前实体模型碰撞之后的运动路径。
控制模块550,用于根据运动路径控制当前实体模型进行运动,并通过服务器将运动路径同步到多个客户端。
还包括:
发送模块560,用于将虚拟场景中的所有实体模型和非实体模型的模型信息写成Json文件发送至服务器保存,模型信息包括所有实体模型和非实体模型的ID。
如图6所示,一种服务器60,包括:
第一接收模块610,用于接收客户端发送的Uint格式的目标参数,对目标参数进行右位移操作,获取虚拟场景中客户端对应的当前实体模型的ID和与当前实体模型相碰撞的碰撞模型的ID。
获取模块620,用于根据当前实体模型的ID和碰撞模型的ID分别获取当前实体模型的位姿信息和碰撞模型的位姿信息。
计算模块630,用于根据当前实体模型的位姿信息和碰撞模型的位姿信息计算得到当前实体模型碰撞之后的运动路径,并反馈给客户端。
还包括:
第二接收模块640,用于接收并保存客户端发送的Json文件,Json文件包括虚拟场景中的所有实体模型和非实体模型的模型信息,模型信息包括所有实体模型和非实体模型的ID。
如图7所示,一种虚拟环境中的碰撞处理系统70,包括:至少一个客户端50和服务器60。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。