分离轴定理及向量应用

使用分离轴定理对多边形进行碰撞检测 分离轴定理(SAT,Separating Axis Theorem)进行二维多边形碰撞检测是一种常见且有效的方法,用于二维多边形碰撞检测的基本思想是:如果两个凸多边形不相交,那么存在一条轴(线),使得这条轴上的投影会使两个多边形的投影不重叠。换句话说,如果我们找到一条轴,使得两个多边形在这条轴上的投影不重叠,那么我们可以确定两个多边形不会相交。 阅读详情

分离轴定理及向量应用

通过判断任意两个 凸多边形 在任意角度下的投影是否均存在重叠,来判断是否发生碰撞。若在某一角度光源下,两物体的投影存在间隙,则为不碰撞,否则为发生碰撞。

算法简述1

从根本上来讲,分离轴定理(以及其他碰撞算法)的用途就是去检测并判断两个图形之间是否有间隙。分离轴定理中用到的方法使算法本身显得十分独特。
我所听到过分离轴定理的最好类比方式是这样的:
假想你拿一个电筒从不同的角度照射到两个图形上,那么会有怎样的一系列的阴影投射到它们之后的墙壁上呢?
在这里插入图片描述
如果你用这个方式从每一个角度上对这两个图形进行处理,并都找不到任何的间隙,那么这两个图形就一定接触。如果你找到了一个间隙,那么这两个图形就显而易见地没有接触。
从编程的角度来讲,从每个可能的角度上去检测会使处理变得十分密集。不过幸运的是,由于多边形的性质,你只需要检测其中几个关键的角度。
你需要检测的角度数量就正是这个多边形的边数。也就是说,你所需检测的角度最大数量就是你要检测碰撞的两个多边形边数之和。举个例子,两个五边形就需要检测10个角度。
在这里插入图片描述

代码实现2

原理很容易理解,这个算法的关键在于,如何找到这条轴。 在2D的情况下,两个多边形每条边的法向量包含了这条轴的所有可能性。所以我们只需要枚举两个多边形的每条边的法向量即可。
2D向量的法向量非常好求 向量(X,Y)的法向量为(Y,-X)或(-Y,X),这个算法不需要考虑方向,所以任选一种即可。
然后分别计算这两个多边形的所有点在此向量上的投影,并分别求出最大最小区域,如果没有重合,那么直接确定这两个多边形不重合,如果有重合,那么继续判断下一条边的法向量。

举例分析3

以下图为例:
图片来自 知乎 mmtest012
图片引用自 知乎《 向量应用 分离轴定理》@mmtest012
以边1为例进行分析如下:
在这里插入图片描述
图片引用自 知乎《 向量应用 分离轴定理》@mmtest012
为了易于理解,示例图将坐标轴原点(0,0)放置于三角形边1投影轴的适当位置。

具体步骤:

1、首先根据1边的两个端点计算1边向量,进一步求出1边的法向量。( 向量(X,Y)的法向量为(Y,-X)或(-Y,X));

2、得到向量在投影轴上的长度:向量的点积的其中一个几何含义是:一个向量在平行于另一个向量方向上的投影的数值乘积。由于投影轴是单位向量(长度为1),投影的长度为 x1 * x2 + y1 * y2;

3、循环获取第一个多边形的每个点,并将它们投影到这个轴上(记录这个多边形投影到轴上的最高和最低点,形成一个投影线段);

4、分别得到这两个多边形在这个轴上的投影,并检测这两段投影是否发生重叠;

5、如果你发现了这两个投影到轴上的“阴影”有间隙,那么这两个图形一定没有相交。
如果没有间隙,它们仍有接触的可能,你需要继续检测直到把两个多边形的每条边都检测完。
如果你检测完每条边后,都没有发现任何间隙,那么它们是相互碰撞的。

这个算法基本就是如此的。

(顺带提一下,如果你记录了哪个轴上的投影重叠值最小(以及重叠了多少),那么你就能用这个值来分开这两个图形。)

参考资料


  1. @sevenson的文章Separating Axis Theorem (SAT) Explanation ↩︎

  2. 分离轴定理 解决 多边形碰撞 问题 ↩︎

  3. 向量应用 分离轴定理 ↩︎

Planning-碰撞检测之分离轴定理(SAT) 原文:dyn4j-SAT (Separating Axis Theorem) 目录1. 原理2. 分离轴3. 凸多边形在分离轴的投影4. 计算**MTVMTVMTV** sat(分离轴定理)用来检测两个凸多边形是否相交,也可以用于检测点是否在凸多边形内。凸多边形内的点的连线上的点都在凸多边形内,或者连线只和图多边形相交两次(边界处)。 1. 原理 如果凸多边形在某个轴上的投影不重叠,则两个凸多边形不相交。需要对所有的轴(每个边的法向量)进行投影,存在一个轴上的投影不相交,则两个凸多边形不相交。如果所有. 阅读详情

