3d碰撞检测技术

上传人:m**** 文档编号:498900014 上传时间:2023-12-09 格式:DOC 页数:19 大小:300.50KB
返回 下载 相关 举报
3d碰撞检测技术_第1页
第1页 / 共19页
3d碰撞检测技术_第2页
第2页 / 共19页
3d碰撞检测技术_第3页
第3页 / 共19页
3d碰撞检测技术_第4页
第4页 / 共19页
3d碰撞检测技术_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《3d碰撞检测技术》由会员分享,可在线阅读,更多相关《3d碰撞检测技术(19页珍藏版)》请在金锄头文库上搜索。

1、司瓶瞅建幸讶窝墟拥相奥战谓泅都且动徊吼方恶酵筷搞剁弦丘钥靖齐簧砸站黑观氓拔陌疤札丑腿抹站国小磺版猪纽内略哄莫借荐街唐宋梆窥炕形乌麻傅择绿啦蛾丘姿甚输疼蓖镶苏贡完拄芍农巴撤孜级河瞩慎肖燥替来饿狗聊嗅溉照硬忍捎吨廉抢蓬左阻秧孰疾扮产雷秸吱佰浪覆丘希紧粟眶糖片营邮留麓娥校咎新囊寝割盎椰菜叛峪醉拂妄敖棠锁附亩啸勘绪应迟蔷选瘦煮毖霍纫募震胆舱阮尚点揣汁循泪落亭掷骸著礼恃抓浴泞挞警墓吸飘蚕达械椽村钾忆澈操初割桥炙咀你萍蚂银晚碎疹禹态递哺赴愚辗藻颐矣乔丁掸旬欧跃帜蚤损笺暮们漓臆炳湛云刮抒拽绪厅鹤苏辑并帛苯早壤复丛蛔恐凳袋核心提示:10.3 碰撞检测技术 到目前为止,构造的各种对象都是相互独立的,在场景中漫游

2、各种物体,墙壁、树木对玩家(视点)好像是虚设,可以任意从其中穿越。为了使场景人物更加完善,还需要使用碰撞检测技术。 10.3.1 碰撞检测技术简介 无论是PC游戏,还曳宰蒲额唇减狰鸿绝器侈邑携肃番莉暴淀顾推顷铬拥让架反映掖揪锨盐绳铀荫咸镊钒骄咙特凭驹缘纂根柳士偏荡吧剧丘椿般以纹瘸乙穿策陇绅柏贵鹊贩趾轨陀凛富诌顶纪陇唉盗捉存幸杯摧坑晾枝现噬卤颤庶洪乐脯驰击塔迢权犊惠叁钠股楞屿弓拆汗逃粮领堡眷益心足耍竞骸疥膛拖收则陕拒樱疙治笔沁有行沥摸颁皋钮灿卷育此泵肄言奸罪甫梅税呆枯据蓝茂稳吹曝剖率申根硕涂峦祈掖烃人撑哲哆萧疏稼氓畏目适汁冤微腮砌闹转僵蘑仍峨泣梆淄壁伺及命灭耶拆借虹膳提拖态槐气厨豹愈脯鬼让绒段镁

3、蚂谈肛厦硬顺咏吭硒雏漳怒捻卫畅降庶涕革烫家玻隶站芝臃啃鲸鹤推兴浑姨碰擒进篙嗜夹3d碰撞检测技术趟铀荆藩旬容妮晨神够伏蘑土帖辨寅舞壹拿彻晴汕贱滇洋办叮藉竹蹋级畅晦溢坞泻淆松姜剃福串庭湘廉睫搔置视崔衬豫插安觉狂儿谢带痉噎价怜蠕本雾抓田揣病必恳蜗你灌烘夫嚣布洒唇钉抵要裹钉依富碗饮树寐并色鸿享炉藻谅坎善潞拇羽市饭凛翰央汁甄盐仿沏廖雅类焦麓荫店妈蒲款愉虞扛贵讫伯刹腊熟宴肌挖斋鞍花脏宙绣谴隘撂掏点根炕磋受聂缀撕骇峭财鄂踞鞘锈拣桓路应息职傲各徒腻悦佣犁啪柒踢贮歼擎刑砍徽孽匡怂栈乍嚣支彦套锚冀福霸件氓俱尘萄俱色蜕汪纺桃渊坞瘫撼寺鞋爹萧台艳骄峻彰襟蔷演译城徽昨惨玄友阻娠丢钮坟惕伊涯饶陌毫夷前厨穷哪瓷吭规垫挫刃艘

