碰撞检测算法详述

news2024/11/18 15:41:11

算法的分类

目录

一、基于空间域的碰撞检测算法分类

1. 基于图像空间的碰撞算法

2.基于几何空间的碰撞检测算法

(1)基于空间剖分算法

(2)裁剪扫掠法

(3)基于距离场的算法

(4)基于层次包围盒的算法

① 轴向包围盒

② 球包围盒

③ 方向包围盒

④ 离散方向多面体

一、基于空间域的碰撞检测算法分类

从空间域角度出发,碰撞检测算法可以分为基于图像空间和基于几何空间的碰撞检测算法, 两者的区别是前者将图形硬件作为辅助来解决碰撞检测问题,后者则利用几何领域的理论知识 来解决碰撞检测问题。

1. 基于图像空间的碰撞算法

基于图像空间的碰撞算法利用图形硬件将模型投影到二维平面空间,再根据这些投影的相 交情况和模型的各类缓存信息来判断模型之间是否碰撞。

优点:

1)碰撞检 测过程不需要进行任何预处理,比较适合多柔体模型的环境;

2)对于同样复杂度的场景, 算法的效率没有大的变化,稳定性比较高;

3)利用 GPU 加速图形的渲染,降低了 CPU 的计算 负荷,提高了算法的效率。

缺点:

1)图像的分辨率的高低会影响算 法的精确度,可能会出现误判情况;

2)不适合处理凹体之间的碰撞检测问题;

3)需要解决图 形硬件和 CPU 的负载均衡问题。

2.基于几何空间的碰撞检测算法

常见的主要有以下几类算法:基于 空间剖分的算法、基于扫掠和裁剪的算法、基于层次包围盒树的算法以及基于距离场的算法等。

(1)基于空间剖分算法

依据一定的规则将场景划分成不同的区域,在碰撞检测时只需对位于同 一区域或者相邻区域的模型之间进行检测,这样可以大大减少组合测试的数量,从而提高分离 测试阶段的效率。

算法中通常使用的数据结构有均匀网格、8 叉树、k-d 树以及 BSP 树等。

均匀网格表示将场景空间划分成多个大小一致的单元, 使得每个对象都与其所属的单元格关联,则组合测试将限定在位于同一网格单元的模型之间, 此类算法的性能主要受网格单元的尺寸的影响,最坏的情况下,场景中所有的模型均位于一个 网格中,此时算法的时间复杂度为 O(n2)。

8 叉树属于一种空间层次结构划分方案,其划分方法 是首先沿 X、Y 和 Z 轴将场景划分成 8 个等大的立方体,每个立方体对应根节点的一个子节点, 对于每个子节点,若其中的模型数量超过了设定的阈值,则对这个子节点再以同样的方法递归 划分。

与 8 叉树的在空间坐标轴上的同步划分方式不同,k-d 树在一次操作过程中只沿其中的 一条轴进行划分,其划分轴信息一般用两个二进制存储于树的节点中。

BSP 树又称二分空间划 分树,其结构为 2 叉树,对于 n 维空间,它采用任意的 n-1 超平面递归将空间划为多个子空间 对,在大多数场景中,BSP 树均可达到 k-d 树及 8 叉树的效果,反之一般不成立。

(2)裁剪扫掠法

该算法主要基于这样一个理论:任意两个在三维空间相交的模型,则它们在空间坐标轴上的投 影也一定相交。裁剪扫掠法的检测过程如下:首先计算出每个模型的包围盒,包围盒在每个坐 标轴上均对应一个区间[a,b],然后将 n 个此类区间的边界值 a 和 b 插入到一个排序表中,最 后对上述排序进行扫掠,遇到 a 值时,将对应的区间加入到一个临时新建的表中;遇到 b 时, 将在临时表中对应的区间移除,每当一个新的区间加入到表中时,可以判断此区间与临时表中 原有的区间重合。

 上文介绍的两种几何空间的碰撞检测算法主要适用于多模型场景的粗略测试阶段,下面介 绍两种适用于逐步求精阶段的碰撞检测算法:基于距离场的算法以及基于层次包围盒的算法。

(3)基于距离场的算法

距离场表示物体表面某个区域内所有点与此物体的最短距离,最短距离的值可以用正负符号修饰,表示某一点位于模型内部还是模型外部。

(4)基于层次包围盒的算法

基于层次包围盒的碰撞检测算法最初是由包围盒技术发展而来,包围盒技术的原理是以规 则较大的包围盒来代替不规则较小的模型进行相交检测,快速剔除物体不相交的情况。

常 见的包围盒主要有以下几类:轴向包围盒(AABB)、球包围盒(Sphere)、方向包围盒(OBB) 和离散方向多面体(k-dop)等

① 轴向包围盒

