- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于分离轴定理的碰撞检测算法
摘要:在游戏开发中,为了不使游戏中的物体相互穿越,需要使用碰撞检测技术来约束场景中物体的行动,本文比较了常用的几种碰撞检测算法的优劣,探讨了分离轴定理在碰撞检测中的应用及优势。
关键词:碰撞检测 包围盒 凸多边形 分离轴定理
中图分类号:th721 文献标识码:a 文章编号:1007-9416(2012)08-0102-01
无论是pc游戏,还是移动应用,碰撞检测始终是程序开发的难点,甚至可以用碰撞检测作为衡量游戏引擎是否完善的标准。好的碰撞检测要求人物在场景中可以平滑移动,在各种前进方向被挡住的情况下都会尽可能地沿合理的方向滑动而不是被迫停下,不会在特殊情况下穿墙而掉出场景。因为碰撞现象符合日常生活中的常识。如果出现bug,很容易被人发现,例如人物无缘无故被卡住不能前进或者人物穿越了障碍。所以,碰撞检测的重要性不言而喻。
1、常见的碰撞检测算法
最为精确的碰撞检测算法是像素检测算法,即对物体的每个像素进行测试,当像素出现重叠,即为碰撞,但这种算法的计算量很大,在移动设备上会严重拖慢游戏的运行速度。,所以很少使用。当精确度要求不高时,可以用包围球算法,即用物体轮廓的外接圆把物体包围起来,这样要测试两个物体是否碰撞,只需要计算两个圆之间的距离是否大于两个圆的半径之和,如果大于,则说明没有碰撞,反之则碰撞。由于大多数情况下包围球的紧密型和简单性都不够理想,所以很少单独使用。另外一种aabb(axially aligned bounding box)即沿坐标轴包围盒算法,即把物体抽象成一个边和坐标轴平行的矩形,简单性好,但是紧密型要差。还有obb(oriented bounding box)即方向包围盒算法,紧密型最好,但是计算量要大一些。一般的精确度完全可以胜任,计算量也在移动设备可承受的范围,所以比较常用。obb包围盒的碰撞检测算法一般用的是分离轴测试算法。
2、基于分离轴定理的碰撞检测算法
分离轴定理(separating axis theorem,sat)提出,如果能找到一条轴,使得两个物体在该轴上的投影互不重叠,那么着两个物体就是不相交的。所以问题的关键如何找到这条轴。
这种算法只适用于凸多边形,所谓凸多边形,就是把一个多边形任意一边向两方无限延长成为一条直线,如果多边形的其他各边均在此直线的同旁,例如三角形,四边形,六边形,圆形等。对于非凸多边形,可以将其分解为多个凸多边形。算法还可以处理重叠的问题,并促使重叠的物体分离。
在2d的情况下,两个多边形每条边的法向量包含了这条轴的所有可能性。所以我们只需要枚举两个多边形的每条边的法向量即可。2d向量的法向量即是垂直于这个向量的一个向量,向量(x,y)的法向量可以表示为(y,-x)或(-y,x),这个算法不需要考虑方向,所以任选一种即可,然后分别计算这两个多边形的所有点在此向量上的投影,并求出最大最小区域,如果没有重合,那么直接确定这两个多边形不重合,如果有重叠,那么就计算出相交的最小深度及其方向(推动向量,称为mtd,用于把两个物体推开)并继续判断下一条边的法向量。步骤为:
(1)计算多边形一条边的法向量。
设这边的两个顶点为(x1,y1)和(x2,y2),那么这条边就可以用向量表示为(x1-x2,y1-y2),法向量为(y2-y1,x1-x2)。
(2)分别计算每个多边形的每条边在这个法向量上的投影,找出最大值和最小值。
设边的向量为(x1,y1),法向量为(x2,y2),那么边在法向量上的投影dot的计算方法为:
temp1=x2*x2+y2*y2;temp2=x1*x1+y1*y1;
dot_x=temp2*x2/temp1;dot_y=temp2*y2/temp1;
dot=dot_x*x2+ dot_y*y2;
对多边形的每条边计算出dot,并找出最大值和最小值。
(3)比较两个多边形的最大值和最小值是否有交集,如果有交集,则转到(1)继续计算下一条边的分离轴,如果没有则说明找到了一条轴,使两个物体在这条轴上的投影不重叠。说明这两个物体没有碰撞,可以结束计算。如果找不到这样的轴,则说明物体重叠,计算出点积值最小的那条分离轴,即推动向量。在碰撞反馈中,让两物体按一定的比例沿推动向量向相反方向分开即可。
3、分离轴碰撞检测算法的优化
由于分离轴算法计算量比较大,所以实际用的时候要和其他算法结合起来来减少计算量。常用优化策略有一下这些:
(1)每两个物体只检测一次。
(2)物体先进行粗略的包围球测试,再进行精确一些的aabb包围盒测试,通过之后再进行分离轴测试,这样可以减少很多不必要的计算量。
(3)对于obb包围盒来说,多边形的四条边是两两平行的,所以每个多边形只需要测试两条边,两条分离轴。
4、结语
分离轴测试检测算法相对于
文档评论(0)