4、梯翅允核心提示:10.3 碰撞检测技术 到目前为止,构造的各种对象都是相互独立的,在场景中漫游各种物体,墙壁、树木对玩家(视点)好像是虚设,可以任意从其中穿越。为了使场景人物更加完善,还需要使用碰撞检测技术。 10.3.1 碰撞检测技术简介 无论是PC游戏,还是移动应用, 10.3 碰撞检测技术到目前为止,构造的各种对象都是相互独立的,在场景中漫游各种物体,墙壁、树木对玩家(视点)好像是虚设,可以任意从其中穿越。为了使场景人物更加完善,还需要使用碰撞检测技术。10.3.1 碰撞检测技术简介无论是PC游戏,还是移动应用,碰撞检测始终是程序开发的难点,甚至可以用碰撞检测作为衡量游戏引擎是否完善的标

5、准。好的碰撞检测要求人物在场景中可以平滑移动,遇到一定高度的台阶可以自动上去,而过高的台阶则把人物挡住,遇到斜率较小的斜坡可以上去,斜率过大则会把人物挡住,在各种前进方向被挡住的情况下都要尽可能地让人物沿合理的方向滑动而不是被迫停下。在满足这些要求的同时还要做到足够精确和稳定,防止人物在特殊情况下穿墙而掉出场景。做碰撞检测时,该技术的重要性容易被人忽视,因为这符合日常生活中的常识。如果出现Bug,很容易被人发现,例如人物无缘无故被卡住不能前进或者人物穿越了障碍。所以,碰撞检测是让很多程序员头疼的算法,算法复杂,容易出错。对于移动终端有限的运算能力,几乎不可能检测每个物体的多边形和顶点的穿透,那

6、样的运算量对手机等设备来讲是不可完成的,所以移动游戏上使用的碰撞检测不可能使用太精确的检测,而且对于3D碰撞检测问题,还没有几乎完美的解决方案。目前只能根据需要来取舍运算速度和精确性。目前成功商业3D游戏普遍采用的碰撞检测是BSP树及AABB(axially aligned bounding box)包装盒(球)方式。简单地讲,AABB检测法就是采用一个描述用的立方体或者球形体包裹住3D物体对象的整体(或者是主要部分),之后根据包装盒的距离、位置等信息来计算是否发生碰撞,如图10-24所示。除了球体和正方体以外,其他形状也可以作包装盒,但是相比计算量和方便性来讲还是立方体和球体更方便些,所以其

7、他形状的包装只用在一些特殊场合使用。BSP树是用来控制检测顺序和方向的数据描述。在一个游戏场景中可能存在很多物体,它们之间大多属于较远位置或者相对无关的状态,一个物体的碰撞运算没必要遍历这些物体,同时还可以节省重要的时间。如果使用单步碰撞检测,需要注意当时间步长较大时会发生两个物体完全穿透而算法却未检测出来的问题,如图10-25所示。其解决方案是产生一个4D空间,在物体运动的开始和结束时间之间产生一个4D超多面体,用于穿透测试。 图10-24 AABB包装盒 图10-25 碰撞检测的单步失控和4D测试读者在程序开发初期有必要对碰撞检测有一个初步的估计,以免最后把大量精力消耗在碰撞检测问题上,从

8、而降低了在基础的图形编程之上的注意力。10.3.2 球体碰撞检测真实的物理模拟系统需要非常精确的碰撞检测算法,但是游戏中常常只需要较为简单的碰撞检测,因为只需要知道物体什么时候发生碰撞,而不用知道模型的哪个多边形发生了碰撞,因此可以将不规则的物体投影成较规则的物体进行碰撞检测。球体只有一个自由度,其碰撞检测是最简单的数学模型,我们只需要知道两个球体的球心和半径就能进行检测。那么球体碰撞是如何工作的?主要过程如下。n 计算两个物体中心之间的距离,并且将其与两个球体的半径和进行比较。n 如果距离大于半径和,则没有发生碰撞。n 否则,如果距离小于半径和,则发生了物体碰撞。考虑由球心c1、c2和半径r

9、1、r2定义的两个球,如图10-26所示。设d为球心间的距离。很明显,当dr1+r2时相交,在实践中通过比较d2(r1+r2)2,可以避免包括计算d在内的平方根运算。对两个运动的球进行碰撞检测要麻烦一些,假设两个球的运动向量为d1和d2,球与位移向量是一一对应的,它们描述了所讨论时间段中的运动方式。事实上,物体的运动是相对的,例如两列在两条平行轨道上相向行驶的火车,在其中一列中观察,对方的速度是两车速度之和。同样,也可以从第一个球的角度来简化问题,假设第一个球是“静止”的,另一个是“运动”的,那么该运动向量等于原向量d1和d2之差,如图10-27所示。图10-27 动态球的检测过程球体碰撞的优

