物理系统碰撞相关原理及算法

article/2025/10/10 18:22:30

1.物理模拟相关过程

1) 积分Integrate(物体运动位置和朝向的迭代)
2)碰撞检测 Collision Detect(检测碰撞体间是否接触以及相关碰撞信息)
1.粗略碰撞检测BroadPhase(粗略判断碰撞体间是否接触)
2.精确碰撞检测NarrowPhase(精确计算碰撞体间的接触点,接触法向量和穿透距离,为后续碰撞处理做准备)
3) 碰撞约束Collision Constraint (用约束求解的方法处理碰撞问题)
1.碰撞处理Collision Handling(模拟反弹力和摩擦力以及小球碰撞后的运动)
2.静止接触 Resting Contact(让盒子静止在桌面上,避免穿透)

2.碰撞检测

1.碰撞检测基础算法

1)计算空间中两点间的最小距离

点之间的距离
延伸即为球体之间的距离,同时可得出重叠深度,重叠位置,重叠法向量等

2)计算空间中点到平面的最小距离

设 空间中的点是P,平面的单位法向量n,平面上某一个点是Q
则有 点到平面的最小距离
延伸即为球体与平面之间的距离

3)计算空间中点到线段的距离(注意这里是线段而不是直线)

点到线段的距离
延伸即为球体跟胶囊体之间的距离

4)计算空间中点到方盒的最小距离

我们按照图中所示的方式将空间按照方盒划分

点到方盒的最小距离
空间将会划分成27份,12条边对应12个区域(对应下图中的a),8个顶点分别对应8个区域(对应下图中的b),6个面分别对应6个区域(对应下图中的c),最后一个区域是在方盒内部。
在这里插入图片描述
如果在12条边对应的区域的话,距离最近的点是该点在对应边上的投影。(如上图a)
如果空间中的点在8个顶点对应的区域内的话,距离最近的点就是所在区域对应的顶点。(如上图b)
如果在6个面对应的区域的话,距离最近的点是该点在对应平面上的投影。(如上图c)
而如果在方盒内部,需要比较该点到方盒6个面的距离,距离最小的就是最近距离,该点在应面上的投影就是最近点。
延伸即为球体跟立方体之间的距离

5)计算空间中线段到线段的最小距离

设线段 P1P2和Q1Q2,使用叉乘计算出平行与两条线段的平面(见叉乘的几何意义)。将Q1Q2投影在另P1P2线段所在平面。若线段相交,则计算平面之间的距离。不想交则分别计算点与线段的距离。
延伸即为最常见的胶囊体之间的距离

6)凸面体之间的距离(GJK算法)

GJK算法比较关键的一点是需要计算两个形状之间的Minkowski差,Minkowski差可以定义为 A,也就是形状A中的任意一点与形状B中的任意一点的差组合成的形状。该形状有条重要的性质,它与原点的最小距离就是A与B的最小距离,而当原点在该形状内时,A和B发生重叠。
GJK算法

2.空间加速

1) 基于空间树的加速
2) AABB包围盒的粗略计算

3.CCD算法(连续碰撞检测)

1) Sweep-based CCD
基于扫掠的 CCD 采用撞击时间 (TOI) 算法,通过扫掠对象的前向轨迹来计算对象的潜在碰撞(采用对象的当前速度)。如果沿对象移动方向有接触,该算法会计算撞击时间并移动对象直至达到该时间。该算法可从该时间开始执行子步骤,即计算 TOI 之后的速度,然后重新扫掠,代价是需要经历更多的 CPU 周期。
缺点:未考虑角速度计算,运算量大
2) Speculative CCD
推断性 CCD 的工作原理是基于对象的线性运动和角运动增大一个对象的粗筛阶段轴对齐最小包围盒 (AABB)。该算法是一种推测性的算法,因为会选取下一物理步骤中的所有潜在触点。然后将所有触点送入解算器,因此可确保满足所有的触点约束,使对象不会穿过任何碰撞。
推断性CCD
缺点1:会产生幽灵碰撞(由于大一号的AABB)
幽灵碰撞

缺点2 穿隧现象(解算器只计算扩大的 AABB 的内部触点,在求解和积分阶段不会执行碰撞检测)穿隧现象


http://chatgpt.dhexx.cn/article/OuJDxhrE.shtml

相关文章

Linux MySQL8.0.11版本升级到MySQL8.0.23【数据库备份】

因修复绿盟扫出来的一系列漏洞进行版本升级 msyql下载链接:https://dev.mysql.com/downloads/mysql/ 1.选择对应linux版本下载 有两种方式,一种是用rz命令选择文件直接上传。 没有rz命令,需要先下载: # yum -y install lrzsz #…

mysql进阶(二十八)GRANT REVOKE用法

文章目录 一、前言二、查看用户权限三、撤销已赋予给 MySQL 用户的权限四、grant、revoke 用户权限注意事项五、用户和权限管理命令六、 grant 权限七、拓展阅读 一、前言 MySQL权限系统围绕两个概念: 认证->确定用户是否允许连接数据库服务器;授权…

MySQL8.0.21升级到8.0.28(Linux)

需要提前准备好MySQL8.0.28的压缩包文件 1 查看当前mysql版本 2 停止当前运行的mysql service mysqld stop 3 将下载好的压缩包导入(8.0.28),解压压缩包 sudo tar -xvf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz -C /usr/local/ 4 修改之前的文件名,将mysql改为mysqlol…

