一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种三维场景中碰撞检测方法及系统与流程

2022-08-21 20:19:24 来源:中国专利 TAG:


1.本发明涉及三维场景应用技术领域,特别地涉及一种三维场景中碰撞检测方法及系统。


背景技术:

2.在三维场景应用中,为了提升仿真效果,通常会在应用中增加物理系统;物理系统能够提供有效的碰撞检测,重力、附加力作用计算,刚体结构等物理功能。但是物理模块本身开发的体量较大,且大量的校验算法会消耗主机性能,因此引入物理系统的代价是相当可观的。同时物理系统需要模型带有物理数据,这也会增加数据制作人员的工作量。而很多应用只是需要简单的碰撞检测功能,因此,整套引入物理系统是不合适的。


技术实现要素:

3.有鉴于此,本发明提出一种三维场景中碰撞检测方法及系统,基于物理系统,实现对玩家模型和相机的碰撞判断,并完成玩家模型和相机发生碰撞后的相关处理,实现了轻量化的物理系统基础的碰撞检测功能。
4.本发明第一方面提供一种三维场景中碰撞检测方法,该三维场景中碰撞检测方法包括:获取三维场景中可进入区域,并设置物理系统内部参数,包括玩家身位、玩家移动速度及相机距离;分别计算玩家模型和相机的目标位置,遍历可进入区域,对玩家模型和相机的目标位置进行碰撞判定。
5.进一步的,所述获取三维场景中可进入区域的步骤包括:获取三维场景中路网路面的主体模型数据;遍历路网路面的主体模型中所有的三角面,将所有朝向上方的三角面收集为一个三角形列表,将所述三角形列表作为可进入区域。
6.进一步的,所述遍历路网路面的主体模型中所有的三角面的步骤包括:利用当前遍历的三角面的三个顶点坐标,确定该三角面的两条边的向量;将三角面的两条边的向量按顺序进行叉乘,得到三角面的法向量n;设定向上向量为u,求取向量u和三角面的法向量n的点积m;判断点积m是否大于0,若点积m大于0,则三角面的法向量n和向量u朝向相同,则判断该三角面朝向上方。
7.进一步的,所述计算玩家模型的目标位置的步骤包括:获取玩家模型当前位置和玩家模型当前朝向;根据玩家模型当前位置、玩家模型当前朝向、设置的玩家移动速度及当前帧与上一帧的时间差,计算玩家模型预计的目标位置。
8.进一步的,所述遍历可进入区域,对玩家模型的目标位置进行碰撞判定的步骤:根据玩家模型预计的目标位置和三维场景中垂直向下的方向向量组成第一射线;遍历可进入区域的三角形列表,并与第一射线进行求交运算,判断可进入区域的三角形列表中是否有三角形与第一射线相交;如果可进入区域的三角形列表中有三角形与第一射线相交,则表明玩家模型预计的目标位置在可进入区域,没有发生碰撞;否则玩家模型即将发生碰撞。
9.进一步的,该三维场景中碰撞检测方法还包括:若玩家模型即将发生碰撞,则重新
计算玩家模型的目标位置;所述重新计算玩家模型的目标位置的步骤包括:将玩家模型预计的目标位置向玩家模型方向逐渐步进,进而获得一个新的目标位置,步进单位为一个设置的玩家模型身位;每步进一次都对玩家模型新的目标位置进行碰撞判定,如果发生碰撞,则继续步进,直至玩家模型没有发生碰撞,并将玩家模型没有发生碰撞对应的目标位置设置为玩家模型最终位置。
10.进一步的,所述计算相机的目标位置的步骤包括:获取计算得到的玩家模型预计的目标位置;获取相机的目标朝向;根据玩家模型预计的目标位置、相机的目标朝向以及设定的相机距离,计算相机预计的目标位置。
11.进一步的,所述遍历可进入区域,对相机的目标位置进行碰撞判定的步骤:根据相机预计的目标位置和三维场景中垂直向下的方向向量组成第二射线;遍历可进入区域的三角形列表,并与第二射线进行求交运算,判断可进入区域的三角形列表中是否有三角形与第二射线相交;如果可进入区域的三角形列表中有三角形与第二射线相交,则说明相机预计的目标位置在可进入区域,没有发生碰撞;否则相机即将发生碰撞。
12.进一步的,该三维场景中碰撞检测方法还包括:获取玩家模型最终位置、相机预计的目标位置及相机的目标朝向;将相机预计的目标位置沿着相机的目标朝向步进,步进单位为一个设置的玩家模型身位;每步进一次都对相机的目标位置进行碰撞判定,如果发生碰撞,则继续步进,否则得到相机新的目标位置;判断相机新的目标位置是否位于玩家模型最终位置和相机预计的目标位置之间;如果相机新的目标位置位于玩家模型最终位置和相机预计的目标位置之间,则将相机新的目标位置作为相机最终位置;否则将相机最终位置设定为玩家模型最终位置。
13.本发明第二方面提供一种三维场景中碰撞检测系统,该三维场景中碰撞检测设置包括:存储器,用于存储计算机程序;处理器,用于执行所述计算机程序时实现如上所述三维场景中碰撞检测方法的步骤。
14.上述的三维场景中碰撞检测方法,通过将玩家模型和相机的目标位置点与可进入区域数据进行求交算法来判断碰撞情况的发生,并完成玩家模型和相机发生碰撞后的相关处理,重新计算玩家模型和相机的最终位置,实现轻量化的物理系统基础的碰撞检测功能。
附图说明
15.为了说明而非限制的目的,现在将根据本发明的优选实施例、特别是参考附图来描述本发明,其中:
16.图1是本发明一实施例提供的三维场景中碰撞检测方法的流程图;
17.图2是本发明一实施例提供的三维场景中碰撞检测系统的示意图。
具体实施方式
18.为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施例对本发明进行详细描述。需要说明的是,在不冲突的情况下,本发明的实施例及实施例中的特征可以相互组合。
19.在下面的描述中阐述了很多具体细节以便于充分理解本发明,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术
人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
20.除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明。
21.图1是本发明一实施例提供的三维场景中碰撞检测方法的流程图。该三维场景中碰撞检测方法通过将玩家模型和相机的目标位置点与可进入区域数据进行求交算法来判断碰撞情况的发生,并完成玩家模型和相机发生碰撞后的相关处理,重新计算玩家模型和相机的最终位置。
22.请参阅图1,该三维场景中碰撞检测方法包括以下步骤:
23.s100,获取三维场景中可进入区域,并设置物理系统内部参数。
24.在本实施例中,获取三维场景中可进入区域,并设置系统内部参数的具体实现方式如下:
25.s101,获取三维场景中可进入区域。
26.获取三维场景中的路网路面的主体模型数据,并判断路网路面的主体模型中所有朝向上方的三角面;然后遍历路网路面的主体模型中所有的三角面,将其收集为一个三角形列表l,将之作为可进入区域。
27.其中,判断路网路面的主体模型中三角面朝向上方的具体实现方式如下:
28.假设当前遍历的三角面所组成的三个顶点按照逆时针顺序分别为p0(x0,y0,z0),p1(x1,y1,z1),p2(x2,y2,z2),可得两条边的向量为:
29.l01=p1-p0=(x1-x0,y1-y0,z1-z0)
30.l02=p2-p0=(x2-x0,y2-y0,z2-z0)
31.将两条边按顺序进行叉乘,得到三角面的法向量normal(nx,ny,nz)。该三角面的法向量normal(nx,ny,nz)为:
32.normal=cross(l01,l02)=(
33.(y1-y0)(z2-z0)-(z1-z0)(y2-y0),
34.(z1-z0)(x2-x0)-(z2-z0)(x1-x0),
35.(x1-x0)(y2-y0)-(y1-y0)(x2-x0)
36.)
37.设定场景中垂直向上的方向向量为u(0,1,0),求取向量u和三角面的法向量normal的点积mark。u和normal的点积mark为:
38.mark=dot(u,normal)=ux*nx uy*ny uz*nz=ny=(z1-z0)(x2-x0)-(z2-z0)(x1-x0)
39.由点积的数学含义,当mark大于0时,normal与u朝向相同,即可判断三角面朝向上。
40.其中,点积的数学含义:dot(a,b)=|a||b|cosα,α表示a和b的夹角。
41.在实施例中,为了优化性能,只计算(z1-z0)(x2-x0)-(z2-z0)(x1-x0)来判断三角面是否朝向上。
42.s102,设定物理系统内部参数。
43.本实施例中,所述设定的系统内部参数包括玩家身位、玩家移动速度及相机距离。
44.其中,玩家身位(body_width):设定玩家的身位宽度为0.4米,该数值会用于发生碰撞时玩家模型做位置调整的步进单位。
45.其中,玩家移动速度(body_speed):设定玩家的移动速度为5米每秒,该数值用于控制玩家模型移动的快慢。
46.其中,相机距离(camera_dis):设定相机距离为3米,该数值表示在没有碰撞时,相机位置与玩家模型的距离。
47.s200,对给定的位置p(x,y,z)和步骤s100获取的可进入区域进行碰撞判定。
48.在本实施例中,对给定的位置p(x,y,z)和步骤s100获取的可进入区域进行碰撞判定的具体实现方式如下:
49.对给定的位置p(x,y,z)和步骤s100计算得到的可进入区域进行碰撞判定,判定方法为:
50.s201,根据给定位置p(x,y,z)和当前三维场景中垂直向下的方向向量dir(0,-1,0)组成射线ray(p,dir)。
51.s202,遍历可进入区域的三角形列表l,与射线ray进行求交运算,判断可进入区域的三角形列表l中是否有三角形(p0,p1,p2)与射线ray相交。
52.本实施例中,判断可进入区域的三角形列表l中有三角形(p0,p1,p2)与射线ray相交的具体实现方法如下:
53.(1)假设一个点同时在射线ray(p,dir)和三角形(p0,p1,p2)上,则满足下面表达式:
54.p t*dir=(1-u-v)*p0 u*p1 v*p2
55.经转换得到:
56.(p1-p0)*u (p2-p0)*v-t*dir=p-p0
57.其中,t、u、v分别为系数。
58.(2)为了将上述转换后的的表达式改写成矩阵形式,设定:
59.e0=p1-p0
60.e2=p2-p0
61.e3=-dir
62.a=(e0,e1,e2)
63.b=p-p0
64.则有:
65.a*x=b
66.即:
[0067][0068]
(3)根据克拉姆法则,得到系数u、v、t的表达式为:
[0069]
u=det(b,e1,e2)/det(a)
[0070]
v=det(e0,b,e2)/det(a)
[0071]
t=det(e0,e1,b)/det(a)
[0072]
(4)优化系数
[0073]
根据混合积在三维向量下表示体积与行列式相同的特性,可以优化参数,得到:
[0074]
det(a)=dot(e0,cross(e1,e2))
[0075]
u=dot(cross(b,e1),e2)/det(a)
[0076]
v=dot(cross(e0,b),e2)/det(a)
[0077]
t=dot(cross(e0,e1),b)/det(a)
[0078]
(5)根据优化参数,判断射线ray(p,dir)与三角形(p0,p1,p2)是否相交。
[0079]
若u》=0,v》=0,u v《=1且t》=0时,则判定射线ray(p,dir)与三角形(p0,p1,p2)相交,否则不相交。
[0080]
本实施例判断射线ray(p,dir)与三角形(p0,p1,p2)是否相交的原理如下:
[0081]
(1)如果一个点在三角形(p0,p1,p2)内,则可以用(1-u-v)*p0 u*p1 v*p2来表示,此时u》=0,v》=0,u v《=1。
[0082]
(2)如果一个点在射线上(p,dir),则可以用p t*dir来表示,t》=0。
[0083]
s203,如果可进入区域的三角形列表l中有三角形(p0,p1,p2)与射线ray相交,则说明给定位置p在可进入区域,没有发生碰撞;否则发生碰撞。
[0084]
s300,基于上述的碰撞判定方法依次对三维场景中玩家位置和相机位置进行碰撞判定。
[0085]
本实例中,基于上述的碰撞判定方法依次对三维场景中玩家位置和相机位置进行碰撞判定包括以下步骤:
[0086]
s301,玩家位置碰撞判定。
[0087]
当玩家模型发生移动时,对玩家模型位置进行碰撞判定的具体实现方法如下:
[0088]
s301-1,获取玩家模型当前位置pos和玩家模型当前朝向dir。
[0089]
s301-2,根据玩家模型当前位置pos、玩家模型当前朝向dir、设置的玩家移动速度body_speed及当前帧与上一帧的时间差delta,计算得到玩家模型预计的目标位置target。
[0090]
本实施例中,玩家模型预计的目标位置target的计算方法如下:
[0091]
target=pos (delta*body_speed)*dir
[0092]
s301-3,根据步骤s200中的碰撞方法,通过玩家模型预计的目标位置target判定玩家模型是否即将发生碰撞。
[0093]
本实施例中,通过玩家模型预计的目标位置target判定玩家模型是否即将发生碰撞的步骤包括:
[0094]
(1)根据玩家模型预计的目标位置target和当前三维场景中垂直向下的方向向量dir(0,-1,0)组成第一射线ray1(t,dir)。
[0095]
(2)遍历可进入区域的三角形列表l,并与第一射线ray1进行求交运算,判断可进入区域的三角形列表l中是否有三角形(p0,p1,p2)与第一射线ray1(t,dir)相交。
[0096]
本实施例中,判断可进入区域的三角形列表l中是否有三角形(p0,p1,p2)与第一射线ray1(t,dir)相交的步骤包括:
[0097]
(2-1)假设一个点同时在射线ray(t,dir1)和三角形(p0,p1,p2)上,则满足下面表达式:
[0098]
t t1*dir1=(1-u1-v1)*p0 u1*p1 v1*p2
[0099]
经转换得到:
[0100]
(p1-p0)*u1 (p2-p0)*v1-t1*dir=t-p0
[0101]
其中,t1、u1、v1分别为系数。
[0102]
(2-2)为了将上述转换后的的表达式改写成矩阵形式,设定:
[0103]
e0=p1-p0
[0104]
e2=p2-p0
[0105]
e3=-dir1
[0106]
a1=(e0,e1,e2)
[0107]
b1=t-p0
[0108]
则有:
[0109]
a1*x1=b1
[0110]
即:
[0111][0112]
(2-3)根据克拉姆法则,得到系数u1、v1、t1的表达式为:
[0113]
u1=det(b1,e1,e2)/det(a1)
[0114]
v1=det(e0,b,e2)/det(a1)
[0115]
t1=det(e0,e1,b1)/det(a1)
[0116]
(2-4)优化系数
[0117]
根据混合积在三维向量下表示体积与行列式相同的特性,可以优化参数,得到:
[0118]
det(a1)=dot(e0,cross(e1,e2))
[0119]
u1=dot(cross(b1,e1),e2)/det(a1)
[0120]
v1=dot(cross(e0,b1),e2)/det(a1)
[0121]
t1=dot(cross(e0,e1),b1)/det(a1)
[0122]
(2-5)根据优化参数,判断第一射线ray1(t,dir1)与三角形(p0,p1,p2)是否相交。
[0123]
若u1》=0,v1》=0,u1 v1《=1且t1》=0时,则判定第一射线ray(t,dir1)与三角形(p0,p1,p2)相交,否则不相交。
[0124]
(3)如果可进入区域的三角形列表l中有三角形(p0,p1,p2)与第一射线ray1(t,dir1)相交,则说明玩家模型预计的目标位置target在可进入区域,没有发生碰撞;否则发生碰撞。
[0125]
本实施例通过将玩家模型的目标位置点与可进入区域数据进行求交算法来判断玩家模型碰撞情况的发生,实现了玩家模型碰撞检测。
[0126]
s302,相机位置碰撞判定
[0127]
本实施例中,所指的相机为玩家身外的相机。对于玩家模型的相机的碰撞判定结果同玩家位置碰撞判定结果,无需单独处理。
[0128]
当玩家发生移动或者旋转时,对相机位置进行碰撞判定的具体实现方式如下:
[0129]
s302-1,获取步骤s301计算得到的玩家模型预计的目标位置target。
[0130]
s302-2,获取相机的目标朝向dir。
[0131]
s302-3,根据玩家的目标位置target、相机的目标朝向dir以及设置的相机距离camera_dis,计算相机预计的目标位置camera_target。
[0132]
本实施例中,相机预计的目标位置camera_target的计算方法如下:
[0133]
camera_target=target-camera_dis*dir
[0134]
s302-4,根据步骤s200中的碰撞方法,通过相机预计的目标位置camera_target判定相机是否即将发生碰撞。
[0135]
本实施例中,通过相机预计的目标位置camera_target判定相机是否即将发生碰撞的具体实现方式如下:
[0136]
(1)根据相机预计的目标位置camera_target和当前三维场景中垂直向下的方向向量dir(0,-1,0)组成第二射线ray2(c,dir2)。
[0137]
(2)遍历可进入区域的三角形列表l,与第二射线ray2进行求交运算,判断可进入区域的三角形列表l中是否有三角形(p0,p1,p2)与第二射线(c,dir2)相交。
[0138]
本实施例中,判断可进入区域的三角形列表l中是否有三角形(p0,p1,p2)与第二射线ray2(c,dir2)相交的步骤包括:
[0139]
(2-1)假设一个点同时在第二射线ray2(c,dir2)和三角形(p0,p1,p2)上,则满足下面表达式:
[0140]
c t2*dir2=(1-u2-v2)*p0 u2*p1 v2*p2
[0141]
经转换得到:
[0142]
(p1-p0)*u2 (p2-p0)*v2-t2*dir2=c-p0
[0143]
其中,t2、u2、v2分别为系数。
[0144]
(2-2)为了将上述转换后的的表达式改写成矩阵形式,设定:
[0145]
e0=p1-p0
[0146]
e2=p2-p0
[0147]
e3=-dir2
[0148]
a2=(e0,e1,e2)
[0149]
b2=c-p0
[0150]
则有:
[0151]
a2*x2=b2
[0152]
即:
[0153][0154]
(2-3)根据克拉姆法则,得到系数u2、v2、t2的表达式为:
[0155]
u2=det(b2,e1,e2)/det(a2)
[0156]
v2=det(e0,b2,e2)/det(a2)
[0157]
t2=det(e0,e1,b2)/det(a2)
[0158]
(2-4)优化系数
[0159]
根据混合积在三维向量下表示体积与行列式相同的特性,可以优化参数,得到:
[0160]
det(a2)=dot(e0,cross(e1,e2))
[0161]
u2=dot(cross(b1,e1),e2)/det(a2)
[0162]
v2=dot(cross(e0,b2),e2)/det(a2)
[0163]
t2=dot(cross(e0,e1),b2)/det(a2)
[0164]
(2-5)根据优化参数,判断第二射线ray2(c,dir2)与三角形(p0,p1,p2)是否相交。
[0165]
若u2》=0,v2》=0,u2 v2《=1且t2》=0时,则判定第二射线ra2y(c,dir2)与三角形(p0,p1,p2)相交,否则不相交。
[0166]
(3)如果可进入区域的三角形列表l中有三角形(p0,p1,p2)与第二射线ray2(c,dir2)相交,则说明相机预计的目标位置camera_target在可进入区域,没有发生碰撞;否则发生碰撞。
[0167]
本实施例通过将相机的目标位置点与可进入区域数据进行求交算法来判断相机碰撞情况的发生,实现了相机碰撞检测。
[0168]
s400,若玩家模型即将发生碰撞,则重新计算玩家模型的目标位置。
[0169]
本实施例中,重新计算玩家模型的目标位置的步骤包括:
[0170]
将步骤s301得到的玩家模型预计的目标位置target向玩家模型方向逐渐步进,进而获得一个新的目标位置temp,步进单位为一个设置的玩家模型身位;每步进一次都进行碰撞判定,如果发生碰撞,则继续步进,否则temp即为玩家模型最终的目标位置。最后,将玩家模型位置设定为temp。
[0171]
本实施例在玩家模型即将发生碰撞时,对玩家模型进行碰撞处理,重新计算玩家模型的目标位置,实现基于物理系统基础的玩家模型碰撞检测。
[0172]
s500,若相机即将发生碰撞,则重新计算相机的目标位置。
[0173]
本实施例中,所指的相机为玩家模型外的相机。对于玩家模型的相机无需额外的碰撞处理,只需等待处理完玩家碰撞后,直接将相机赋值为玩家位置和玩家朝向即可。
[0174]
本实施例中,将相机的碰撞处理放置在玩家碰撞处理之后。
[0175]
本实施例中,若相机即将发生碰撞,重新计算相机的目标位置的具体实现方式如下:
[0176]
获取玩家最终位置pos,步骤s302得到的相机预计的目标位置camera_target,相机的目标朝向dir;
[0177]
将相机预计的目标位置camera_target沿着相机的目标朝向dir步进,步进单位为一个设定的玩家模型身位;每步进一次都进行碰撞判定,如果发生碰撞,则继续步进,否则得到相机的新的目标位置temp。
[0178]
判断相机的新的目标位置temp是否位于玩家模型的最终位置pos和步骤s302得到的相机预计的目标位置camera_target之间;
[0179]
如果相机的新的目标位置temp位于玩家模型的最终位置pos和步骤s302得到的相机预计的目标位置camera_target之间,则相机最终位置设定为temp,否则将相机最终位置设定为玩家模型最终位置pos。
[0180]
本实施例中,判断相机的新的目标位置temp是否位于玩家模型的最终位置pos和步骤s302得到的相机预计的目标位置camera_target之间的方法如下:
[0181]
将相机的新的目标位置temp设置为p,玩家模型的最终位置pos设置为a,相机预计的目标位置camera_target设置为b。
[0182]
获取两个位置向量,分别为pa和pb,其中,pa=a-p;pb=b-p。
[0183]
计算得到两个位置向量的余弦值cosα,其中,cosα的计算方法为:
[0184]
cosα=dot(pa,pb)/(|pa|*|pb|)
[0185]
如果两个位置向量的余弦值cosα等于1,则说明p在ab之间,即相机的新的目标位置temp位于玩家模型的最终位置pos和相机预计的目标位置camera_target中间。否则,p不在ab之间。
[0186]
本实施例在相机即将发生碰撞时,对相机进行碰撞处理,重新计算相机的目标位置,实现基于物理系统基础的相机碰撞检测。
[0187]
上述的三维场景中碰撞检测方法,通过将玩家模型和相机的目标位置点与可进入区域数据进行求交算法来判断碰撞情况的发生,并完成玩家模型和相机发生碰撞后的相关处理,重新计算玩家模型和相机的最终位置,实现轻量化的物理系统基础的碰撞检测功能。
[0188]
上述的三维场景中碰撞检测方法,可以在不增加大量物理数据的前提下,提供完备的碰撞检测和玩家模型、相机碰撞处理的相关功能。
[0189]
上述的三维场景中碰撞检测方法,由于很轻量,同时由于在路网路面主体模型数据通常较为简单,所以不会带来性能上的压力,方便引入各个应用中。
[0190]
相应于上面的方法实施例,参见图2,图2为本发明另一实施例所提供的三维场景中碰撞检测系统的示意图,该设备100可以包括:
[0191]
存储器101,用于存储计算机程序;
[0192]
处理器102,用于执行上述存储器101存储的计算机程序时可实现如下步骤:
[0193]
获取三维场景中可进入区域,并设置系统内部参数;对给定的位置p(x,y,z)和获取的可进入区域进行碰撞判定;基于上述的碰撞判定方法依次对三维场景中玩家位置和相机位置进行碰撞判定;若玩家模型即将发生碰撞,则重新计算玩家模型的目标位置;若相机即将发生碰撞,则重新计算相机的目标位置,实现对玩家模型和相机发生碰撞后的处理。
[0194]
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献