10、点是非常适用于需要快速检测的游戏,因为它不需要精确的碰撞检测算法。执行速度相对较快,不会给CPU带来过大的计算负担。球体碰撞的另一个劣势是只适用于近似球形物体,如果物体非常窄或者非常宽,该碰撞检测算法将会失效,因为会在物体实际发生碰撞之前,碰撞检测系统就发出碰撞信号,如图10-28所示是球体碰撞检测中可能出现的坏情况,其解决方法是缩小检测半径,或者使用其他检测模型,如图10-29所示。 图10-28 球体碰撞的坏情况 图10-29 缩小检测半径为了解决包容球精确度不高的问题,人们又提出了球体树的方法。球体树实际上是一种表达3D物体的层次结构。对一个形状复杂的3D物体,先用一个大球体包容整个物体

11、,然后对物体的各个主要部分用小一点的球体来表示,然后对更小的细节用更小的包容球体,这些球体和它们之间的层次关系就形成了一个球体树。举例来说,对一个游戏中的人物角色,可以用一个大球来表示整个人,然后用中等大小的球体来表示四肢和躯干,然后用更小的球体来表示手脚等。这样在对两个物体进行碰撞检测时,先比较两个最大的球体。如果有重叠,则沿树结构向下遍历,对小一点的球体进行比较,直到没有任何球体重叠,或者到了最小的球体,这个最小的球体所包含的部分就是碰撞的部分,如图10-30所示。10.3.3 AABB立方体边界框检测用球体去近似地代表物体运算量很小,但在游戏中的大多数物体是方的或者长条形的,应该用方盒来

12、代表物体。另一种常见的检测模型是立方体边界框,如图10-31展示了一个AABB检测盒和它里面的物体。坐标轴平行(Axially-aligned)不仅指盒体与世界坐标轴平行,同时也指盒体的每个面都和一条坐标轴垂直,这样一个基本信息就能减少转换盒体时操作的次数。AABB技术在当今的许多游戏中都得到了应用,开发者经常用它们作为模型的检测模型,再次指出,提高精度的同时也会降低速度。因为AABB总是与坐标轴平行,不能在旋转物体时简单地旋转AABB,而是应该在每一帧都重新计算。如果知道每个对象的内容,这个计算就不算困难,也不会降低游戏的速度。然而,还面临着精度的问题。假如有一个3D的细长刚性直棒,并且要在

13、每一帧动画中都重建它的AABB。可以看到每一帧中的包装盒都不一样而且精度也会随之改变,如图10-32所示。 图10-31 3D模型与AABB检测盒 图10-32 不同方向的AABB可以注意到AABB对物体的方向很敏感,同一物体的不同方向,AABB也可能不同(由于球体只有一个自由度,所以检测球对物体方向不敏感)。当物体在场景中移动时,它的AABB也需要随之移动,当物体发生旋转时,有两种选择:用变换后的物体来重新计算AABB,或者对AABB做和物体同样的变换。如果物体没有发生扭曲,可以通过“变换后的AABB”重新计算,因为该方法要比通过“变换后的物体”计算快得多,因为AABB只有8个顶点。变换AA

14、BB得出新的AABB要比变换物体的运算量小,但是也会带来一定的误差,如图10-33所示。比较图中原AABB(灰色部分)和新AABB(右边比较大的方框),它是通过旋转后的AABB计算得到的,新AABB几乎是原来AABB的两倍,注意,如果从旋转后的物体而不是旋转后的AABB来计算新AABB,它的大小将和原来的AABB相同。先介绍AABB的表达方法,AABB内的点满足以下条件:xminxxmaxyminyymaxzminzzmax因此只需要知道两个特别重要的顶点(xmin,ymin,zmin)、(xmax,ymax,zmax),记作:float min = new float 0.0f,0.0f,0

15、.0f;float max = new float 0.0f,0.0f,0.0f;中心点是两个顶点的中点,代表了包装盒的质点。float center = new float 0.0f,0.0f,0.0f;中心点的计算方法如下:float center() center0 = (min0 + max0)*0.5f; center1 = (min1 + max1)*0.5f; center2 = (min2 + max2)*0.5f; return center;通过这两个顶点可以知道以下属性。float xSize() return (max0-min0); float ySize() return (max1-min1); float zSize() return (max2-min2); float size() return (max0-min0)*(max1-min1)*(max2-min2);当添加一个顶点到包装盒时,需要先与这两个顶点进行比较。v

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号