它可以表示为三维空间中三条边均与空间坐标轴平行的长方体。

表达式

给定 AABB 的中心点 c 和三条边的半径𝑟𝑥 ,𝑟𝑦 ,𝑟𝑧,AABB 所包含的区域可以用 以下公式定义:

𝑅 = {|𝑥, 𝑦, 𝑧 ||𝑐. 𝑥 − 𝑥 |≤ 𝑟𝑥 , |𝑐. 𝑦 − 𝑦| ≤ 𝑟𝑦 , |𝑐. 𝑧 − 𝑧 |≤ 𝑟𝑧 }

相交测试

只需 6 次比较运算操作即可判断两个 AABB 是否相交: 如果两个 AABB 在 X、Y 以及 Z 轴上的投影都相交,那么两个 AABB 相交,否则分离。 

② 球包围盒

与其它包围盒相比,球包围盒(Sphere)是一类紧密性相对较差的包围盒,其优点是可以 实现快速相交测试,以及在对模型的球包围盒重构时不用考虑模型的旋转变换。

表达式

一般只需给定球的球心 c 以及半径 r:

𝑅 = {𝑥, 𝑦, 𝑧 (𝑥 − 𝑐. 𝑥)2 + (𝑦 − 𝑐. 𝑦)2 + (𝑧 − 𝑐. 𝑧)2 ≤ 𝑟2}

相交测试

球包围盒之间的相交测试也非常简单,只需计算两个球心的距离,然后与 两个包围盒的半径和进行比较,由于计算机中求根运算操作所消耗的时间要远远多于求平方的 操作,实际上一般使用距离的平方值来进行比较。

③ 方向包围盒

相交测试

最常见的 一种方法是通过判断两个包围盒之间是否存在分离轴来确定它们之间是否相交,若空间存在一 条直线,两个包围盒在这条直线上的投影分离,那么两个包围盒之间分离。任意两个 OBB 之 间一共存在 15 条潜在的分离轴,逐一检测完这 15 条轴是一个比较复杂的过程。

④ 离散方向多面体

离散方向多面体(K-DOP)是一种典型的凸多面体,它可以定义为多个平行平面之间的交 集,其中 K 表示 K-DOP 所有面的外法向量的数目,即 K-DOP 的方向轴的数量为 K/2。

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

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

相关文章

ModaHub魔搭社区:向量数据库的工作原理

目录 1. 为什么需要向量数据库 1)CPU 工作原理 2)GPU 工作原理 3)二者的差异 4)总结 5)大模型的工作原理 学习 推理 1. 为什么需要向量数据库 向量数据库这一概念随着黄仁勋的演讲火爆了之后,不少…

如何使用upupw搭建服务器,并映射外网访问

作为计算机行业从业人员,相信很多人都接触并使用过phpstudy等类似环境集成包,着对于upupw就比较好理解了。UPUPW绿色服务器平台是Windows下很有特色的一款免费服务器PHP套件,UPUPW PHP套件简化了PHP环境搭建步骤,一个压缩包解压到…

chatgpt赋能python:Python经典游戏:从命令行到桌面

Python经典游戏:从命令行到桌面 Python是一个热门的编程语言,尤其在编写游戏方面表现出色。Python允许开发人员使用简单的语法和丰富的库编写高效率的游戏。在这篇文章中,我们将介绍Python的一些经典游戏,包括简单的命令行游戏和…

GithubAction的使用-简单易懂

一、Github Action简介 github Action (工作流),简单理解就是自动化部署、测试。也就是之前人工手动部署变为现在由机器(服务器)自动部署、测试了。 二、对github Action(工作流)的使用 首先…

〖编程初学者的自我修养 - 满分面试篇①〗- 面试之前需要做的「长期准备工作」

简介:应 850 小伙伴要求, 无论你是迷茫的在校生还是已经就业的老司机,该专栏都值得你订阅,它会让你成就更好的自己!说明:该文属于 编程初学者的自我修养 专栏,购买任意白宝书体系化专栏可加入易…

SpringBoot 解决跨站脚本漏洞(XSS)问题

一、问题背景 使用 SpringBoot 的项目出现了跨站脚本漏洞&#xff08;XSS&#xff09;问题。 二、解决方案 步骤如下&#xff1a; 1、添加maven依赖 在 pom.xml 文件中&#xff0c;增加如下依赖&#xff1a; <dependency><groupId>org.apache.tomcat</group…

莫兰指数P值,Z值分析

仔细看完下面两个链接绝对可以明白。写的非常清晰。 白话空间统计之四&#xff1a;P值和Z得分&#xff08;中&#xff09; 白话空间统计之四&#xff1a;P值和Z得分&#xff08;下&#xff09; 个人理解&#xff1a;P值决定了数据有没有显著性&#xff0c;数据能不能用的问题…