相关推荐

游戏开发实战:如何用分离轴定理(SAT)实现2D碰撞检测(附完整代码)

本文详细介绍了在2D游戏开发中如何使用分离轴定理(SAT)实现高效的碰撞检测,包括核心原理、工程实现、最小平移向量(MTV)计算及性能优化技巧。通过Unity和Godot的实战代码示例,帮助开发者快速掌握SAT算法在游戏物理引擎中的应用,提升碰撞检测的精确性和效率。

weixin_30500105的博客 575

SAT(Separating Axis Theorem)翻译

此文章为翻译文章。 发表这是我一直想写的一篇文章,但我一直没有抽出时间来做。首先我要说的是,网络上有大量关于这种特殊碰撞检测算法的资料。但是,在解释一些实现细节时,这些资源通常是模糊的(针对我们的目的)。我计划解释算法,并填补我自己实现时的一些空白。该具有交互式flash示例,可供参考。

ck_Leo_Libra的博客 2975

OBB碰撞检测实战:从AABB升级到分离轴定理的完整指南

在3D交互与物理仿真中,碰撞检测是基础而关键的技术。轴对齐包围盒(AABB)虽简单高效,但物体旋转时包围盒膨胀导致精度下降。方向包围盒(OBB)通过跟随物体旋转,结合分离轴定理(SAT),实现了高精度碰撞检测。OBB在游戏开发、物理引擎、射线拾取等场景中价值显著,尤其适合旋转物体和精细检测需求。本文深入解析OBB数学原理、SAT算法实现,并提供可运行代码与实战避坑指南,助你掌握从AABB到OBB的升级之路。

weixin_32019949的博客 200

分离轴定理:凸多边形相交检测算法

分离轴定理(eperatingxisheorem)是一种确定两个凸多边形是否相交的方法。该算法还可用于查找最小穿透向量,这对于物理模拟和许多其他应用非常有用。SAT 是一种快速通用算法,可以消除对每个形状类型对进行碰撞检测代码的需求,从而减少代码和维护。

新缸中之脑 4087

【运动规划算法项目实战】如何使用分离轴定理算法实现碰撞检测(附ROS C++代码)

在自动驾驶和机器人领域中,安全性和性能都是至关重要的。随着自动驾驶和机器人应用越来越广泛,对于它们与周围环境和其他物体之间的位置和相互作用的计算,碰撞检测变得愈发重要。如果机器人或车辆与其他物体重叠在一起,那么就可能发生碰撞,这会对机器人和车辆以及周围的人造成伤害。因此,开发一种可靠的碰撞检测算法是必不可少的。分离轴定理(Separating Axis Theorem,简称SAT)是一种常用的碰撞检测算法,可以用于检测任何形状的物体之间的碰撞。

xiewf的博客 5825

使用Dify打造视频生成工作流:从提示词到视频的完整指南

Dify作为开源LLM应用开发平台,通过可视化工作流编排实现从文本到视频的端到端生成,将创意周期从天级缩短至分钟级。核心流程包括提示词工程、视频API调用、存储分发和结果反馈。

牛奶夹心巧克力 3435

碰撞检测之分离轴定理算法讲解

本文翻译自@sevenson的文章Separating Axis Theorem (SAT) Explanation 。原文作者用的是ActionScript 3来编写算法,不过文中主要讲述的还是算法原理,我想一旦算法原理被我们掌握了,选择什么编程语言来实现算法都是次要的事情了。 本人并非英文专业,所以文中翻译得有不妥或疏漏之处,欢迎各位指正,谢谢!正文如下:分离轴定理(英文简称SAT)是一项用于

Yorhom's Game Box 3万+

window下迁移SVN仓库到新的windows服务器

window下迁移SVN仓库到新的windows服务器

Bertram的博客 4692

向量遍历_向量应用 分离轴定理

分离轴定理(Separating Axis Theorem)概念:通过判断任意两个 凸多边形 在任意角度下的投影是否均存在重叠,来判断是否发生碰撞。若在某一角度光源下,两物体的投影存在间隙,则为不碰撞,否则为发生碰撞。注意:分离轴定理只适合凸多边形,所以如果是凹多边形的话需要转换成多个凸多边形,具体转换算法参考git上https://github.com/schteppe/poly-decomp....

weixin_29988441的博客 239

Windows下PaddleOCR GPU版环境搭建全攻略(含CUDA 11.7避坑指南)

