碰撞检测算法——分离轴算法在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣:129. 求根节点到叶节点数字之和(Python3)

题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字&#xff1a; 例如&#xff0c;从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所…

《概念解析》内容汇总 + 导航

本目录基于《概念解析》专栏已发布的文章分类整理生成,包含无线感知、计算机视觉、深度学习等多个技术主题。 该专栏旨在结合前沿论文,为读者提供无线感知、人工智能(AI)、信号处理等领域相关概念的简明扼要的解释和介绍,致力于简洁清晰地解释、辨析复杂而专业的概念。通过对专…

STM32CubeMX使用

一、新建工程 首先&#xff0c;打开STM32CubeMX&#xff0c;第一次使用的朋友可以点击右侧的CHECK FOR UPDATE和INSTALL/REMOVE检查一下软件更新并且找到对应芯片的固件库然后下载&#xff0c;软件和固件库都推荐是使用最新版的&#xff0c;这里不多介绍。 完毕之后点击File-&…

信创之国产浪潮电脑+统信UOS操作系统体验4:visual studio code中怎么显示中文

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 今天在vscode中打开以前的一段C代码&#xff0c;其中的中文显示为乱码&#xff0c;如图所示&#xff1a; 而在统信文本编辑器打开是正常的&#xff0c;打开所有菜单&#xff0c;没有找到相关配置…

《进化优化》第3章 遗传算法

文章目录 3.1 遗传学的历史3.2 遗传学3.3 遗传学的历史3.4 一个简单的二进制遗传算法3.4.1 用于机器人设计的遗传算法3.4.2 选择与交叉3.4.3 变异3.4.5 遗传算法参数调试 3.5 简单的连续遗传算法 遗传算法模仿自然选择来解决优化问题。 为研究遗传算法&#xff0c;得遵守自然选…

医疗产品方案|智能蓝牙血压计方案

智能蓝牙血压计主要测量指标分别为脉率&#xff0c;收缩压和舒张压。血压和脉率是临床医疗上血液动力学分析的重要指标。 智能蓝牙血压计整个方案采用SIC32F911RET6作为整机血压测量显示的控制芯片&#xff0c;通过单片机程序开发设计而成&#xff0c;主要组成结构是传感器、充…

进来了解实现官网搜索引擎的三种方法

做网站的目的是对自己的品牌进行推广&#xff0c;让越来越多的人知道自己的产品&#xff0c;但是如果只是做了一个网站放着&#xff0c;然后等着生意找上门来那是不可能的。在当今数字时代&#xff0c;实现官网搜索引擎对于提升用户体验和推动整体性能至关重要。搜索引擎可以帮…

深入理解强化学习——标准强化学习和深度强化学习

分类目录&#xff1a;《深入理解强化学习》总目录 强化学习的历史 早期的强化学习&#xff0c;我们称其为标准强化学习。最近业界把强化学习与深度学习结合起来&#xff0c;就形成了深度强化学习&#xff08;Deep ReinforcemetLearning&#xff09;。因此&#xff0c;深度强化…

代理IP、Socks5代理与网络工程:解析技术世界的无限可能

在当今数字化的世界中&#xff0c;网络工程师不仅需要保证网络的稳定性&#xff0c;还要应对多样的技术挑战。代理IP和Socks5代理技术已经成为网络工程师工具箱中不可或缺的利器&#xff0c;在跨界电商、爬虫、出海、网络安全、游戏等领域发挥关键作用。本文将深入探讨这两项技…

试图带你一文搞懂transformer注意力机制(Self-Attention)的本质

这篇文章主要想搞懂以下几个问题&#xff1a; 1、什么是自注意力&#xff08;Self-Attention&#xff09; 2、Q,K,V是什么 好了废话不多说&#xff0c;直接进入正题 Q,K,V分别代表query&#xff0c;key和value&#xff0c;这很容易让人联想到python的字典数据结构&#xff…

记一个带批注、表头样式的导入导出excel方法(基于easyexcel)

技术栈&#xff1a;easyexcel-2.2.10&#xff0c;poi-4.1.2&#xff0c;lombok&#xff0c;hutool-5.8.19&#xff1b;公司自用导入导出方法&#xff0c;可能不是那么的优雅&#xff0c;但胜在稳定实用。 /*** Author 955* Date 2023-10-10 11:52* Description 错误批注信息对…

superset支持Kylin4.0.0(兼容处理日期分组功能)

问题总结 1. superset默认不支持kylin数据源 安装kylinpy pip install kylinpy 2. 安装kylin驱动后,无法连接kylin地址 修改site-packages/kylinpy/sqla_dialect.py文件 2.1 注释一下内容 #def _compose_select_body(self, text, select, inner_columns, froms, byfrom, …

Ghidra101再入门(上?)-Ghidra架构介绍

Ghidra101再入门(上&#xff1f;)-Ghidra架构介绍 最近有群友问我&#xff0c;说&#xff1a;“用了很多年的IDA&#xff0c;最近想看看Ghidra&#xff0c;这应该怎么进行入门&#xff1f;“这可难到我了。。 我发现&#xff0c;市面上虽然介绍Ghidra怎么用的文章和书籍很多&…

C++ 使用Windows的API CreateDirectory 创建多层级文件夹

简介 使用Windows的API创建多层级文件夹 效果 代码 #include <windows.h> #include <direct.h> #include <iostream> #include <string> #include <sstream> #include <vector> //创建多层级文件夹 bool CreateDir(const std:…

【算法-动态规划】0-1 背包问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

APT攻击与零日漏洞

APT攻击 当谈到网络安全时&#xff0c;APT&#xff08;高级持续性威胁&#xff09;攻击是最为复杂和难以检测的攻击类型之一。APT攻击通常涉及到高度的技术和策略性&#xff0c;而且它们的目标是深入地渗透和长时间地隐藏在目标网络中。 1. 什么是APT攻击&#xff1f; 高级持续…

【思维构造】Element Extermination—CF1375C

Element Extermination—CF1375C 参考文章 思路 若 a 1 < a n a_1<a_n a1​<an​&#xff0c; 初始时 a 2 , . . . , a n − 1 a_2, ..., a_{n-1} a2​,...,an−1​ 这 n − 2 n-2 n−2 个元素中大于 a 1 a_1 a1​ 中的元素都能通过 a 1 a_1 a1​ 而被删除&…

如何把电脑上的游戏串流助手设置为开机自启动?

注意&#xff1a;想要直接将 游戏串流助手 扔进“启动”文件夹里面&#xff0c;是没有用的&#xff0c;重启电脑根本打不开游戏串流助手&#xff01; 步骤一&#xff1a;每次双击 游戏串流助手之后&#xff0c;都会弹出这个用户账户控制&#xff0c;我们第一步就是要把这个禁用…

云原生Docker容器管理

目录 docker容器的管理 容器创建 查看容器的运行状态 启动容器 创建并启动容器 终止容器运行 删除容器 容器的进入 查看容器详细信息 复制到容器中 从容器复制文件到主机 容器的导出与导入 导出 导入 相当于一个进程&#xff0c;性能接近于原生&#xff0c;几乎没有损…

.net也能写内存挂

最近在研究.net的内存挂。 写了很久的c,发现c#写出来的东西实在太香。 折腾c#外挂已经有很长时间了。都是用socket和c配合。 这个模式其实蛮成功的&#xff0c;用rpc调用的方式加上c#的天生await 非常好写逻辑 类似这样 最近想换个口味。注入托管dll到非托管进程 这样做只…