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

常见的2D与3D碰撞检测算法

分离轴

分离轴定理(Separating Axis Theorem)是用于解决2D或3D物体碰撞检测问题的一种方法。其基本思想是,如果两个物体未发生碰撞,那么可以找到一条分离轴(即一条直线或平面),两个物体在该轴上的投影不会重叠。

具体实现时,我们需要确定所有可能作为分离轴的候选轴,并将两个物体在每个轴上的投影计算出来,判断它们是否重叠。如果发现任何一个轴上的投影未重叠,那么两个物体就未发生碰撞。如果所有轴都进行了检测(即所有候选轴都已被检测),但仍未发现分离轴,则两个物体发生了碰撞。

用UE4 C++实现分离轴定理可以按以下步骤进行:

  1. 创建一个能够存储轴的结构体,结构体中包含一条轴的方向向量和起始点位置。

  1. 创建一个用于获取所有轴的函数。这个函数可以接收一个物体作为参数,并返回该物体的所有轴列表。利用该物体的顶点坐标,可以通过两两相连的顶点计算出每条轴。因为重叠检测是双向的,所以每个物体都需要检测。

  1. 创建一个用于检测投影是否重叠的函数。这个函数接收两个物体和一条轴作为参数,返回一个布尔值,表示两个物体在该轴上的投影是否重叠。具体实现可以通过计算两个物体在该轴上的投影值,判断是否有重叠。

  1. 创建一个用于检测两个物体是否重叠的函数。这个函数接收两个物体作为参数,返回一个布尔值,表示这两个物体是否发生了碰撞。具体实现可以通过遍历每个物体的所有轴,利用第三步中的函数检测两个物体是否在该轴上的投影重叠。

  1. 在游戏中使用上述函数进行实时碰撞检测的操作。

通过上述步骤,我们可以实现基于分离轴定理的碰撞检测功能。这个功能可以用于2D或3D游戏中,帮助我们检测游戏中各种物体之间的碰撞,从而实现更加真实的游戏效果。

其他碰撞检测算法

除了分离轴定理,常见的解决2D或3D物体碰撞的算法还有:

  1. 包围盒碰撞检测(Axis-Aligned Bounding Box, AABB):这个算法将物体看作一个矩形或立方体的包围盒,并检测包围盒之间的碰撞。虽然这个算法的最坏时间复杂度较高,但是对于许多实际应用场景而言,因为物体的移动较小,所以碰撞只是在一个相对较小的区域内发生,因此算法可以得到实现和加速。

  1. 广义相交检测(Generalized Intersection Test, GIT):这个算法通过判断两个物体的相交情况,快速计算它们的碰撞。该算法可以应用到任意多边形上,而不必关注它们的形状。

  1. 时空优化的碰撞检测(Spatial-Temporal Collision Detection, STCD):这个算法利用物体的上一帧与当前帧中的运动以及周围环境的改变,预测物体的下一次碰撞。它可以通过加速碰撞检测以帮助提高游戏性能。

  1. 分层碰撞检测(Hierarchical Collision Detection):这个算法将物体分层并对每个层内的物体实现碰撞检测。它可以通过避免进行不必要的检测以提高性能。

这些算法在实际应用的时候,需要根据不同的场景和要求进行选择和调整,以达到最好的效果。

http://www.lryc.cn/news/43014.html

相关文章:

  • STM32 10个工程篇:1.IAP远程升级(二)
  • Unity+ChatGpt的联动 AICommand
  • STM-32:按键控制LED灯 程序详解
  • 北邮22信通:(8)实验1 题目五:大整数加减法(搬运官方代码)
  • Fiddler抓取https史上最强教程
  • STM32开发基础知识入门
  • 学习操作系统的必备教科书《操作系统:原理与实现》| 文末赠书4本
  • 大数据的常用算法(分类、回归分析、聚类、关联规则、神经网络方法、web数据挖掘)
  • 【数据结构】详解二叉树与堆与堆排序的关系
  • 【Pandas】数据分析入门
  • 【c++】:list模拟实现“任意位置插入删除我最强ƪ(˘⌣˘)ʃ“
  • QT表格控件实例(Table Widget 、Table View)
  • 第二章Vue组件化编程
  • 面试官:vue2和vue3的区别有哪些
  • 【TopK问题】——用堆实现
  • 【Spring从成神到升仙系列 四】从源码分析 Spring 事务的来龙去脉
  • 使用Nginx反向代理OpenAI API
  • USB键盘实现——字符串描述符(四)
  • STM32的中断
  • Flink进阶篇-CDC 原理、实践和优化采集到Doris中
  • 看完这篇 教你玩转渗透测试靶机vulnhub——My File Server: 1
  • OpenHarmony实战STM32MP157开发板 “控制” Hi3861开发板 -- 中篇
  • 【数据结构初阶】单链表
  • 多线程代码案例-阻塞队列
  • mysql的limit查询竟然有坑?
  • 【Docker】MAC电脑下的Docker操作
  • 【Python3】matplotlib,模块,进/线程,文件/xml,百度人脸api,hal/aiohttp/curl
  • 异或相关算法
  • python 使用pyshp读写shp文件
  • eNSP FTP基础配置实验