碰撞检测教程(C++)

合集下载

意派Epub360高级教程:碰撞检测

意派Epub360高级教程:碰撞检测

什么是碰撞检测?Epub360新增加了碰撞检测组件,可以侦测组件的位置变化,当不同组件之间碰撞时,利用触发器触发各种动作。

这里是一个简单的效果示例。

碰撞检测的几个概念∙碰撞目标元素/碰撞元素被用来设定为可以触发碰撞事件的两组组件,针对任意一个碰撞检测组件,都需要设置这么两组对象。

这两组对象,可以各一个,也可以各多个。

∙碰撞时触发器用于设定当发生碰撞时,可以触发到动作这里讲解一下,如何设置碰撞检测。

添加碰撞检测组件点击操作页面上方的菜单栏,点击高级组件,在交互组件下选择碰撞检测组件;碰撞检测对象设定针对一个“碰撞检测”组件,设定方法如下图:1.PS作两张图,命名为小球和碰撞方块,并导入到画布中:2.设置碰撞物小球:点击碰撞组件,点击右侧添加按钮,勾选小球,点击确认;3.同理设置碰撞目标方块:点击碰撞组件,点击右侧添加按钮,勾选方块,点击确认;4.设置小球飞入动画:给小球添加飞入动画,设置重复次数为一直播放,设置动画效果为Expo.easeIn,点击确认;5.同理设置小球飞出动画:给小球添加飞出动画,设置出现方式为和上一个一起开始,设置动画效果为Expo.easeOut,勾选等待触发,设置动画结束时触发刚刚设置的小球飞入动画,点击确认;6.将小球移动到画布的的最下方;7.设置碰撞方块可移动:点击碰撞方块,勾选可拖动,设置拖拽限制为水平;预览效果这时候我们点击左上角的预览按钮,选择预览当前页,在小球一直掉落的时候左右拖拽方块,看看小球与方块碰撞后的效果吧。

小技巧提示∙“小球”上设定了两个动画▪设定为等待触发,在“碰撞时”,触发播放▪飞出动画结束时,也需要再次触发“飞入动画(1)”▪飞入动画(1),并且飞入动画结束时,再次触发执行“飞入动画(1)”▪飞出动画(2)∙“色块”设定了可拖放,并且限定在水平方向拖动碰撞检测配置项说明前面介绍了“碰撞目标元素”、“碰撞元素”以及“碰撞触发器”,其他需要介绍的配置项如下:偏移∙边界:是指以组件边界为基准,周围多少像素内,算是碰撞区域以“以边界计算偏移10个像素”举例,示意图如下∙中心:是指以组件中心为圆心,周围多少像素内,算是碰撞区域触发∙单次:触碰时触发,在接触后,不会再触发持续:只要处于接触状态,就一直触发碰撞后消失勾选后,碰撞元素会在发生碰撞时消失(如下图所示)Demo案例(可拷贝)/v2/manage/book/dyhvcl/present。

如何使用CAD软件进行建筑设计的碰撞检测和冲突解决

如何使用CAD软件进行建筑设计的碰撞检测和冲突解决

如何使用CAD软件进行建筑设计的碰撞检测和冲突解决在建筑设计过程中,碰撞检测和冲突解决是至关重要的一步。

它能够帮助设计师发现和解决设计中的错误、冲突和问题,从而保证项目的质量和安全性。

而随着计算机辅助设计(CAD)软件的普及和发展,利用CAD软件进行碰撞检测和冲突解决已经成为现代建筑设计的重要手段。

本文将介绍如何使用CAD软件进行建筑设计的碰撞检测和冲突解决。

首先,我们需要选择合适的CAD软件。

市面上有许多专业的CAD软件供我们选择,如AutoCAD、Revit、ArchiCAD等。

这些软件都具备强大的三维建模和碰撞检测功能。

选择哪个软件取决于个人的习惯和项目需求。

在本文中,我们以AutoCAD为例进行介绍。

在使用CAD软件进行建筑设计之前,我们首先需要了解项目的设计要求和约束条件。

这些包括建筑尺寸、功能区划、结构设计等。