本文提供了一份详尽的Windows平台PaddleOCR GPU版环境搭建指南,重点涵盖CUDA 11.7与cuDNN的版本匹配、环境变量配置及常见避坑方法。通过使用Conda创建虚拟环境并安装匹配的PaddlePaddle-gpu版本,最终实现GPU加速的OCR推理,帮助开发者构建稳定高效的开发环境。

docker7nomad的博客 751

金融数据自动化:从同花顺API到Excel的智能转换之旅

本文详细介绍了如何利用同花顺API实现金融数据自动化处理,并将其智能转换为Excel格式的全流程。通过Python编程和Excel高级技巧,读者可以掌握从数据获取、清洗到输出的完整解决方案,大幅提升金融数据分析的效率和准确性。文章特别强调了同花顺API的使用技巧和Excel自动化输出的最佳实践。

sql99的博客 462

上下两个x轴_向量应用 分离轴定理

分离轴定理(Separating Axis Theorem)概念:通过判断任意两个 凸多边形 在任意角度下的投影是否均存在重叠,来判断是否发生碰撞。若在某一角度光源下,两物体的投影存在间隙,则为不碰撞,否则为发生碰撞。注意:分离轴定理只适合凸多边形,所以如果是凹多边形的话需要转换成多个凸多边形,具体转换算法参考git上https://github.com/schteppe/poly-decomp....

weixin_39605345的博客 344

YOLO11 锚框机制全解析:从改进 K-means 聚类到自适应优化,附多场景实战(附代码)

摘要 YOLO11的锚框机制采用"自适应、动态化、场景感知"的设计理念,通过数据驱动的锚框生成、多尺度感知分配和实时优化策略,显著提升目标检测性能。相较于早期YOLO版本,YOLO11的锚框完全基于训练集目标分布自适应生成,并引入智能分配策略,使不同尺寸目标获得最优匹配。技术架构包含自适应锚框生成、多尺度分配器和动态优化模块,通过改进的K-means聚类和交并比计算实现精准匹配。YOLO11锚框机制在检测精度、训练稳定性和场景适应性方面均有显著提升,为复杂场景下的目标检测提供更优解决方案

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1319

碰撞检测之分离轴测试(Separate Axis Testing)

分离轴测试(Separate Axis Testing)是空间碰撞检测中一个很常用、很有效的判断方法。它的原理来源于集合分析中的“分离超平面定理”(separating hyper-plane theorem):如果两个集合A和B不相交,那么必定存在一个分离超平面P,并使得A和B分别位于P的不相同的两侧。此定理对于空间数据中的凸集合和凹集合均适用。当数据集是凸集时这里的分离超平面就是一个空间的

BugRunner的专栏 6918

Qt和FFmpeg的视频压缩工具

