- 1、本文档共37页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
简介
本文是阐述如何在2D动作游戏中进行精确而高效的碰撞检测。这里的碰撞是基于多边形而不是基于精灵的。这两者之间在设计上会有不同。
基于精灵的碰撞检测是通过精灵之间的重叠的像素来完成的。而多边形使用向量数学来精确计算交点,时间和碰撞方向。虽然多边形仅仅是精灵的一个近似,但是它比精灵系统要高级。
可以精确模拟逼真的简单物理学,例如反弹,摩擦,斜面的滑行
碰撞检测可以更精确的用于高速精灵系统。在基于精灵的系统中,如果物体移动过快就会在跳过另一个物体。
基于向量数学因此可以扩展到3D,然而精灵碰撞系统被严格限制在2D的情况下。
特性
本文使用的算法只适用于凸多边形,例如三角形,四边形,六边形,圆形。对于非凸多边形,你可以将其分解为多个凸多边形,例如三角形。
算法可以用于快速移动或慢速移动的多边形。不管物体移动多快,碰撞都不会丢失。它也可以处理重叠的问题,并促使交叠物体分离。
演示也支持分割多边形交叉。这可以用于子弹的建模。
同时提供了简单的物体系统,弹力,一些基本的摩擦和静摩擦力。用于确保物体不会从斜面上滑落。
有一个刚体系统的例子,使用了Chrsi Hecker的物理教程。
限制
有序碰撞。就是说并不是有序的进行碰撞。这对于快速移动的物体会出现一定的问题。一旦碰撞被检测到,它就被直接处理了。理想状态下你可能需要找到一个碰撞点并处理它,然后寻找更多的碰撞。但是对于2D动作游戏,这通常是不必要的。一、分离坐标轴方法
这个方法是碰撞检测的核心。它的规则非常简单并且非常易于实现。这个方法也非常快并且非常可靠,因为计算中没有使用除法操作,下面给出一个简单的基于两个BOX的碰撞检测的例子。
算法试图在两个物体之间找到一个合适平面,如果这个平面存在,那么物体就没有相交。
为了测试物体是否是分开的,简单的方法是投影这个物体到平面的法线上,并比较两者之间的间距看二者是否重叠。
显然有无数的平面可以用来分割两个物体。但是已经经过证明的是:你只需要使用一部分平面来进行测试,对于BOX从上图中可以看出平面的法线为BOX B的长轴。
对于BOX来说需要测试的分割平面是那些法线等于两个BOX的轴向的平面。因此对于两个BOX来说,你只需要测试4个分割平面即可。在这四个平面里,一旦发现一个分割平面可以分割BOX那么你就可以断定这两个BOX是不相交的。
如果四个平面都不能分割BOX,那么这两个BOX一定是相交的,也就是出现了碰撞。
可以扩展这个算法到普通的多边形,算法是相同的,只用需要测试的平面的数量改变了。并且分割平面在每个多边形边的垂直方向上又有一个法线。在下图中,你可以看到两个分割平面用于测试。在红色的平面上你可以看到两个间隔是重叠的。然而,在蓝色的平面上间隔是不重叠的,因此,蓝色的平面的是分割平面,因此物体是不相交的。
现在,我们有一个算法来检测两个多边形是否是相交的。代码可以分为三个部分:
a) 生成需要测试的分离轴
b) 计算每一个多边形在分离轴法线上的投影
c) 检测这些投影是否相交
bool Intersect(Polygon A, Polygon B)
{
for(I = 0; I A.num_edges; I ++)
{
Vector N = Vector(-A.EdgeDir[I].y, A.EdgeDir[I].x);
if (AxisSeparatePolygons(N, A, B)) return false;
}
for(I = 0; I B.num_edges; I ++)
{
Vector N = Vector(-B.EdgeDir[i].y, B.EdgeDir[I].x);
if (AxisSeparatePolygons (N, A, B)) return false;
}
return true;
}
void CalculateInterval(Vector Axis, Polygon P, float min, float max)
{
float d = Axis dot P.vertex[0]; //从坐标原点开始计算向量
min = max = d;
for(I = 0; I P.num_vertices; I ++)
{
float d = P.vertex[I] dot Axis;
if (d min) min = d; else if(d max) max = d;
}
}
算法检测2D多边形之间的碰撞,这个算法非常的快速和适用。边的方向不需要单位化,因此你可以避免存贮边的方向,并通过多边形的顶点直接得到边的方向。
for(J = A.num_vertices-1, I = 0; I A.num_vertices; J = I, I ++)
{
您可能关注的文档
- 配位化学在医药中的应用..ppt
- 配线基本知识..ppt
- 配液系统验证方案..doc
- 配载基础知识..ppt
- 配置4G LTE的OBD车联网标准终端T-Box将成为智能化标志..doc
- 配子和胚胎的冷冻及复苏(规范.朱桂金教授)..ppt
- 配子中染色体组合多样性..ppt
- 配紫色游戏_课件_1_北师大版..ppt
- 喷灌喷头类型及布置原则..pptx
- 喷淋系统介绍..ppt
- 师缘主题课件最新完整版本.pptx
- 基于偏好MOEA_D算法的气发动机多目标优化标定研究.pdf
- 师范技能课件比赛一等奖最新完整版本.pptx
- 师范生初中美术说课课件最新完整版本.pptx
- 师范技能课件图片素材库最新完整版本.pptx
- Unit 2 Making a Difference Understanding ideas The Well that changed the world 教学设计-高中英语外研版(2019)必修第三册.docx
- 师范生技能大赛PPT课件语文最新完整版本.pptx
- 基于扭矩的双燃料发动机控制策略研究.pdf
- 1.2.1 等差数列的概念及其通项公式(教学设计)高二数学(北师大版2019选择性必修第二册).docx
- 师范文化课件最新完整版本.pptx
文档评论(0)