只有清楚了解这些要求和条件,才能更精确地进行碰撞检测和冲突解决。

接下来,我们需要进行建筑模型的创建和三维建模。

CAD软件提供了丰富的建模工具,如绘图工具、修改工具等。

通过这些工具,我们可以按照项目要求进行建筑模型的创建和编辑。

在这个过程中,我们应该着重关注不同构件之间的连接关系和相互作用。

完成建筑模型之后,我们需要进行碰撞检测。

CAD软件通常提供了碰撞检测工具或插件,能够帮助我们快速发现模型中的碰撞和冲突。

在进行碰撞检测之前,我们需要设置一些检测参数,如最小间距、碰撞计算精度等。

这些参数设置将直接影响到检测的准确性和效率。

进行碰撞检测时,我们可以选择整体检测还是部分检测。

整体检测是指对整个建筑模型进行一次性的碰撞检测,可以较全面地发现冲突和问题。

而部分检测是针对特定区域或构件进行碰撞检测,适用于项目中的重点区域或特殊构件。

根据实际需要,我们可以选择适合的检测方法。

在进行碰撞检测之后,CAD软件会自动给出冲突的结果和报告。

我们需要仔细阅读报告,了解每个冲突的具体位置和类型。

然后,我们可以依次解决每个冲突,使设计满足相关要求和条件。

3Dmax中的碰撞检测和物理模拟教程

3Dmax中的碰撞检测和物理模拟教程

3Dmax中的碰撞检测和物理模拟教程标题:3D Max中的碰撞检测和物理模拟教程
引言:
3D Max是一种功能强大的三维建模和动画制作软件,广泛应用于影视制作、游戏开发、建筑设计等领域。

而其中的碰撞检测和物理模拟功能可以为模型的真实感和动态效果增添更多的细节和自然感,使得作品更加逼真。

本文将详细介绍3D Max中如何使用碰撞检测和物理模拟,以及相应的步骤。

一、碰撞检测的基础概念
1.1 碰撞检测的定义和作用
1.2 碰撞检测的分类和运算方法
1.3 3D Max中的碰撞检测插件介绍
二、碰撞检测的实现步骤
2.1 准备工作:导入模型和设置场景
2.2 添加碰撞物体
2.3 设置碰撞检测参数
2.4 运行碰撞检测
三、物理模拟的基础概念
3.1 物理模拟的定义和作用
3.2 3D Max中的物理模拟类型
3.3 物理参数的设置方法
四、物理模拟的实现步骤
4.1 准备工作:导入模型和设置场景
4.2 添加物理模拟对象
4.3 设置物理模拟参数
4.4 运行物理模拟
五、碰撞检测和物理模拟的结合应用
5.1 设置碰撞物体的物理属性
5.2 实现碰撞后的反应效果
5.3 优化碰撞检测和物理模拟效果
六、常见问题及解决方法
6.1 碰撞检测不准确的解决方法
6.2 物理模拟运算过程出错的解决方法
结论:
通过学习本文所介绍的3D Max中的碰撞检测和物理模拟教程,读者将能够掌握基础的碰撞检测和物理模拟概念、操作步骤以及相应的解决方法。

这些技能的掌握将能够为读者在影视制作、游戏开发、建筑设计等领域中的工作提供更多的可能性和创造力。

CAD中的零件和装配的碰撞检测教程

CAD中的零件和装配的碰撞检测教程

CAD中的零件和装配的碰撞检测教程CAD(计算机辅助设计)是一种广泛应用于工程设计领域的技术。

在CAD软件中,零件和装配的碰撞检测是一个非常重要的功能,它能够帮助设计师在设计过程中避免错误和冲突。

本教程将介绍如何在CAD软件中进行碰撞检测。

首先,打开CAD软件并创建一个新的项目。

在这个项目中,我们将创建一些零件和装配模型来演示碰撞检测的过程。

第一步是创建零件模型。

选择适合你的设计需求的基本形状,如长方体、球体或圆柱体,并按照所需的尺寸和比例进行绘制。

你也可以根据需要使用CAD软件提供的其他工具和特性来制作更复杂的零件模型。

