理论教育 VegaPrime虚拟现实开发技术:自定义碰撞检测类的使用

VegaPrime虚拟现实开发技术:自定义碰撞检测类的使用

时间:2023-11-25 理论教育 版权反馈
【摘要】:图9.2.5在主线程中使用自定义碰撞检测类运行程序VPTestDialogOOBBsector,将出现如图9.2.6所示的碰撞包围盒,就克服了Vega Prime 只能有单一线段产生的碰撞检测,利用物体自身的顶点产生了类似于包围盒的碰撞检测。使用自定义的碰撞检测类有两个问题需要注意:第一,被查找顶点的物体在加载时,需要设置 vpObject 加载 setLoaderOption 选项,其中以下两个为必选项:LOADER_OPTION_ PRESERVE_GENERIC_NAMES,LOADER_OPTION_ PRESERVE_GENERIC_NODES。

VegaPrime虚拟现实开发技术:自定义碰撞检测类的使用

自定义碰撞检测类的使用,主要包括两个过程:第一步是获取物体的顶点数据,由自定义的查找物体顶点类FindVertice 来完成;第二步是设置碰撞检测几何体,由自定义的碰撞检测类vpIsectorUserDefine 完成。

使用第6.1.2 节所示的主线程,进行自定碰撞检测类的使用,使房屋和汽车的碰撞检测不使用系统定义的碰撞检测类vpIsectorBump,而是使用自定义的碰撞检测类vpIsectorUserDefine。

在主线程 UINT PublicMember::CTS_RunBasicThread(LPVOID)中,在进行场景配置vpKernel::instance()->configure()之后,首先获取产生碰撞的两个对象房屋farmhouse 和汽车hummer。

接着,定义了查找物体顶点对象find,获取汽车hummer的顶点数目,然后根据实际顶点数目分配了顶点内存空间,利用find 对象找到了汽车hummer的所有顶点值,并存入列表。其关键代码如下:

接着,定义了自定义的碰撞检测对象m_isector,根据find的顶点数目,分配了顶点内存空间。然后把find的顶点值复制到碰撞检测对象m_isector的顶点列表中,设置了碰撞检测对象m_isector的使能属性和渲染使能属性,接着设置了碰撞的目标是房屋farmhous,设置了碰撞的参考位置是汽车hummer。最后把碰撞检测对象m_isector 压入对象列表PublicMember::CTS_s_pInstancesToUnref 中,同时设置为碰撞服务程序pIsectorServiceInline_ myIsectorService的孩子。具体代码如下:

设置完成后,在帧循环过程中检测是否有碰撞产生,有碰撞产生则弹出消息框提示发生了碰撞。代码如下:

完整的主线程代码如图9.2.5所示。

图9.2.5 在主线程中使用自定义碰撞检测类(www.daowen.com)

运行程序VPTestDialogOOBBsector,将出现如图9.2.6所示的碰撞包围盒,就克服了Vega Prime 只能有单一线段产生的碰撞检测,利用物体自身的顶点产生了类似于包围盒的碰撞检测。

为了看得更加清楚,在碰撞检测对象m_isector 从查找对象find 复制顶点数据时,让所有顶点左移4个单位,其代码如下:

图9.2.6 自定义碰撞对象产生的碰撞包围盒

图9.2.7 自定义碰撞对象产生的 碰撞包围盒

这样再运行程序,就会产生如图9.2.7所示的情况,碰撞几何体位于汽车左面,其形状完全依据汽车本身的轮廓。与Vega Prime 自带的碰撞检测类相比,碰撞检测有了很大的提高。

使用自定义的碰撞检测类有两个问题需要注意:

第一,被查找顶点的物体在加载时,需要设置 vpObject 加载 setLoaderOption 选项,其中以下两个为必选项:LOADER_OPTION_ PRESERVE_GENERIC_NAMES,LOADER_OPTION_ PRESERVE_GENERIC_NODES。在LynX Prime 中,加载物体的高级属性里面,勾选上这两个选项即可。

在Vega Prime的代码加载中,需要使用下面两句代码实现:

第二,被查找的对象不能有孩子结点,否则,查找到的顶点是这个物体对象最小的孩子。为了避免这个问题,需要在这个物体对象拥有孩子之前查找顶点。另外,被查找对象必须是某个物体对象的孩子,并且必须是通过物体对象指针成为其他物体的孩子,不能是通过被查找物体上的DOF 成为其他物体的孩子。

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

我要反馈