m_progressDialog = new QProgressDialog("正在压缩视频...", "取消", 0, 100, parent);QString file = QFileDialog::getOpenFileName(this, "选择视频文件", "",QString file = QFileDialog::getSaveFileName(this, "保存压缩文件", "",QMessageBox::warning(parent, "错误", "请设置输入和输出文件路径");

寒寒豆豆软件公司的博客 103

LDRA Testbed软件静态分析_常见问题及处理

通过前面的几篇文章,LDRA Testbed软件静态分析的内容基本讲解完了,本篇文章将针对使用Testbed进行软件静态分析的常见问题进行介绍。 到此为止,LDRA Testbed软件静态分析的内容已经全部讲完,如果有问题,欢迎私信提问(不经常登录,回复可能不及时,见谅)。下一篇文章将开始讲解如何使用Testbed进行单元测试。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 2589

分离轴定理的几何之美:从数学原理到可视化理解

本文深入解析分离轴定理(SAT)在碰撞检测中的几何原理与实现方法,涵盖凸多边形特性、投影计算及算法优化。通过可视化案例和代码示例,帮助开发者理解SAT在游戏开发和计算机图形学中的高效应用,提升碰撞检测的精确性与性能。

pepsi的博客 1091

28、沉浸式体验技术:概念、类型与应用

本文全面介绍了沉浸式体验技术的概念、类型与应用。从双边滤波器的图像处理原理切入,系统阐述了VR、AR、MR、ER及数字孪生等核心技术的特点与区别,并通过丰富案例展示了其在商业、医疗、教育、旅游、房地产、物流等多个领域的实际应用。文章还分析了技术融合趋势、硬件升级方向、应用场景拓展潜力,同时探讨了数据处理、网络延迟、隐私安全等挑战及应对策略,最后以流程图和对比表格总结技术发展脉络,展望沉浸式技术推动社会进步的广阔前景。

wind6的博客 380

SAT分离轴--判断两个形状是否相交给出MTV

简介:分离轴理论,简称SAT(Separating AxisTheorem),是一个判断两个凸多边形是否碰撞的理论。此理论可以用于找到最小的渗透向量(感觉应该是模最小的),此向量在物理模拟和其他很多应用中很有用。SAT是一种高效的算法,能够出去每种形状对(譬如 圆和圆 圆和多边形 多边形和线段)对碰撞检测代码的需求从而减少代码减轻维护压力。 凸多边形: SAT 就像以前说过的一样,是一个检测两

河道一血不如床上一血 2135

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VC中sqlite的使用

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

分离轴定理SAT凸多边形精确碰撞检测

SeparatingAxisTheorem,缩写SAT,中文为或,通过判断凸多边形在分离轴上的投影是否重叠来判断是否发生碰撞。所谓的分离轴实际上是一个方向轴,该轴的选取在二维平面情况下一般为。分离轴定理仅适用于凸多边形,不能用于凹多边形。但可以通过转化的方法,即将凹多边形转化为多个凸多边形,然后对多个凸多边形分别使用SAT,达到精确碰撞检测的目的。...

CairBin的博客 1461

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【原理】[窄相检测]SAT解决‌凸多边形间的精确[碰撞检测]

分离轴定理(SAT)是游戏物理中用于凸多边形碰撞检测的高效算法,通过寻找能将两物体投影分离的轴线来判断碰撞。它适用于复杂几何形状,计算效率为O(n²),但仅限凸多边形。算法核心步骤包括计算法向量、投影检测和区间重叠判断。专栏提供了2D和3D的C#实现示例,展示了如何检测多边形投影重叠。SAT广泛应用于游戏开发、物理模拟和机器人导航等领域,是游戏物理引擎中精细碰撞检测的常用方法。

设计 AI 玩游戏🎮 978

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

从游戏开发实战看分离轴定理:如何优化碰撞检测性能

本文深入探讨分离轴定理(SAT)在游戏开发中的实战应用与性能优化技巧。SAT作为一种高效的凸多边形碰撞检测算法,通过早期退出机制和精确投影计算,显著提升游戏物理引擎性能。文章详细解析了SAT的核心原理、实现步骤及高级应用,包括凹多边形处理和连续碰撞检测,为开发者提供全面的优化方案。

pandas7gardener的博客 97

分离轴定理(SAT)的5个常见误区:为什么你的碰撞检测总是不准确?

本文深入探讨分离轴定理(SAT)在碰撞检测中的5个常见误区,包括MTV方向错误、非凸多边形误用、法向量归一化时机、浮点误差处理及动态碰撞检测问题。通过代码示例和实用技巧,帮助开发者避免这些陷阱,提升碰撞检测的准确性和性能。

weixin_29214691的博客 160

16.Direct2D 捕鱼游戏开发-检查对象colVec.h的封装

环境: 编辑器:VS2015 系统:win10 专业版 碰撞:aabb obb盒模型(obb采用分离轴进行判断) 渲染:direct2d 检测对象说明: 我们这个检测对象只是提供一个对碰撞检测的方法和一些算法的方法并不提供实体什么的物理算法具体的物理算法我们是根据不同游戏进行不同的处理(但是碰撞检测是都是一样的) 相关概念: 向量:有方向的数量(向量A(x1,y1),原点B(0,0...

baidu_38766085的博客 485

H5游戏开发之多边形碰撞检测

2D多边形碰撞检测介绍这是一篇论证如何在2D动作游戏中执行碰撞检测的文章(Mario,宇宙入侵者等),为了保证它的高效性和精确性,碰撞检测是以多边形为基础的,而不是以sprite为基础。这是两种不同的设计途径。基于sprite的检测执行的是检测sprites的像素的交叉,以这种方式来检测碰撞。多边形是使用向量数学来精确的计算点,时间和碰撞的方向。当多边形只是一种近似sprite自身的时候...

399

线性代数在游戏碰撞检测中的大魔法——“谁撞谁了”背后的向量世界

游戏里的碰撞,不只是“碰一碰”,而是背后空间数学的判断力;向量、投影、点乘,把一切物体关系转化为可判定、可操作的数据;线性代数给了游戏代码“空间眼睛”,让自动判定“谁撞谁了”变得准确高效;不管你做简单小游戏还是大型物理模拟,线性代数是必会技能,是游戏开发之基石;只要你掌握了向量投影和相关判定技巧,你的游戏就能精准实现所有互动和反馈——这就是线性代数在游戏碰撞检测中无处不至的强大力量!——

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 547
上一篇: C++_vector操作
下一篇: matlab突然打不开的解决办法
Nine_CC
博客等级 码龄9年 83粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值