完成零件模型后,我们需要将它们组装成一个装配体。

选择需要组装的零件并将它们放置在适当的位置。

确保零件之间的连接部分正确对齐并符合设计要求。

完成装配体后,我们可以开始进行碰撞检测了。

在CAD软件的菜单栏或工具栏中,找到碰撞检测功能。

不同的CAD软件可能会有不同的名称和位置,但其功能基本相同。

点击碰撞检测功能后,选择需要进行碰撞检测的零件和装配体。

确保你选择了正确的模型,并根据需要设置相应的参数和条件。

开始进行碰撞检测后,CAD软件会自动计算和分析模型之间的碰撞情况。

如果存在碰撞或冲突,CAD软件将会给出相应的警告或错误信息。

根据软件的不同,你可能可以查看碰撞的具体位置、角度和程度。

根据碰撞检测的结果,你可以对零件和装配体进行调整和修改,以解决碰撞或冲突的问题。

你可以改变零件的尺寸、形状或位置,也可以调整装配体的连接方式或顺序等。

重复进行碰撞检测和修改的过程,直到没有任何碰撞或冲突问题。

这样,你就可以确保你的设计在实际应用中不会出现碰撞和冲突的情况,提高了设计的安全性和可靠性。

除了基本的碰撞检测外,CAD软件还提供了其他一些高级的碰撞检测功能。

例如,它可以检测零件之间的间隙或过于接近的情况,帮助设计师进一步优化设计。

此外,CAD软件还可以模拟和分析零件和装配体的运动、应力和动力学行为,以预测和优化设计的性能和行为。

3DMAX中的碰撞检测与物理模拟

 3DMAX中的碰撞检测与物理模拟

3DMAX中的碰撞检测与物理模拟3DMAX中的碰撞检测与物理模拟碰撞检测和物理模拟在3D制作中扮演着重要的角色。

无论是电影特效、游戏开发还是建筑设计,3DMAX作为一款强大的三维建模和渲染软件,其碰撞检测和物理模拟功能的运用能够让场景更加真实和生动。

本文将介绍3DMAX中的碰撞检测与物理模拟的原理和应用。

一、碰撞检测的原理与应用1. 碰撞检测的原理碰撞检测是指在3D场景中判断两个或多个物体是否发生了碰撞的过程。

在3DMAX中,碰撞检测主要是通过计算物体的边界盒或者多边形网格之间是否存在相交来进行。

边界盒是一个简单的几何体,可以用一个包围物体的盒子来近似表示该物体的大小和形状。

多边形网格则是由多个三角形构成的网格模型。

2. 碰撞检测的应用在游戏开发中,碰撞检测是非常重要的一项技术。

它可以实现角色与环境的交互,角色与其他角色的碰撞等。

通过合理地运用碰撞检测技术,可以实现游戏中丰富多样的交互效果,提升游戏的可玩性和真实感。

在建筑设计中,碰撞检测则可以确保建筑物的结构稳定性和安全性。

通过在3DMAX中设置碰撞检测,可以帮助设计师发现并解决建筑结构中的潜在问题,从而提高建筑的质量和可靠性。

二、物理模拟的原理与应用1. 物理模拟的原理物理模拟是指通过模拟真实世界中的物理规律来模拟物体的运动和互动。

在3DMAX中,物理模拟主要涉及到重力、摩擦力、碰撞反应等物理规律的模拟和运用。

通过在3D场景中设置物体的质量、摩擦系数等属性,可以实现物体的真实运动效果。

2. 物理模拟的应用在电影特效中,物理模拟可以模拟真实的自然现象,如水的流动、火的燃烧等。

通过合理地运用物理模拟技术,可以让特效场景更加逼真,增强视觉冲击力。

在游戏开发中,物理模拟可以模拟角色的动作和运动。

通过设置角色的质量、摩擦系数等属性,可以实现角色在游戏中与环境进行互动的效果。

例如,角色在施加力的情况下会受到相应的物理反馈,使得其动作更加真实和自然。

