`

基于2D多边形的碰撞检测和响应(六)

阅读更多

六、计算触点

为了动态的移动刚体,我们需要精确计算两个碰撞多边形之间的触点。对于2D来说这并不复杂,但是在3D场景中会变得非常复杂。在2D情况下,可以考虑两种情况,点和边的相交或者是边和边的相交。
这个处理过程几乎不需要教程,但是它非常适合于一个可视化的演示

这里,我只考虑交叠的情况,这个原理也适用于碰撞的情况。
现在给出一个碰撞的法向,在点边接触的情况下,如何求得触点?
对于接触点A,它是直接向前的。我们需要调用一个支撑映射函数,他将返回多边形在制定方向上的最低点,非常类似于第一个例子中的CalculateInterval()函数

int FindSupportPoints(const Vector& N, float t,
const Vector* A, int Anum,
const Vector& PA, const Vector& VA,
const Matrix& OA, Vector* S)
{
Vector Norm = N ^ OA;
float d[32];
float dmin;
dmin = d[0] = A[0] * Norm;

for(int i = 1; i < Anum; i ++)
{
d[i] = A[i] * Norm;

if (d[i] < dmin)
{
dmin = d[i];
}
}

int Snum = 0;

const float threshold = 1.0E-3f;

for(int i = 0; i < Anum; i ++)
{
if (d[i] < dmin + threshold)
{
S[Snum++] = Transform(A[i], PA, VA, OA, t);

if (Snum == 2)
return Snum;
}
}
return Snum;
}

这里,函数的第一部分找到多边形的最小值。第二部分简单的找到接近最小值的所有点,因此如果碰撞法线垂直于一条边,将返回两个点。这两个点将以世界坐标存贮,变换函数将确保多边形的触点被转化为世界坐标,并且如果是一个未来的碰撞,这个点将被转化为碰撞时刻的

Vector Transform(const Vector& Vertex, const Vector& P, const Vector& V, const Matrix& xOrient, float t)
{
// convert point into world space
Vector T = P + (Vertex * xOrient);

// collision forwatd in time, need to translate to moment of collision
if(t > 0.0f)
T += V * t;
return T;
}

对于B上的点,你只需要简单地在反方向找到一个支撑点,在以后的处理中我们需要一对位于两个物体上的支撑点来做物理模拟推力并使物体旋转,你可以从上图中发现在不同的碰撞情况下你需要得到的一对触点。
现在,调用FindSupportPoint()函数在每个物体上返回一个或两个触点。在一对一触点的情况下,不需要做任何事情,现在,还不支持一对一的接触,但是它能够非常容易的扩展到分离轴算法中。
在一对二接触的情况下,它是一个简单的点对边的碰撞,如上图中的第一个图
在二对一接触的情况下,可以同样运用上述情况,除了物体被交换外
在二对二接触的情况下,他是一个边边碰撞,你需要找到两个边的交叠区域。
首先对于点边碰撞,在这种情况下,一对碰撞点可以简单的通过将A上的碰撞点投影到B的边上来实现,或者说是B的边上最接近A触点的点

Vector FindClosestPoint(const Vector& V, const Vector& A, const Vector& B, float* pt)
{
Vector AV = V - A;
Vector AB = B - A;

float t = (AV * AB) / (AB * AB);

if (t < 0.0f)
t = 0.0f;
else if (t > 1.0f)
t = 1.0f;

if (pt) *pt = t;

Vector P = A + t * AB;
return P;
}

在边对边碰撞的情况下,处理过程非常类似。只是你需要沿着沿着碰撞法线的垂直方向排序点,并得到两个中间点。然后,将它们投影到另外的边上以便得到一对触点。

有了这些触点,你就可以编写一个基本的刚体系统,物体将比以前更真实的相互碰撞并响应碰撞。
分享到:
评论

相关推荐

    2D多边形碰撞算法及示例

    通过实践和理解这些概念,我们可以构建出高效且准确的2D多边形碰撞检测系统。"Polygon collision"压缩包中的资源可能包含了详细教程、源代码示例以及用OpenGL实现的动画展示,帮助读者更直观地理解和应用这些理论...

    基于OpenGL的碰撞检测源程序

    在这个基于OpenGL的碰撞检测源程序中,我们关注的核心是游戏开发和模拟中的一个重要概念:如何确定两个或多个对象是否在空间中相遇或相交,即碰撞检测。 碰撞检测在许多应用中至关重要,例如视频游戏、物理模拟和...

    二维多边形碰撞检测

    二维多边形碰撞检测是计算机图形学中的一个重要概念,尤其在游戏...总之,二维多边形碰撞检测是一个涉及几何、算法和编程技术的综合问题。通过学习和实践,开发者可以创建出更加真实的2D游戏环境,提高玩家的游戏体验。

    基于QT的C++的碰撞检测

    总的来说,这个项目展示了如何结合QT框架和C++来实现一个交互式的碰撞检测系统,允许用户通过鼠标滚轮动态调整视角,从而观察和分析碰撞情况。这涉及到图形用户界面的设计、事件处理、几何形状的碰撞检测算法以及2D...

    Cocos2d-x碰撞检测原理与英雄要打死怪物--之游戏开发《赵云要格斗》

    Box2D提供了一个强大的多边形碰撞检测系统,可以创建具有不同形状(如圆形、多边形)的物理体,并通过模拟真实世界的物理规则来检测碰撞。在Cocos2d-x中,你可以通过集成Box2D并创建`CCPhysicsWorld`,然后为每个...

    cocos2d-x游戏碰撞检测(中文翻译)毕设也肯定用的上

    - **精确形状碰撞检测**:对于更复杂的形状,如圆形、多边形,可以使用`b2World`提供的Box2D物理引擎进行精确的碰撞检测。 3. **Box2D物理引擎**: Box2D是cocos2d-x中集成的2D物理引擎,提供了强大的碰撞检测...

    2D碰撞实现-Demo

    2D碰撞检测的基本原理是基于几何形状的相互检验。常见的2D几何形状有矩形、圆形和多边形等。在室内碰撞的场景中,我们通常会遇到房间、家具等由矩形或多边形定义的障碍物。以下是一些关键的碰撞检测方法: 1. **轴...

    碰撞检测 有关C++

    5. **碰撞检测库**:在C++中,有许多现成的碰撞检测库,如Bullet、Box2D和Ogre3D等,它们提供了丰富的接口和功能,能快速实现各种碰撞检测需求。 6. **优化技巧**:为了提升性能,可以使用启发式方法,如动态优先...

    物理碰撞检测实例

    cocos2d-x 3.0的物理引擎提供了两种主要的碰撞检测方法:基于距离的检测和基于固定时间步长的检测。基于距离的检测会在每次更新时检查所有可能的碰撞,这种方法精度高但效率较低。而基于固定时间步长的检测则是在每...

    2D-Polygon-Collision-Detection

    接着,我们可以采用分离轴定理(Separating Axis Theorem, SAT),这是一种广泛应用于2D多边形碰撞检测的算法。该定理基于一个核心思想:如果两个多边形不相交,那么存在一个轴使得两个多边形的投影在该轴上没有重叠...

    Tiled Map中使用碰撞检测

    本篇文章将深入探讨如何在基于Tiled Map的游戏中实现碰撞检测,特别是使用cocos2d框架。cocos2d是一个强大的开源游戏引擎,广泛应用于iOS和Android平台,对于iPhone游戏开发尤其适用。 首先,我们需要理解Tiled Map...

    cocos2d-x游戏开发系列教程-坦克大战游戏之所有坦克之间的碰撞检测

    cocos2d-x提供了一些内置的几何形状类,如`CCRect`(矩形)和`CCPolygon`(多边形),用于表示游戏对象的边界,并提供了相应的碰撞检测方法。对于坦克这类基本为矩形的物体,我们可以使用`CGRectIntersectsRect()`...

    xna中的碰撞检测

    本资源重点讲解如何在2D环境中实现碰撞检测,这对于创建像《超级玛丽》这样的平台跳跃游戏或者简单的弹球游戏至关重要。 首先,我们需要理解碰撞检测的基本概念。碰撞检测是指在游戏世界中,判断两个或多个物体是否...

    人物移动和碰撞检测

    在游戏开发中,人物移动和碰撞检测是两个至关重要的技术环节。它们决定了游戏中的角色如何在虚拟世界中行动,以及如何与环境互动。本资源包含了人物移动算法和碰撞检测技术的相关资料,帮助开发者深入理解并实现这些...

    ActionScript碰撞检测封装类

    2. **精确碰撞检测**:对于更复杂的形状,如圆形、多边形,可以使用更精确的算法,如分离轴定理(Separating Axis Theorem,SAT)或旋转包容体(Rotated Bounding Box,RBB)。这些算法能够处理不规则形状,并且在...

    cocos2d-x游戏开发系列教程-坦克大战游戏之子弹的碰撞检测处理

    在cocos2d-x中,可以为每个游戏对象创建一个物理身体,设置其形状(如圆形、多边形等),并开启物理引擎进行实时碰撞检测。当发生碰撞时,会触发相应的物理碰撞事件。 在处理子弹与坦克的碰撞时,我们需要创建一个...

    opengl 碰撞检测

    OpenGL碰撞检测是计算机图形...总的来说,OpenGL碰撞检测是一个涉及几何、变换、算法和响应处理的综合过程。理解和掌握这个技术,不仅可以提升你的编程技能,还能帮助你在创建交互式3D应用时做出更加真实和动态的效果。

    碰撞检测源代码,欢迎下载,学习物理引擎的比较有用

    在IT领域,尤其是在游戏开发和实时模拟中,碰撞检测是一个至关重要的部分。它涉及到计算机图形学、物理学以及算法设计等多个方面。"碰撞检测源代码"是实现这一功能的基础,对于那些想要深入理解或构建自己的物理引擎...

    OpenGL碰撞检测

    在基于MFC(Microsoft Foundation Classes)的框架中,OpenGL碰撞检测可能涉及到以下几个关键步骤: 1. **数据结构与对象表示**:首先,我们需要将3D模型转换为合适的数据结构,如顶点数组、索引数组等。这些数据将...

    cocos2d-x游戏开发系列教程-坦克大战游戏之坦克和地图碰撞的检测

    cocos2d-x提供了`CCRect`类用于矩形碰撞检测,而对于更复杂的形状,可以使用`CCPolygon`类进行多边形碰撞检测。 3. **碰撞检测算法**:cocos2d-x框架内嵌了基本的碰撞检测方法,如矩形与矩形、矩形与多边形的碰撞。...

Global site tag (gtag.js) - Google Analytics