理论教育 VegaPrime虚拟现实开发:碰撞检测技术

VegaPrime虚拟现实开发:碰撞检测技术

时间:2023-11-25 理论教育 版权反馈
【摘要】:Vega Prime 中的碰撞检测是基于线段的,基类vpIsector 就负责维护和管理碰撞检测线段,同时也提供了一整套数据结构和方法来查询碰撞检测结果。在Vega Prime 帧循环过程中,应用程序将定位碰撞、触发碰撞遍历、查询碰撞检测结果。Vega Prime 提供了几个基本的碰撞检测类:VpIsectorHAT,Height Above Terrain ,它只维护一条线段,这条线段是物体与地面的垂直距离。VpIsectorLOS,Line-Of-Sight 基于单线段的碰撞检测,这条线段沿着Y轴正向。VpIsectorTripod,三角形碰撞检测,主要用于有方向和凹凸不平的地形。

VegaPrime虚拟现实开发:碰撞检测技术

在很多可视化仿真程序中,碰撞检测是一种基本的要求。例如,飞行仿真中,飞行高度就是地面与飞机之间的垂直距离。Vega Prime 中的碰撞检测是基于线段的,基类vpIsector 就负责维护和管理碰撞检测线段,同时也提供了一整套数据结构和方法来查询碰撞检测结果。为了找到哪一条线段产生了碰撞,场景图形不得不按照节点依次遍历查找,负责这个遍历功能的是vsTraversalIsect 类,而不同的节点要求不同的碰撞检测程序。vpIsector 类提供了一种更高层次的API 来配置碰撞检测和查询碰撞结果,但它是一个抽象类,只提供了是否开启碰撞检测、设置碰撞检测目标、设置碰撞检测位置和查询碰撞检测结果,它不提供配置检测线段。这样,就为开发者提供了开发自己的碰撞检测类的接口

在Vega Prime 帧循环过程中,应用程序将定位碰撞、触发碰撞遍历、查询碰撞检测结果。但是,在大型图形场景中,碰撞遍历可能会花费大量的时间,这有可能会影响系统性能。这样,一般不采用手动遍历的方法,而是采用碰撞检测服务类vpIsectorService的方法,让它负责更新碰撞检测。碰撞检测服务类被精心设计,它维护一个碰撞检测列表,这样可以实现优化遍历碰撞检测列表。

Vega Prime 提供了几个基本的碰撞检测类:

(1)VpIsectorHAT,Height Above Terrain (HAT),它只维护一条线段,这条线段是物体与地面的垂直距离。

Segment 0:(x,y,z+zMax)to (x,y,z+zMin)可以通过getHAT()来获取碰撞时的碰撞点、倾斜度和扭曲度。

(2)VpIsectorLOS,Line-Of-Sight (LOS)基于单线段的碰撞检测,这条线段沿着Y轴正向。

Segment 0:(0,minRange,0)to (0,maxRange,0)可以通过getRange()查询碰撞距离。

(3)VpIsectorTripod,三角形碰撞检测,主要用于有方向和凹凸不平的地形。

设置三条线段:

Segment 0:(-width/2.0,-length/2.0,zMax)to (-width/2.0,-length/2.0,zMin)

Segment 1:(+width/2.0,-length/2.0,zMax)to (+width/2.0,-length/2.0,zMin)

Segment 2:(0.0,+length/2.0,zMax)to (0.0,+length/2.0,zMin)

可以通过getTripodZPR()来获取碰撞检测的相关信息。

(4)VpIsectorBump,采用6 条线段作为碰撞检测线段,分别沿XYZ的正负方向。

Segment 0:(0,0,0)to (-width,0,0)(www.daowen.com)

Segment 1:(0,0,0)to (+width,0,0)

Segment 2:(0,0,0)to (0,-length,0)

Segment 3:(0,0,0)to (0,+length,0)

Segment 4:(0,0,0)to (0,0,-height)

Segment 5:(0,0,0)to (0,0,+height)

可以通过getBump()方法查询6 条线段的长度

(5)VpIsectorZ,用一条碰撞检测线段,计算碰撞点在Z轴上的值。

Segment 0:(x,y,z+zMax)to (x,y,z+zMin)可以通过getZ()方法获取碰撞点及其倾斜度和扭曲度。

(6)VpIsectorZPR,基于单线段的碰撞检测。

Segment 0:(x,y,z+zMax)to (x,y,z+zMin)可以通过getZPR()方法来获取碰撞检测的相关信息。

(7)VpIsectorXYZPR,基于单线段的碰撞检测。

Segment 0:(x,y,z+zMax)to (x,y,z+zMin)可以通过getXYZPR()方法来获取碰撞检测的相关信息。

从这些已有的碰撞检测来看,都是基于简单的几条线段,很多时候无法满足实际需要。通过仔细分析碰撞检测的基类vpIsector 得知,只要能获取足够多的顶点,由这些顶点连接成线段就可以组成类似的包围盒碰撞检测。整体思路非常简单:第一步就是获取物体表面的顶点;第二步继承碰撞基类vpIsector,把顶点依次相连,第一个顶点连接第二个顶点,第二个顶点连接第三个顶点,依次往下,如果有N个顶点,就会有N-1 条线段,这样基本可以把物体覆盖完整,形成自己的包围盒碰撞检测。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