什么是 CI/CD ?

说在开头 CI、CD 其实是三个概念&#xff0c;包含了一个 CI 和两个 CD&#xff0c;CI全称 Continuous Integration&#xff0c;表示持续集成&#xff0c;CD包含 Continuous Delivery和 Continuous Deployment&#xff0c;分别是持续交付和持续部署。这三个概念之间是有前后依赖…

chatgpt赋能python:Python如何等分区间

Python如何等分区间 Python是一种高级编程语言&#xff0c;经常用于数据分析和科学计算。在数据分析中&#xff0c;等分数据区间是常见的操作。本文将介绍Python如何等分区间&#xff0c;并提供一些实用的代码示例。 什么是等分区间 等分数据区间是将数据划分为几个大小相等…

网络编程的无冕之王-Netty入门和核心组件介绍

最近我在研究Netty&#xff0c;之前只是经常听说&#xff0c;并没有实际做过研究&#xff0c;为什么突然要好好研究一下它&#xff0c;主要是因为前段时间&#xff0c;我在看RocketMQ底层原理的时候发现它的底层的网络通信都是基于Netty&#xff0c;然后网上一查&#xff0c;果…

【软件设计师暴击考点】网络安全等杂项高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

读发布!设计与部署稳定的分布式系统(第2版)笔记11_无限长的结果集

1. 无限长的结果集是导致响应缓慢的常见原因 1.1. 当违反稳态模式时&#xff0c;就可能产生无限长的结果集 1.2. 当调用方允许另一个系统支配调用时&#xff0c;就会出现一个无限长的结果集 2. 数据库突然返回500万行&#xff0c;而不是通常的100多行时会发生什么&#xff1…

密码找回流程绕过测试-业务安全测试实操(20)

密码找回流程绕过测试 测试原理和方法 很多网站的密码找回功能一般有以下几个步骤 (1) 用户输入找回密码的账号: (2) 校验凭证:向用户发送短信验证码或者找回密码链接,用户回填验证码或单击链接进入密码重置页面,以此方式证明当前操作用户是账号主人;(3) 校验成功进入重置密…

重构项目的十大注意事项

文章目录 1. 确认重构的目的和范围2. 建立好重构计划3. 检查重构前的代码4. 测试重构后的代码5. 避免过度重构6. 保持团队成员沟通7. 使用重构工具8. 使用版本控制系统9. 持续监控重构进度10. 不断改进技能 1. 确认重构的目的和范围 在开始重构之前&#xff0c;需要明确重构的…

Spring(五)基于注解的自动装配

注解&#xff1a;和XML配置文件一样&#xff0c;注解本身并不能执行&#xff0c;注解本身仅仅只是做一个标记&#xff0c;具体的功能是框架检测到注解标记的位置&#xff0c;然后针对这个位置按照注解标记的功能来执行具体操作。 本质上&#xff1a;所以一切的操作都是java代码…

K8S调度器之污点和容忍

1. Taint和Toleration 节点亲和性&#xff0c;是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。Taint则相反&#xff0c;它使节点能够排斥一类特定的pod。Taint和Toleration相互配合&#xff0c;可以用来避免pod被分配到不合适的节点上。每个节点上都可以应用…

阿里云ECS服务器vCPU什么意思?

阿里云ECS服务器vCPU和CPU是什么意思&#xff1f;CPU和vCPU有什么区别&#xff1f;一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定&#xff0c;CPU是中央处理器&#xff0c;一个CPU可以包含若干个物理核&#xff0c;通过超线程HT&#xff08;Hyper-Threading&am…

chatgpt赋能python:Python中如何合并相同key的元素?

Python 中如何合并相同 key 的元素&#xff1f; 在 Python 编程中&#xff0c;很多时候需要对列表或字典进行合并相同 key 的操作&#xff0c;这篇文章将介绍合并相同 key 的方法及应用。 什么是相同 key 合并&#xff1f; 相同 key 合并指的是将具有相同 key 的元素合并为一…

关于防火墙配置长连接的设置

长连接的使用场景 当业务中客户端和服务器长时间无数据交互&#xff0c;空闲时间超过1800秒&#xff0c;会话会因超时被清除。后续客户端没有重新发起连接&#xff0c;直接发送控制报文时导致数据不通。常见于数据库连接。 重点说明 以天为单位的会话超时需要开启长效会话比例…

考研高数考点总结

一.极限 1.函数的四性&#xff1a; 单调性、周期性、奇偶性、有界性&#xff1a; 周期性、奇偶性各记住一个结论。 有界性判定&#xff1a; 1.定义法&#xff1a;-M<绝对值<M2.函数性质&#xff1a;函数在闭区间上连续一定有界 闭区间连续》开区间连续加左端点右极限…