我要发帖 回复

正式会员

1

主题

27

积分

0

专家分

:

私信
发表时间 : 2007-12-6 23:02:22 | 浏览 : 2760    评论 : 12
首先要谢谢论坛中的各位大虾,参看了论坛中很多帖子,觉得收获很大,对我学习起了很大的帮助作用。谢谢

接着切入正题:最近作的项目牵涉到碰撞检测,在Z和TRIPOD检测中都没有遇到什么困难,但是想避免汽车上房时候出现了一些困难。
第一,到底是使用LOS检测还是使用BUMP检测,对两者的机制还是不太清楚;第二,是否需要添加相应代码使汽车停下,还是vega本身就设计好了可以停下?

我在使用Lynx的过程发现,添加Z检测和LOS检测并设置渲染效果之后,小汽车在遇到房屋之后确实产生了碰撞检测(LOS的渲染线由红色变为绿色),但汽车还是上房而过

由此产生了以上的一些疑问。要是添加代码还望高手指教,我让汽车运动使用的是NAV方法,NAV怎样能使汽车STOP?

最近VR访客

henry0henry 评论于2007-12-9 20:06:48
在软件中设置,碰撞矢量,只能得到碰撞的数据,至于如何对碰撞结果进行控制,则需要编程来解决。关于碰撞问题,本论谈有一个合贴,地址忘了。在这转发一下吧!
碰撞检测的具体实现方法[原来的讨论] - 『 Multigen Vega 』 - 虚拟现实中国社区 vrchina 虚拟现实(Virtual Reality) 三维图形 CG GIS 游戏仿真
      输入您的搜索字词  提交搜索表单  
        Web www.52vr.com
   
        
        
      碰撞检测的具体实现方法[原来的讨论]
      以下是很久之前 网友
      obuil,iwantjoin,极光映雪等网友的讨论,对初学者理解vega的碰撞检测特别有用,整理出来让大家pp复制内容到剪贴板代码:
      obuil的,那个程序碰撞检测做的很完美
      但是,我自己的程序中,单个平面的碰撞检测却没办法实现.
      如进行基于视点的这种最简单的碰撞检测的时候,如果把CR中的town.flt导入到Vega中运行Walk这种漫游模式的时候,你会发现它小房子周围的透明围栏是不可穿越的,还有他的树也是不能穿越的[好象是树木这个面的中心轴在进行碰撞检测].
      而我自己做的程序,这个两种情况都会穿越过去,我现在不清楚,这里的"包围盒"是在哪里做???????
      CR中Group节点属性中就提供BoundingVolumes的选项,Vega中也有Volumes的设置.
      那像这种情况,我相交检测的包围盒该在哪里进行设定呢????
      又是如何实现单一面的碰撞检测呢?
      [原创]八一巨献——Isector详解

         
      为了提高仿真应用的真实性,在虚拟环境中某些模型对象应该可以按照真实世界中的物理规律进行运动,看看当今的主流的三维视频游戏,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之间进行相交测试,从而使应用程序能够方便的获取相应的检测结果,碰撞之后怎么办,你说了算!复制内容到剪贴板代码:
      需要说明的是
      初学vega的碰撞检测的人总是会有这样的观点,
      以为在面板中设置对了碰撞检测的参数,碰撞检测就能在程序中发生作用
      或者说,以为找对了正确的vega碰撞检测方法,程序就应该按照方法所描叙的功能执行
      楼上斑竹兄说的对,Vega只能告诉你发生碰撞了,碰撞以后怎么办就由你去解决了
      部分碰撞检测方法不需要附加程序代码 如 z方法 trip方法,(不知道单词对了没有)可以有直接的运行效果
      但是对于我们常常需要的bump方法,此方法设置了六条矢量线段,分别对应六个位置
      设置正确碰撞后 它把碰撞的结果放在了一个一维十二元数组中,这12个数值对应六个方向上的 碰撞检测到的 点位置 、点距离长度
      这就是这种方法告诉你的碰撞检测的结果,至于你需要这结果做什么 ,那就要看你的了
      比如说 ,当知道+y轴方向上 有指定距离的碰撞后,你就可以让你的运动体 停止+y周方向的运动了(在漫游程序中)

      ……………………复制内容到剪贴板代码:
      obuil说的好,最主要的还是在检测完碰撞后的数学模型的定义
      关于Reuslts是应该多说两句:
      进行相交测试计算可以产生多种计算结果,Vega提供了多达12种的结果信息,包括交点处的坐标(Point of
      Intersection)、相交处图元的法向矢量(Normal Vector
      )等等提供给应用程序使用。要知道,相交测试计算是非常耗时的,过度的计算会严重影响帧频率的稳定,所以对于特定的仿真应用而言,我们并不需要全部的结果信息,用户可以通过Results选项进行指定所需的计算结果。
      实际上,每种Isector方法都对应了一个默认的计算结果,即使你不做选择,Vega也会将他们计算出来,所以一般默认即可。完整的结果参数表可以参见帮助文档的说明。Isector
      
      class面版中的分类是一种经验上的名称预设,分别对应的是32个bit位,并没有实际的应用限制,换句话说,你可以使用任意形式上的组合,只要你自己清楚即可。对于特定面的检测,不需要将其单独设为一个模型对象,Vega支持对Part的相交检测,可以使用模型属性编辑器(Object
      Perporty Editor)进行设置,可以参考Vega自带的实例Sample\VgFX\e2cdown中的ADF。复制内容到剪贴板代码:
      [步怀真网友]请问一下,我只对想对场景的部分物体进行碰撞检测,比如碰到墙壁会被挡住,
      而对其他的则忽略掉,如对地面上的一些小障碍物就没有碰撞的效果
      我建模的时候只对我想要检测的部分设了bounding volume,但是现在场景中所有的物体都有了碰撞效果,
      代码里面我把isector的target设成了scene,是不是和这个有关?复制内容到剪贴板代码:
      关于步怀真网友的问题:
      在Creator中设置的BoundingVolume对Vega而言是无效的,Vega并不读入这些信息。有两种方法可以考虑,一是把模型分为不同的Object,二是使用OPE(Object
      Perporty Editor)进行Part Isector Class设置。复制内容到剪贴板代码:
      BUMP方法,由Segments类型定义一个内部体,它由六个线段组成.线段从相交矢量当前的X,Y,Z位置出发,沿着正向和负向体轴向量延伸.线段的长度由Width,Length和Height参数控制.线段位于相交矢量当前X,Y,Z位置的中心.如果一条或一条以上的线段与一个对象物交叉,BUMP
      Isector被看成与一些东西相碰撞了.这个方法的输出为"碰撞是否发生,与数据库是否有交叉点".
      这个方法的输出为"碰撞是否发生,与数据库是否有交叉点".
      这是不是意味着这种相交检测方法的,碰撞检测的响应函数要自己来写呢?[而不像Z方法那样可以不用写响应函数的代码]
      呵呵 十一正好可以动手试试 ,验证Obuil老大的方法是否准确.复制内容到剪贴板代码:
      只有保证Isector的Target Isector Class标示定义跟该Isector实例的测试目标的模型对象Isector类(Object
      Isector Class)标示定义相一致,碰撞检测或相交测设才能正确地进行。"
      这里的具体步骤应该是:
      1先在Object里面的Isector
      Class中设好需要被检测对象的标识[obuil所说的"碰撞检测掩码"如把一栋房子碰撞检测掩码设为Static Object1.
      2在Isector面版中,设置Target Isector
      Class标识,即要被你检测的那个对象,之前我们已经在Object里面设置的这个标识别StaticObject1,现在把它选中即可.
      3.在Isector面版中,设置Method中选种你想使用的相交检测方法,如Z方法或BUMP方法.
      4.在Obsever和Motion Models中加入Isector即可.
      这样就可以实现Town.flt场景中加入一栋房子的碰撞检测了,由于没有写发生相交检测之后对应响应函数的代码,所以视点会进入墙壁后才停止运动,但是相比没有设置Isector方法的差别就是,已经可以不在上房了.
      写的不好大家见谅,至于视点为何穿越墙壁后才停下来的原因是我猜的,哪位有补充或改正的请跟贴哈
        

我也是新手,大家一起努力吧
kevin0442 评论于2007-12-26 15:19:21
这个一定要看
season030441 评论于2008-1-6 22:06:54
好 学习中
cjr1982 评论于2008-1-7 18:21:48
先谢谢楼主,学习了..................呵呵
wolanju 评论于2008-1-8 19:12:37
谢谢了,看了之后有点小明白了,大家继续努力 !!!!
cani 评论于2008-1-9 01:09:59
学习
suyangsan 评论于2008-5-27 13:17:45
学习,谢谢……
ggw0122 评论于2011-4-10 21:14:54
谢谢分享
ggw0122 评论于2011-4-10 21:23:09
谢谢分享
海棠 评论于2011-4-12 10:04:57
谢谢分享
begin 评论于2012-2-23 17:35:41
回去好好看看。谢谢楼主
zy0622专家组 评论于2012-12-23 19:50:58
学习了,正在研究中

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

GMT+8, 2021-4-19 04:36 AM

返回顶部