三、3DMAX中的碰撞检测与物理模拟的操作方法1. 碰撞检测的操作方法在3DMAX中,可以通过编辑模式下的“碰撞”选项来进行碰撞检测的设置。

物理模拟与碰撞检测 Blender刚体动画教程

物理模拟与碰撞检测 Blender刚体动画教程

物理模拟与碰撞检测:Blender刚体动画教程Blender是一款功能强大的开源三维建模和动画软件,其物理模拟与碰撞检测功能可以为创作者提供更加逼真、生动的场景和效果。

本文将介绍如何在Blender中使用物理模拟和碰撞检测创建刚体动画。

首先,打开Blender软件并创建一个新的场景。

在3D视图中,按下Shift+A键将一个刚体对象添加到场景中。

然后,选择刚体对象,转到物理属性面板。

在这里,您可以设置刚体的形状、质量和其他属性。

接下来,我们将设置刚体的碰撞形状。

在刚体属性面板的“碰撞”选项卡中,您可以选择不同的形状,如球体、盒子、胶囊等。

根据您的需求选择适当的形状,并调整其大小和位置以确保与其他对象的碰撞效果符合预期。

在物理模拟中,最常用的是重力和碰撞检测。

Blender中默认启用了重力模拟,您可以在场景属性面板中的“世界”选项卡中调整重力的强度和方向。

碰撞检测可以确保刚体对象之间以及与其他对象之间的交互效果更加真实。

在Blender中,碰撞检测通过物理模拟引擎来实现。

为了使刚体对象具有动画效果,我们需要为它们设置关键帧。

选择一个刚体对象并转到“动画”选项卡。

在时间轴上选择一个时间点,然后在属性栏中调整刚体对象的位置和旋转。

点击“关键帧”按钮为该属性创建一个关键帧。

然后,在时间轴上选择不同的时间点并调整刚体对象的属性来创建多个关键帧。

这样,当您播放动画时,刚体对象将按照关键帧设置的位置和旋转进行动态运动。

现在,您可以按下Alt+A键来播放动画。

您将看到刚体对象根据物理模拟和碰撞检测的设置进行运动和碰撞。

您可以通过继续调整关键帧和属性来调整动画的效果。

除了基本的物理模拟和碰撞检测外,Blender还提供了许多高级功能来增强刚体动画的效果。

例如,您可以通过设置刚体关节来模拟多个物体之间的连接和运动,并使用布料模拟创建具有自然运动效果的布料对象。

总结一下,在Blender中创建刚体动画需要以下步骤:添加刚体对象,设置碰撞形状和属性,启用物理模拟和碰撞检测,设置关键帧,并播放动画来查看效果。

3Dmax碰撞检测教程:模拟真实的物理碰撞效果

3Dmax碰撞检测教程:模拟真实的物理碰撞效果

3Dmax碰撞检测教程:模拟真实的物理碰撞效果第一步:准备工作1. 安装3Dmax软件并确保已正确配置。

2. 准备模型和场景素材,包括需要进行碰撞检测的物体和环境。

第二步:导入模型和场景素材1. 打开3Dmax软件,在菜单栏上选择“文件”-“导入”并选择需要导入的模型文件。

2. 将模型调整至适当的位置和大小,并根据需要进行旋转和缩放。

第三步:设置碰撞体1. 选择需要设置碰撞体的模型,右键点击并选择“属性”选项。

2. 在属性窗口中选择“动力学”标签,并勾选“开启力学”复选框。

3. 在“碰撞体”选项中选择合适的碰撞体类型,如球体、盒体或网格等。

4. 根据模型的形状和特点,调整碰撞体的参数,包括半径、长度、宽度和高度等。

第四步:设置物理引擎1. 在菜单栏上选择“创建”-“系统”-“融合器”并创建一个融合器对象。

2. 双击融合器对象,在弹出的对话框中选择“动力学”选项,并选择合适的物理引擎类型。

3. 在融合器对象的属性窗口中,可以设置全局的物理参数,如重力、空气阻力和摩擦系数等。

第五步:设置碰撞检测1. 在融合器对象的属性窗口中,选择“碰撞”选项,并勾选“开启碰撞检测”复选框。

