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

基于cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法 使用OBB来进行碰撞检测,避免使用传统AABB进行碰撞检测的不精确性。 阅读详情
三、对快速移动的物体做进一步扩展
上述方法处理慢速移动物体时会取得非常好的效果。但是当物体移动的非常快时,碰撞系统将失去准确性,丢失碰撞,或者允许物体之间相互穿越,这可不是我们所期望的。
 
这里我们还是使用分离坐标轴的方法,并进一步扩展,并使用该算法检测未来某时刻的碰撞和交叠。
 
原理还是相同的,可以使用下面的图片解释:

现在需要使用投影数学。如果投影间隔没有相交,将速度投影到分离轴上,并计算两个间隔的碰撞时间。
 
相对于静态分离轴算法,我们需要测试一个扩展的轴。显然这个是速度矢量轴。
 
那么我们现在有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的相对速度。
 
求解碰撞平面的算法与MTD非常相似。只是碰撞将优于交叠,如果检测到未来的碰撞,将选择最新的一个。
 
如果没有发现碰撞并且只检测到了交叠,那么就像以前一样,选择交叠最小的那个轴。
 
碰撞检测函数将返回碰撞的法向,还有碰撞的深度(负值)和碰撞时间(正值)之一。最后的伪代码如下…
 

bool Collide(   const Vector* A, int Anum,
                const Vector* B, int Bnum,
                const Vector& xOffset, const Vector& xVel,
                Vector& N, float& t)
{
    if (!A || !B) return false;
      
    // All the separation axes
    // note : a maximum of 32 vertices per poly is supported
    Vector xAxis[64];
    float taxis[64];
    int iNumAxes=0;

    xAxis[iNumAxes] = Vector(-xVel.y, xVel.x);
    float fVel2 = xVel * xVel;
    if (fVel2 > 0.00001f)
    {
        if (!IntervalIntersect( A, Anum, B, Bnum, xAxis[iNumAxes], xOffset, xVel, taxis[iNumAxes], t))
            return false;
        iNumAxes++;
    }

    // test separation axes of A
    for(int j = Anum-1, i = 0; i < Anum; j = i, i ++)
    {
        Vector E0 = A[j];
        Vector E1 = A[i];
        Vector E = E1 - E0;
        xAxis[iNumAxes] = Vector(-E.y, E.x);
       
        if (!IntervalIntersect( A, Anum, B, Bnum, xAxis[iNumAxes], xOffset, xVel, taxis[iNumAxes], t))
            return false;

        iNumAxes++;
    }

    // test separation axes of B
    for(int j = Bnum-1, i = 0; i < Bnum; j = i, i ++)
    {
        Vector E0 = B[j];
        Vector E1 = B[i];
        Vector E = E1 - E0;
        xAxis[iNumAxes] = Vector(-E.y, E.x);

        if (!IntervalIntersect( A, Anum, B, Bnum, xAxis[iNumAxes], xOffset, xVel, taxis[iNumAxes], t))
            return false;
        iNumAxes++;
    }
   
    if (!FindMTD(xAxis, taxis, iNumAxes, N, t))
        return false;

    // make sure the polygons gets pushed away from each other.
    if (N * xOffset < 0.0f)
        N = -N;

    return true;
}

bool AxisSeparatePolygons ( Vector N, Polygon A, Polygon B, Vector Offset, Vector Vel, float &t, float tmax)
{
    float min0, max0;
    float min1, max1;

    CalculateInterval(N, A, min0, max0);
    CalculateInterval(N, B, min1, max1);
   
    float h = Offset dot N;
    min0 += h;
    max0 += h;

    float d0 = min0 - max1; // if overlapped, do < 0
    float d1 = min1 - max0; // if overlapped, d1 > 0

    // separated, test dynamic intervals
    if (d0 > 0.0f || d1 > 0.0f)
    {
        float v = Vel dot N;

        // small velocity, so only the overlap test will be relevant.
        if (fabs(v) < 0.0000001f)
            return false;

        float t0 =-d0 / v; // time of impact to d0 reaches 0
        float t1 = d1 / v; // time of impact to d0 reaches 1
        // sort the times.
        if (t0 > t1)
        {
            float temp = t0;
            t0 = t1;
            t1 = temp;
        }
        // take the minimum positive
        taxis = (t0 > 0.0f)? t0 : t1;

        // intersection time too late or back in time, no collision
        if (taxis < 0.0f || taxis > tmax)
            return true;

        return false;
    }
    else
    {
        // overlap. get the interval, as a the smallest of |d0| and |d1|
        // return negative number to mark it as an overlap
        taxis = (d0 > d1)? d0 : d1;
        return false;
    }
}


