当前位置: 首页 > news >正文

碰撞检测算法——分离轴算法在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.lryc.cn/news/191138.html

相关文章:

  • 04在命令行中使用Maven命令创建Maven版的Web工程,并将工程部署到服务器的步骤
  • 什么是指标体系,怎么搭建一套完整的指标体系?(附PDF素材)
  • Windows提权方法论
  • 推荐系统领域,over-uniform和oversmoothing问题
  • 360测试开发技术面试题目
  • 智能井盖传感器扣好“城市纽扣”,让市民脚下更有安全感
  • 1 随机事件与概率
  • 计算机视觉--通过HSV和YIQ颜色空间处理图像噪声
  • WPF中prism模块化
  • MyBatis基础之注解与SQL 语句构建器
  • Spring Boot项目搭建流程
  • VSCode插件开发之contributes和命令
  • 适用于Windows的远程传输大文件软件!
  • Hydra参数
  • R语言的计量经济学实践技术应用
  • 基于Springboot实现体质测试数据分析平台管理系统项目【项目源码+论文说明】
  • JavaScript 严格模式
  • 安全与隐私:直播购物App开发中的重要考虑因素
  • Redis cluster 集群
  • 服务器与网站部署知识体系目录
  • 解读提示工程(Prompt Engineering)
  • Servlet的部署与安全
  • 2023版IDEA的下载、安装、配置、快捷键、模板、插件与使用
  • vue cli和vite区别
  • SQL Server修改表结构
  • C++学习——对象的内存模型
  • cpp文件操作
  • failed to req API:/nacos/v1/ns/instance after all servers([localhost:8848])
  • 【ROS】ros-noetic和anaconda联合使用
  • 【MySQL】聚合查询与分组查询