15天学习MySQL计划-锁(进阶篇)-第十天

15天学习MySQL计划-锁(进阶篇)-第十天 锁 1.概述 1.介绍 ​ 锁是计算机协调多个进程或线程并发访问某个资源的机制。数据库中,除传统的计算资源(cpu,ram,i/o)的争用以外,数据也是…

第21天 数据库 Mysql

MySQL 数据库 概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库 数据库分类 关系型数据库 关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系 型数据库中,对数…

MySQL进阶第一天

MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默认设置为打开状态。 ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在此模式下,target list中的值要么是来自于聚合函数&#xff…

04.28 MySQL

DQL:数据库的查询语句初学 1.查询全表数据 在查询之前,我们需要先创建一个所需的表 select *from 表名; [注意,实际开发中,写sql的时候,不能写**号,需要查询全表的时候,需要写全部的名称字段] select s.id as “编号”, s.name as “姓名”, s.age as “年龄”, s.math as “…

MySQL 总是差八个小时,如何破?

今天来聊一个简单的话题,这是一个小伙伴在微信上问我的,对于初学者我非常能理解这类问题带来的困扰,各种尝试,各种搜索,别人说的头头是道,但是就是解决不了自己的问题,今天我简单从两个方面来和…

存入mysql时间少了8小时

在接口测试的时候,发现时间少了8小时。通过网上各个博客发现了两个问题。 首先是显示在页面的时间格式(date)和我从api接口里测试的也不同。 时间格式的处理,前端的时间显示2020-07-13T16:02:00.0000000 在后端添加JsonFormat JsonFormat(shapeJsonFo…

mysql当日及后5天数据

java /mysql统计当天及前六天的数据,如果中间哪天数据为空,怎么在相应的位置插入动态的时间 你可以在查询出结果之后,生成JSON的时候,在那里判断一下后面时间不是与前面的时间相差一天,如果不是,把这天数据…

MYSQL 第六天

课堂作业 1. 创建数据库company,在库中创建两个表offices和employees表 小鹅通作业 1.用SQL语句创建学生表student,定义主键,姓名不能重名,性别只能输入男或女,所在系的默认值是 “计算机”。 create table student( Sno int p…

MySQL高级篇第二天

文章目录 一、Mysql的体系结构概览 二、 存储引擎 三、优化SQL步骤 一、Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理服务和工具组件 SQL Interface : SQL接口组件 Parser : 查询分析器组件 O…

MySql(第二天)

文章目录 数据库查询操作1.单表查询2.多表查询3.MySql远程连接 数据库查询操作 1.单表查询 --数据库操作前的准备 -- 创建数据库 -- create database python_test_1 charsetutf8;-- 使用数据库 -- use python_test_1;-- students表 -- create table students( -- id int …

mysql查询0~3天、4~7天、8~15天、16~30天的sql语句

1、NOW(), CURDATE(), CURTIME()的值 2、date_add(now(), interval 1 day) //当前时间加一天 date_sub(now(), interval 1 day) //当前时间减一天 3、简单函数 CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END 搜索函数 CASE WHEN [expr] THEN [result1]……

idea中maven项目打包为jar

在idea中打包maven项目时有很多解决的方案&#xff0c;可出乎意料的是&#xff0c;使用某些方案时有一些未知的错误情况。经过测验后&#xff0c;记录了下面一种简单有效的方法 在pom.xml中添加 <build><plugins><plugin><groupId>org.apache.maven.…

maven项目打包部署到服务器上

创建一个maven项目&#xff0c;在本地工程依赖jar包启动完成后&#xff0c;是不够的&#xff0c;还需将项目文件使用maven编译打包然后部署到服务器上 主流的springboot项目打包的时候需要在pom文件中指定主方法等配置 解决打包部署的时候报错no main manifest attribute, in…

如何将maven项目打包成可执行的jar

方法一&#xff1a;将项目及所依赖的所有jar包打包成一个jar。 1、pom.xml添加assembly插件 2、执行mvn assembly:assembly 3、生成如下文件 4、执行java -jar quickstart-1.0.0-jar-with-dependencies.jar 备注&#xff1a;第2步的命令也可以改成mvn package&#xff0c;但需…

Maven项目打包

在做项目时&#xff0c;都会在做项目的打包操作的&#xff0c;不同的环境下有不同的打包方式&#xff0c;在maven项目中可以使用pom.xml配置文件中实现配置&#xff0c;首先要创建一个web项目 先说一下打包成war包吧 - 创建好项目后&#xff0c;需要配置pom.xml配置文件来指定打…

IDEA打包Maven项目

一、第一次需要在IntelliJ IDEA中打包Maven项目&#xff0c;弄了半天&#xff0c;才搞好&#xff0c;记录一下。 二、打包步骤 1. 在IntelliJ IDEA主界面的右侧点击Maven Project&#xff1a; 2. 在打开的页面中点击lifecycle&#xff1a; 3. 然后双击package&#xff1a; 4.…

【IDEA】Maven项目打包 无效的目标发行版: 17 (全)

问题解决方法 项目运行出错Maven打包出错 问题&#xff1a; 曾经切换过jdk版本&#xff0c;切回17时&#xff0c;出现的了如题的错误。 且运行不报错&#xff0c;但maven进行打包时报错。其他版本同理。 解决方法&#xff1a; 1. 项目运行出错 pom.xml可能出现问题&#…