bool FindCollisionPlane (Vector* Axis, float* taxis, int iNumAxes, Vector& Ncoll, float& tcoll)
{
    // find collision first
    int mini = -1;
    tcoll = 0.0f;
    for(int i = 0; i < iNumAxes; i ++)
    {
        if (taxis[i] > 0.0f)
        {
            if (taxis[i] > tcoll)
            {
                mini = i;
                tcoll = taxis[i];
                Ncoll = Axis[i];
                Ncoll.Normalise(); // normalise axis
            }
        }
    }

    // found a collision
    if (mini != -1)
        return true;

    // nope, find overlaps
    mini = -1;
    for(int i = 0; i < iNumAxes; i ++)
    {
        float n = Axis[i].Normalise(); // axis length

        taxis[i] /= n; // normalise interval overlap too

        // remember, those numbers are negative, so take the closest to 0
        if (mini == -1 || taxis[i] > tcoll)
        {
            mini = i;
            tcoll = taxis[i];
            Ncoll = Axis[i];
        }
    }
   
    return (mini != -1);
}

现在,你拥有了一个可以检测未来碰撞的的检测系统,或者当重叠的时候,返回碰撞平面和碰撞深度/时间
 
游戏开发实战:用Sutherland-Hodgman算法实现2D角色碰撞检测(附完整代码) 本文深入探讨了在2D游戏开发中,如何应用Sutherland-Hodgman算法实现高精度的多边形角色碰撞检测。通过对比传统AABB方法的局限,详细解析了该算法的核心思想与逐边裁剪策略,并提供了完整的Unity(C#)和Cocos2d-x(C++)实战代码,帮助开发者彻底解决角色“穿模”问题,获取精确的碰撞区域信息以支持复杂的物理响应。 阅读详情

相关推荐

二维多边形碰撞检测

有关多边形碰撞检测的文章。 可用于在2D游戏中实现小精灵之间的碰撞。 该算法还可以扩展到3D。

推荐开源项目:p5.collide2D - 简化2D碰撞检测的神器

推荐开源项目:p5.collide2D - 简化2D碰撞检测的神器 项目地址:https://gitcode.com/gh_mirrors/p5/p5.collide2D 项目简介 是一个基于 p5.js 的扩展库,它为开发者提供了强大而易用的2D碰撞检测功能。如果你在使用p5.js进行游戏开发、交互式设计或者任何需要检测图形之间碰撞的项目,那么p5.collide2D将会是一个极好的工具。 技术...

gitblog_00030的博客 654

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

本教程包括算法讲解,代码示例和基于OpenGL的算法演示。从最基础的两个多边形碰撞检测到后来的大量物体碰撞的真实物理模拟。

Unity技巧—— 利用Polygon Collider 2D多边形碰撞器实体化 2D 游戏世界地形

 在 2D 游戏开发领域,Unity 是一款被广泛使用且功能强大的游戏引擎。创建一个逼真且互动性强的游戏世界地形是游戏开发中的重要环节。多边形碰撞器(Polygon Collider 2D)作为 Unity 中用于处理 2D 碰撞检测的组件之一,在实体化游戏世界地形方面发挥着关键作用。本文将详细介绍在 Unity 2023 中,如何利用多边形碰撞器来实现这一目标。

徽程22级的在读学生 2468

2D和3D的碰撞检测库ncollide.zip

ncollide 是 Rust 语言实现的 2D 和 3D 的碰撞检测库。示例代码:let cylinder = Cylinder::new(0.5f32, 1.0); assert!(cylinder.half_height() == 0.5); assert!(cylinder.radius() == 1.0); 标签:ncollide

逆向CarPlay协议时,除了USB主从切换,你还需要注意这3个关键点

本文深入探讨逆向CarPlay协议时的3个关键点,包括MFi协议背景、多通道协同工作机制和协议分析工具的高级过滤技巧。特别解析了USB主从切换后的复杂交互过程,帮助安全研究员和逆向工程师更好地理解CarPlay协议的核心机制与潜在安全研究切入点。

weixin_29164497的博客 381

2D游戏中常见的碰撞检测算法思路(附详细思路及部分源码)

2D游戏中常见的碰撞检测算法思路 点与点的碰撞检测 只需判断两个点的x,y坐标是不是相等 点与线的碰撞检测 直线:判断点的坐标是否在这个直线方程中;点到直线的距离为0 线段:点到线段的距离为0; 点和线段构成的三角形面积为0; 点到线段一个端点的斜率与线段斜率相等; 点到线段两个端点的距离和等于线段长度 点与矩形,凸多边形的碰撞检测 过点做一条水平线,判段直线与矩形边的交点数,根据点的左右两边与交点数的奇偶性判断, 奇数说明点在矩形内,偶数说明在矩形外。 特殊情况:点在矩形的边上

Super_killer_lx的博客 1万+

Yolov2 训练时anchor是如何使用的?build_target

0.简略描述 1.将真值检测框变换到特征图尺度上 2.计算以特征图每个网格中心为中心点时所有锚框与真值检测框的交并比 3.取与真值检测框交并比最大的锚框的id,及真值检测框中心所在cell的id,有此,可将真值检测框与预测结果对应起来 4.计算位置回归损失,置信度损失,分类损失 1,网络的输出 图1 yolov2 网络对于检测框位置大小的输出是: 对于1个batch网络的输出的shape为[batch_size, H*W*num_anchors, 5+num_classes], 其中: num_

机器人视觉感知 2816

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

简介 本文是阐述如何在2D动作游戏中进行精确而高效的碰撞检测。这里的碰撞是基于多边形而不是基于精灵的。这两者之间在设计上会有不同。 基于精灵的碰撞检测是通过精灵之间的重叠的像素来完成的。而多边形使用向量数学来精确计算交点,时间和碰撞方向。虽然多边形仅仅是精灵的一个近似,但是它比精灵系统要高级。 可以精确模拟逼真的简单物理学,例如反弹,摩擦,斜面的滑行 碰撞检测可以更精确的用于高速精...

绿洲de圣光 275

别再为EPI形变头疼了!FSL的topup+eddy实战保姆级教程(含AP/PA数据采集要点)

本文详细介绍了如何使用FSL的topup和eddy工具解决EPI形变问题,包括数据采集要点、参数设置和实战操作步骤。通过AP/PA双编码数据和精确的形变场估计,有效矫正MRI图像中的几何畸变,提升弥散数据质量。特别适合需要处理高场强MRI数据的研究人员和技术人员。

weixin_28725949的博客 399

【首份】2023年30米分辨率土地利用遥感监测数据

为了恢复和重建我国土地利用变化的现代过程,更好地预测、预报土地利用变化趋势,地球资源数据云以美国陆地卫星Landsat 遥感影像数据作为主信息源,结合Sentinel系列数据,通过人工目视解译和机器学习方法,建立了国家尺度1:10 万比例尺多时期土地利用/土地覆盖遥感监测数据库(CNLUCC)因早期Landsat数据时空覆盖缺失,1972-1977年合成第一期数据,1978-1985年合成第二期数据,1986年起每年度生成一期数据。投影:Albers正轴等面积双标准纬线圆锥投影南标准纬线:25°N。

地球资源数据云的官方博客 3676

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

http://yiyo213.iteye.com/blog/813181    简介 本文是阐述如何在2D动作游戏中进行精确而高效的碰撞检测。这里的碰撞是基于多边形而不是基于精灵的。这两者之间在设计上会有不同。 基于精灵的碰撞检测是通过精灵之间的重叠的像素来完成的。而多边形使用向量数学来精确计算交点,时间和碰撞方向。虽然多边形仅仅是精灵的一个近似,但是它比精灵系统要高级。 可以精

hintonic的专栏 2259

深度学习模型设计的方法和技巧

设计神经网络模型是一个迭代的过程,需要不断试验和调整各个组成部分,以达到最佳性能。同时,遵循良好的工程实践,如模块化设计、版本控制、文档记录等,也是成功的关键。

xw555666的博客 4027

碰撞检测和响应

碰撞检测和响应类型:整理 | 来自:86VR | 作者:项周臻 | 时间:2005-1-24 |  点击:2065  碰撞在游戏中运用的是非常广泛的,运用理论实现的碰撞,再加上一些小技巧,可以让碰撞检测做得非常精确,效率也非常高。从而增加游戏的功能和可玩性。2D碰撞检测  2D的碰撞检测已经非常稳定

1659

LangChain学习及应用(超详细)

Model I/O 部分是与语言模型进行交互的核心组件,包括输入提示(Prompt Template)、调用模型(Model)、输出解析(Output Parser)。简单来说,就是输入、处理、输出这三个步骤。LLM 因其具有海量参数,需要花费相当的物力与时间成本进行预训练和微调,同时商用 LLM 还需要进行各种安全测试与风险评估等。因此 LLM 会存在知识滞后的问题。在专有领域,LLM 无法学习到所有的专业知识细节,因此在面向专业领域知识的提问时,无法给出可靠准确的回答。

weixin_39764056的博客 4245

SAP Fiori Launchpad 上看不到任何 tile 应该怎么办?

中心UI组件是一个框架,为所有SAPFiori应用程序提供公共基础设施SAPFiorilaunchpad是所有SAPFioriUI的基础,并为SAPFiori应用程序提供基本功能,如登录,界面大小,应用程序之间的导航,和基于角色的应用程序目录。ABAP前端服务器包含所有基础设施组件,用于为客户端生成SAPFiori应用程序特定的UI,并与SAPBusinessSuite后端系统通信。SAPFiori应用程序的处理过程如下首先,客户端加载SAPFiori应用程序的界面。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 941

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

为了不浪费时间介绍动态刚体,可以直接参参见下面的连接: http://www.d6.com/users/checker/dynamics.htm#articles 这里,展示了如何在2D游戏中实施真实的物理。 我将介绍一些我所做的扩展,首先,计算给定凸多边形的惯量是有技巧的。需要提醒你的是,惯量适用于角度变化,质量适用于线形变化。较高的惯量对应于较大的质量,在这种情况下物体将很难旋...

绿洲de圣光 195

2026年广东省职业院校技能大赛中职组“大数据应用与服务”样题一完整参考答案

2026年广东省职业院校技能大赛中职组“大数据应用与服务”样题一完整参考答案

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 743

NAppGUI geom2d几何库实战:为游戏和应用添加高效的2D碰撞检测

想让自己的游戏角色撞墙反弹、让拖拽的图标在界面上精准"停靠"、让导弹命中目标时触发爆炸?这一切都离不开**2D碰撞检测**。NAppGUI 是一个用纯 ANSI-C 编写的跨平台桌面应用 SDK(支持 Windows、macOS、Linux),它的 **geom2d 几何库**内置了一整套高效、开箱即用的 2D 碰撞检测算法,从点、线段、圆形到多边形,几乎覆盖了游戏与图形应用所需的全部碰撞场景。本

gitblog_00867的博客 721

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

NETTE DE BLOG 2975

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

 五、处理旋转在许多游戏中都可以发现一些旋转的物体。与它们的碰撞会有一点复杂。旋转精灵的标准做法是通过一个简单的角度,通常的区间是[0,2*PI]。可以使用矩阵来存贮三角操作,因此一个角度可以被转化为2*2的矩阵 一个简单的处理旋转物体碰撞的方法是保存一个原始多边形的副本,并将其转化到当前位置和角度。这是非常简单的,因此我决定详细描述并给出一个通用的碰撞检测系统,这个系统同样可以用

NETTE DE BLOG 2934

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Arcade碰撞检测算法:从简单矩形到复杂多边形

Arcade是一款简单易用的Python 2D游戏开发库,提供了全面的碰撞检测解决方案,帮助开发者轻松实现游戏对象间的交互逻辑。从基础的矩形边界检测到复杂的多边形碰撞,Arcade的碰撞检测系统兼顾了性能与准确性,适合从入门开发者到专业游戏创作者的各种需求。 ## 碰撞检测基础:为什么它对游戏至关重要? 在2D游戏开发中,碰撞检测是实现玩家与环境、敌人与道具交互的核心技术。无论是角色收集金币、

gitblog_01145的博客 1009

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

二、用于碰撞响应的扩展分离坐标轴方法检测多边形相交是非常有用的方法,但是可以做更多的事情。当多边形相交时,我想将他们移开以避免他们相交。 分离轴的方法可以非常好的用于这种情况,但是还需要作一些额外的工作。必须返回相交的深度,和推开多边形将它们分离的方向。相交的深度和方向的组合称为MTD,或者最小平移距离。这是用于将物体分离的的最小向量。 为了计算MTD,我们可以使用分离坐标轴。

NETTE DE BLOG 4304
上一篇: 基于2D多边形的碰撞检测和响应(二)
下一篇: 基于2D多边形的碰撞检测和响应(四)
nette
博客等级 码龄20年 61粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值