2. 在“碰撞对象”选项中,选择需要进行碰撞检测的物体,并设置它们的碰撞组和碰撞标记。

3. 根据需要,可以设置碰撞的材质属性,如弹力、摩擦力和粘附力等。

第六步:模拟碰撞效果1. 在时间轴上选择一个合适的时间点,点击“动画”按钮并开始模拟碰撞效果。

2. 在模拟过程中,可以观察物体的运动和碰撞效果,并根据需要进行调整和优化。

3. 可以通过调整碰撞体和物理引擎的参数,来获得更加真实的物理碰撞效果。

第七步:渲染和输出1. 在场景完成模拟后,可以对场景中的物体进行渲染,以获得高质量的图像或动画。

2. 在渲染设置中,可以选择渲染的分辨率、帧率和输出格式等,并进行相应的调整。

3. 点击“渲染”按钮,等待渲染完成后,可以将结果保存为图像或动画文件。

C语言物理引擎开发碰撞检测和物体运动

C语言物理引擎开发碰撞检测和物体运动

C语言物理引擎开发碰撞检测和物体运动C语言物理引擎开发:碰撞检测和物体运动编程是一门创造性的艺术,能够让我们通过代码实现各种强大的功能和效果。

而在游戏开发领域,物理引擎是实现真实的物体运动和碰撞检测的关键技术之一。

本文将介绍如何使用C语言开发物理引擎,实现碰撞检测和物体运动的功能。

一、概览物理引擎是一个模拟真实物理行为的软件组件,可以处理物体的运动、碰撞、重力等效果。

在游戏中,物理引擎可以实现真实的物体交互效果,提升游戏的逼真感和娱乐性。

二、碰撞检测碰撞检测是物理引擎中非常重要的一部分,它可以判断两个物体是否发生了碰撞。

在C语言中可以通过简单的算法来实现碰撞检测,例如使用矩形的边界框进行检测。

在碰撞检测中,首先需要定义物体的表示方法,可以使用结构体来表示物体的位置、大小等属性。

然后通过比较两个物体的位置和大小,判断它们是否相交或者重叠,从而确定是否发生了碰撞。

三、物体运动物体运动是游戏中常见的效果之一,它可以让物体在游戏世界中自由移动和交互。

在物理引擎中,物体的运动可以通过简单的数学计算来实现。

在C语言中,可以使用欧拉积分法来计算物体的位置和速度。

欧拉积分法是一种简单而常用的数值积分方法,它通过不断累加速度和时间间隔,计算物体的新位置和速度。

同时,物体的运动也受到力的作用,可以应用牛顿第二定律进行计算。

根据物体受到的外力和摩擦力,可以计算出物体的加速度,并使用欧拉积分法更新物体的位置和速度。

四、优化和扩展在物理引擎的开发过程中,优化和扩展是非常重要的环节。

通过不断地改进算法和数据结构,可以提高物理引擎的性能和效果。

为了提高碰撞检测的效率,可以使用空间划分技术,如四叉树、网格等,减少无效的碰撞检测计算。

同时,使用合适的数据结构来存储物体的属性,如使用链表或数组来管理物体列表,可以提高物体运动的效率。

此外,物理引擎的功能还可以通过添加更多的特性来进行扩展。

例如,可以实现弹性碰撞效果、悬挂效果等,提升游戏的真实感和交互性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间: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 ++){Vector E = A.vertex[I]- A.vertex[J];Vector N = Vector(-E.y, E.x);if(AxisSeparatePolygons(N, A, B))return false;}二、用于碰撞响应的扩展分离坐标轴方法检测多边形相交是非常有用的方法,但是可以做更多的事情。

当多边形相交时,我想将他们移开以避免他们相交。

分离轴的方法可以非常好的用于这种情况,但是还需要作一些额外的工作。

必须返回相交的深度,和推开多边形将它们分离的方向。

相交的深度和方向的组合称为MTD,或者最小平移距离。

这是用于将物体分离的的最小向量。

为了计算MTD,我们可以使用分离坐标轴。

当物体相交时,我们可以计算两个物体在每一个分离轴上的投影间隔。

