碰撞检测算法——分离轴算法在Unity中实现(二)
一、介绍
分离轴算法(简称SAT)通常用于检查两个简单多边形(凸边形)之间或多边形与圆之间的碰撞。本质上,如果您能够绘制一条线来分隔两个多边形,则它们不会发生碰撞,如果找不到一条线来分割两个多边形,则它们发生碰撞。
如图:

具体做法是遍历两个多边形的所有边,求得每条边的法向轴,再求出每个多边形在法向轴上的投影,求出投影的最大值点和最小值点,通过比较两个多边形的最值点的关系得出是否碰撞。
演示:







运行代码:
获取在法向轴上投影的函数:
public void ProjectPolygon(Vector2 axis, Polygon polygon, ref float min, ref float max)
{//要在轴上投影一个点,使用点积float dotProduct = Vector2.Dot(axis, polygon.Points[0]);min = dotProduct;max = dotProduct;for (int i = 0; i < polygon.Points.Count; i++){dotProduct = Vector2.Dot(polygon.Points[i], axis);if (dotProduct < min){min = dotProduct;}else{if (dotProduct > max){max = dotProduct;}}}
}
判断是否相交函数:、
public float IntervalDistance(float minA, float maxA, float minB, float maxB){if (minA < minB){return minB - maxA;}else{return minA - maxB;}}
检测函数:
public bool CollisionDetection(Polygon polygonA, Polygon polygonB){int edgeCountA = polygonA.Edges.Count;int edgeCountB = polygonB.Edges.Count;Vector2 edge;// 循环遍历两个多边形的所有边for (int edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB; edgeIndex++){if (edgeIndex < edgeCountA){edge = polygonA.Edges[edgeIndex];}else{edge = polygonB.Edges[edgeIndex - edgeCountA];}//查找多边形当前是否相交// 找出垂直于当前边的轴Vector2 axis = new Vector2(-edge.y, edge.x);axis.Normalize();// 求多边形在当前轴上的投影float minA = 0; float minB = 0; float maxA = 0; float maxB = 0;ProjectPolygon(axis, polygonA, ref minA, ref maxA);ProjectPolygon(axis, polygonB, ref minB, ref maxB);// 检查多边形投影当前是否相交if (IntervalDistance(minA, maxA, minB, maxB) > 0)return false;}return true;}
结果演示:
碰撞检测算法-分离轴算法
参考链接:
https://code.tutsplus.com/collision-detection-using-the-separating-axis-theorem--gamedev-169t
How 2D Game Collision Works (Separating Axis Theorem) - YouTube
Collision Detection with SAT (Math for Game Developers) - YouTube
相关文章:
碰撞检测算法——分离轴算法在Unity中实现(二)
一、介绍 分离轴算法(简称SAT)通常用于检查两个简单多边形(凸边形)之间或多边形与圆之间的碰撞。本质上,如果您能够绘制一条线来分隔两个多边形,则它们不会发生碰撞,如果找不到一条线来分割两个…...
04在命令行中使用Maven命令创建Maven版的Web工程,并将工程部署到服务器的步骤
创建Maven版的Web工程 使用命令生成Web工程 使用mvn archetype:generate命令生成Web工程时,需要使用一个专门生成Web工程骨架的archetype(参照官网看到它的用法) -D表示后面要附加命令的参数,字母D和后面的参数是紧挨着的,中间没有任何其它…...
什么是指标体系,怎么搭建一套完整的指标体系?(附PDF素材)
什么是指标体系,怎么搭建一套完整的指标体系?数字化转型过程中,这个问题一直困扰着数据分析师。主要体现在: 各部门根据业务需求,都有一部分量化指标,但不够全面,对企业整体数据分析应用能力提…...
Windows提权方法论
Windows提权方法论 1.溢出漏洞提权2.计划任务提权3.SAM文件提权4.启动项提权5.不带引号的服务路径提权 1.溢出漏洞提权 溢出提权攻击的基本原理是,通过向目标系统发送过长的输入数据,超出了程序所分配的缓冲区大小,导致溢出。攻击者可以利用…...
推荐系统领域,over-uniform和oversmoothing问题
在推荐系统领域,“over-uniform” 和 “oversmoothing” 是与模型性能和推荐结果相关的两个概念,它们通常用于描述模型的行为和性能问题。以下是它们的区别: Over-Uniform(过于一致): Over-Uniform 推荐系…...
360测试开发技术面试题目
最近面试了360测试开发的职位,将面试题整理出来分享~ 一、java方面 1、java重载和重写的区别 重载overloading 多个方法、相同的名字,不同的参数 重写overwrite 子类继承父类,对方法进行重写 2、java封装的特性 可以改变内部实现,…...
智能井盖传感器扣好“城市纽扣”,让市民脚下更有安全感
随着城市化进程的快速推进,城市基础设施的维护和管理面临着日益严峻的挑战。作为城市生命线的重要组成部分,城市井盖在保障城市安全和稳定运行方面具有举足轻重的地位。然而,日益繁重的城市交通压力使得井盖的维护和管理问题逐渐显现。 城市井…...
1 随机事件与概率
首先声明【这个括号内的都是批注】 文章目录 1 古典概型求概率1.1 随机分配问题【放球】例子 1.2 简单随机抽样问题【取球】例子 2 几何概型求概率例子 3 重要公式求概率3.1 对立3.2 互斥3.3 独立3.4 条件(要做分母的必须大于0)例子 3.5 不等式或包含例…...
计算机视觉--通过HSV和YIQ颜色空间处理图像噪声
计算机视觉 文章目录 计算机视觉前言一、实现步骤二、实现总结 前言 利用HSV和YIQ颜色空间处理图像噪声。在本次实验中,我们使用任意一张图片,通过RGB转HSV和YIQ的操作,加入了椒盐噪声并将其转换回RGB格式,最终实现对图像的噪声处…...
WPF中prism模块化
1、参照(wpf中prism框架切换页面-CSDN博客)文中配置MainView和MainViewModel 2、模块其实就是引用类库,新建两个类库ModuleA ModuleB,修改输出类型为类库,并配置以下文件: ModuleA ModuleAProfile ModuleB Module…...
MyBatis基础之注解与SQL 语句构建器
文章目录 注解实现简单增删改查SQL 语句构建器SelectProvider举例 注解实现简单增删改查 在 MyBatis 的核心配置文件中,你需要配置的不是 mapper 映射文件,而是 Mapper 接口所在的包路径。 <!-- 在配置文件中 关联包下的 接口类--> <mappers&…...
Spring Boot项目搭建流程
Spring Boot是一款基于Spring Framework的开源框架,用于快速构建独立的、可运行的、生产级的Spring应用程序。它通过自动化配置、减少样板代码和默认的项目结构,极大地简化了Spring应用程序的开发过程。本文将详细介绍Spring Boot项目搭建的流程。 一、…...
VSCode插件开发之contributes和命令
VSCode插件开发 package.jsoncontributesconfigurationconfigurationDefaultscommandsmenuskeybindingsviewsviewsContainerscustomEditors 命令回调参数函数编辑器命令执行命令获取所有命令复杂命令 package.json contributes 之前说到 package.json 是 vscode 扩展的清单文…...
适用于Windows的远程传输大文件软件!
AnyViewer可在设备之间快速的远程传输文件,并支持远程传输大文件,传输速度可达10MB/S,同时,还可以传输单个文件不超过1TB的文件,并它基于椭圆曲线加密(ECC)加密,可保护您的文件不被…...
Hydra参数
kali的hyda参数 参数: hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e ns][-o FILE] [-t TASKS] [-M FILE [-T TASKS]] [-w TIME] [-f] [-s PORT] [-S] [-vV] server service [OPT] -R 继续从上一次进度接着破解。 -S 采用SSL链接。 -s PORT 可通…...
R语言的计量经济学实践技术应用
计量经济学通常使用较小样本,但这种区别日渐模糊,机器学习在经济学领域、特别是经济学与其它学科的交叉领域表现日益突出,R语言是用于统计建模的主流计算机语言,在本次培训中,我们将从实际应用出发,重点从数…...
基于Springboot实现体质测试数据分析平台管理系统项目【项目源码+论文说明】
基于Springboot实现体质测试数据分析平台系统演示 摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,体质测试数据分析及可视化设计当然也不能排除在外。体质测试数据分析及…...
JavaScript 严格模式
JavaScript 严格模式是一种在 JavaScript 编程中使用的特殊模式。它提供了一种更严格的语法和错误检查,以帮助开发者编写更可靠、更安全的代码。 使用严格模式的方法是在代码文件或函数的顶部添加如下语句: "use strict"; 作用:…...
安全与隐私:直播购物App开发中的重要考虑因素
随着直播购物App的崭露头角,开发者需要特别关注安全性和隐私问题。本文将介绍在直播购物App开发中的一些重要安全和隐私考虑因素,并提供相关的代码示例。 1. 数据加密 在直播购物App中,用户的个人信息和支付信息是极为敏感的数据。为了保护…...
Redis cluster 集群
redis集群redis集群是一个提供在多个redis节点间共享数据的程序集,redis集群可以支持多个master Redis集群支持多个master,每个master又可以挂载多个slave 读写分离、支持数据的高可用、支持海量数据的读写存储操作由于Cluster自动Sentinel的故障转移机制ÿ…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
