我要发帖 回复

中级会员

31

主题

185

积分

0

专家分

:

私信
发表时间 : 2006-9-12 08:24:18 | 浏览 : 3392    评论 : 16
今天谈谈Vega中的碰撞检测

    为了提高仿真应用的真实性,在虚拟环境中某些模型对象应该可以按照真实世界中的物理规律进行运动,看看当今的主流的三维视频游戏,DOOM系列啦,半条命啦,Call of Duty系列啦等等,其中令人咂舌的碰撞检测效果给众多玩家都留下的极其深刻的印象,虚拟世界越来越真实了……

    当然了,这些游戏都使用了专业的物理引擎来完成这些工作,而作为专业的视觉引擎Vega,也提供了相应的工具,来帮助用户完成一些简单碰撞检测和相交测试,这就是Vega基本模块中的Isector和Volume。需要指出的是,Vega提供的这些功能跟物理引擎相比还有很大的不同:物理引擎不仅仅进行碰撞检测,它还负责碰撞后要发生的一切后果,而Vega只能告诉你发生碰撞了,碰撞以后怎么办就完全交给你了。

       Vega通过Isector和Volume提供了这样一种机制:可以在Isector对应的检测目标与其设定的检测方法所对应的Volume之间进行相交测试,从而使应用程序能够方便的获取相应的检测结果。前半句有点拗口,下面会有详细的解释,别担心,看完了,再回过头来读这句话就有感觉了:)

    当我们创建一个Isector实例,我们需要为其指定众多参数,这个工作可以在Lynx面板中方便的完成,Target比较好理解就是检测目标了,关键是下面的这个Method,用于指定相加检测的方法,Vega提供了八种不同的Method,注意,每种Method都对应了相应的Volume,实际上Vega是用Volume在跟检测对象进行相交测试。Vega提供了多种类型的Volume,包括Box、Sphere、Cylinder、Frustum以及点、线、面和线段即Segment,除了Volume方法外,Isector绝大多数的Method所对应的Volume类型都是Segment。

    注意,Isector的每种Method所对应的Volume都是内置的,不能更改其类型的,当然Isector的Volume方法出外。比如,Z方法对应的Volume就是一条垂直的过当前Isector位置的Segment,线段的长度由Minimum和Maximum两个参数确定;TRIPOD方法的Volume由三条Segment 组成,分别是过(x-Width/2, y-Length/2)、(x+Width/2, y+Length/2)、(x, y+Length/2)的三条竖直线段,x和y是代表但前Isector位置的x和y坐标。再比如,LOS方法对应的Volume,是一条以当前Isector位置为起点,沿Y体轴线即视线方向,长度为Range的Segment。那么当前Isector位置只的是什么呢?就是该Isector所绑定的那个对象的位置,也就是当我们把它赋给了Observer,那么当前的视点位置就是该Isector的当前位置。

    由于目前Vega只能支持Volume与Scene或Volume与Object之间的相交测试,还不能进行两个Volume之间的相交测试,所以Isector的相交测试目标(Target)类型只有场景或者模型对象两种。为了能够准确地从整个场景中区分出不同类型的目标,Vege使用了一个32位的Isector掩码,即Isector Class,分为了地形(Terrain)、静态对象(Static Object)、动态对象(Dynamic Object)和特殊对象(Special Object)四个大组。现在再回忆一下,Object面板中的Isector Class,恍然大悟了吧:)

    特别指出,只有保证Isector的Target Isector Class标示定义跟该Isector实例的测试目标的模型对象Isector类(Object Isector Class)标示定义相一致,碰撞检测或相交测设才能正确地进行。比如,可以把地形上代表平地部分的模型对象用Terrain 1-4标示,地形上表示山地部分的模型对象用Terrain 5-8标示;假如应用程序相交测试所关心的目标对象只是场景地形中的平地部分,就可以把该Isector的Target Isector Class标识为Terrain 1-4,以此类推……

    现在的问题是我们如何利用Isector的强大功能来达到我们所预期的目的,首先需要将Isector与场景中的Player、Observer或者Motion Model等绑定,绑定后Isector实例就可以随着绑定对象在场景中定位、运动并实时地进行各种类型的相交测试计算,然后通过编写相应的应用程序代码使角色对象、观察者或者运动模式等能够实时的根据相交测试中产生的各种信息数据(我们可以通过设定Isector的Results来确定需要计算的信息种类)做出响应并在场景中作相应的状态调整,从而模拟出各种复杂的交互效果。

    但这并不是说要使用Isector一定要编写代码才能实现碰撞检测的效果,某些运动模式(如Drive模式、Fly模式)跟使用特定方法的Isector绑定后就可以直接根据相交测试的结果实时的调整运动状态,而不需要编写额外的程序代码。用的最多的如Drive运动模式根Tripod方法的Isector绑定,该方法类似一个三角架,运动会始终在保持在由该三角架平台决定的方向上,保持与检测目标相距Z Offset距离。


    还是那句话:Vega可以在Isector对应的Target与其设定的Method所对应的Volume之间进行相交测试,从而使应用程序能够方便的获取相应的检测结果,碰撞之后怎么办,你说了算!

最近VR访客查看更多↓

vrer 评论于2006-9-12 16:13:06
写的不错,支持
lianghui 评论于2006-12-20 23:08:06
好文章
戏子无名 评论于2006-12-22 15:38:12
请问在代码里面,怎么截获Isector的碰撞事件?

我应该把碰撞之后的代码写到哪里?
xulide 评论于2007-10-18 21:21:35
我也想知道
xiaoming630 评论于2007-11-1 21:44:08
好文章
静水深流 评论于2007-11-4 10:17:05
写的不错呀,支持
season030441 评论于2008-1-6 22:39:02
好文章
cjr1982 评论于2008-1-7 18:16:45

写的不错,支持

写的不错,支持
但是,应该把碰撞之后的代码写到哪里?
zeroty 评论于2009-12-3 18:14:34
Vega里面的Volume的Box怎么使用?
ggw0122 评论于2011-4-18 21:22:28
学习了,谢谢
ggw0122 评论于2011-4-18 21:23:38
学习了,谢谢
ggw0122 评论于2011-4-18 21:26:10
学习了,谢谢
ggw0122 评论于2011-4-18 21:27:04
学习了,谢谢
hjw520cn 评论于2011-6-21 19:55:52
好文章,就要顶
冰中火 评论于2011-10-15 18:11:56
不错,谢谢分享
chsunnyboy 评论于2014-5-30 15:31:38
楼主很给力啊,继续呀

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-3-7 08:29 PM

返回顶部