两个间隔交叠的部分提供了一个推动向量,你需要将其应用到其中一个物体上以便物体在轴上的投影停止交叠“推动向量”你需要应用于A上将A推开,这样就可以使A和B分开。

显然,不能沿着一个随机的轴来推开物体。

候选轴是投影在该轴上两个间隔之间交叠最小的那个。

并且这个推动向量提供了最小平移距离。

bool Intersect(Polygon A, Polygon B, Vector& MTD){// 电位分离轴。

他们被转换成推动vectors Vector Axis[32];// 每个多边形最大的16个顶点的int iNumAxis =0;for(J = A.num_vertices - 1, I =0; I < A. num_vertices; J = I, I ++){Vector E = A.vertex[I]- A.vertex[J];Axis[iNumAxis++]= Vector(-E.y, E.x);if(AxisSeparatePolygons(N, A, B))return false;}for(J = B. num_vertices - 1, I =0; I < B.num_vertices; J = I, I ++){Vector E = B.vertex[I]- B.vertex[J];Axis[iNumAxis++]= Vector(-E.y, E.x);if(AxisSeparatePolygons (N, A, B))return false;}// 找到所有的分离向量之间的MTDMTD = FindMTD(Axis, iNumAxis);// 确保将向量a推动远离bVector D = A.Position - B.Position;if(D dot MTD <0.0f)MTD =-MTD;return true;}bool AxisSeparatePolygons(Vector& Axis, Polygon A, Polygon B){ float mina, maxa;float minb, maxb;CalculateInterval(Axis, A, mina, maxa);CalculateInterval(Axis, B, minb, maxb);if(mina > maxb || minb > maxa)return true;// 查找间隔重叠float d0 = maxa - minb;float d1 = maxb - mina;float depth =(d0 < d1)? d0 : d1;// 将分离轴为推力矢量(重新恢复正常的轴乘区间重叠)float axis_length_squared = Axis dot Axis;Axis *= depth / axis_length_squared;return false;}Vector FindMTD(Vector* PushVectors,int iNumVectors){ Vector MTD = PushVector[0];float mind2 = PushVector[0] dot PushVector[0];for(int I =1; I < iNumVectors; I ++){float d2 = PushVector[I]* PushVector[I];if(d2 < mind2){mind2 = d2;MTD = PushVector[I];}}return MTD;}一旦得到了MTD向量,可以使用如下的方式将他们分开。

A.Postion += MTD *0.5f;B.Position -= MTD *0.5f;显然,如果物体A是静态的,那么B将被完全的MTD推开(B.Position-=MTD)而A将不会被推开。

三、对快速移动的物体做进一步扩展上述方法处理慢速移动物体时会取得非常好的效果。

但是当物体移动的非常快时,碰撞系统将失去准确性,丢失碰撞,或者允许物体之间相互穿越,这可不是我们所期望的。

这里我们还是使用分离坐标轴的方法,并进一步扩展,并使用该算法检测未来某时刻的碰撞和交叠。

原理还是相同的,可以使用下面的图片解释:现在需要使用投影数学。

如果投影间隔没有相交,将速度投影到分离轴上,并计算两个间隔的碰撞时间。

相对于静态分离轴算法,我们需要测试一个扩展的轴。

显然这个是速度矢量轴。

那么我们现在有3个选择:1.间隔交叠2.间隔不相交,但是将在未来某个时刻发生碰撞3.间隔不相交,并且不会在未来发生碰撞第三种可能性意味着物体不会在该帧处发生碰撞,而且分离轴真正分离了物体。

因此物体不会发生碰撞。

AxisSeparatePolygons()函数将反映这种现象,并返回重叠量或者碰撞时间。

为了区别两者,当检测到交叠时,将返回一个负值。

如果检测到未来的碰撞,将返回一个正值。

该函数看起来如下:bool AxisSeparatePolygons(Vector Axis, Polygon A, Polygon B, Vector Offset,Vector Vel,float& t,float tmax);这里Offset是多边形A和多边形B之间的相对距离,并且Vel是多边形A相对于多边形B的相对速度。

相关文档
最新文档