世界碰撞算法原理和总结(sat gjk)

摘要:
然而,世界是非常广阔的。本文着重于处理对象之间的碰撞以及地形碰撞的后续处理。由于dt的持续时间,碰撞中的两个物体很可能相交。大连理工大学机械工程学院《凸多面体连续碰撞检测的运动轨迹分离轴算法》由张应忠于2013年12月发表。本文实际应用了gjk理论,并添加了射线检测以获得最终碰撞点。对象形状碰撞效率多边形和不规则多边形、规则多边形、通常为三角形的曲面、长方体、aabb边界框、球体、胶囊的碰撞检测。

序言

    此文出于作者的想法,从各处文章和论文中,总结和设计项目中碰撞结构处理方法。如有其它见解,可以跟作者商讨。(杨子剑,zijian_yang@yeah.net)。

在一个世界中,有多个物体,物体可以分为运动的物体和静止的物体和地形。而世界是很宽广的,本文致力在处理物体之间的碰撞,地形的碰撞后续处理。

参考:

KillerAery的文章 空间划分的数据结构(四叉树/八叉树/BVH树/BSP树/k-d树)

凸多面体连续碰撞检测的运动轨迹分离轴算法 – 张应中 范超 罗晓芳2013

基于gjk的凸体快速连续碰撞检测研究 – 刘丽 张国山 邴志刚 刘敏 2014

GJK算法

SAT分离轴算法

另外本文中,有些想法是从pbr-book中查询的碰撞算法获得理解

Pbr-book中Bvh树

另外基于KillerAery的文章中后续的一些算法,因为实际项目实际需求,顾未加整理。下面都是简述对应的原理,致力于用最简单的话语描述,后续复杂的讲解,请到参考的链接中查询。

处理流程

   世界是宽广的,同样世界中物体也是多个的。每个物体一直频繁的检测是浪费效率的(毕竟运动的物体和根本碰不到的物体检测完全没必要)。

   分为两个阶段:粗检测(筛选出来会碰撞到的物体) – 细检测(两两碰撞检测)

GJK算法

   Gjk算法最初是用来算两个物体的具体,之后因为稳定和快捷,可以用来初检测碰撞。

原理:是算两个物体的顶点差,其实就是距离,得出顶点距离的集合,算出来的多边形是否包含原点,当包含则两物体相交。

SAT分离轴算法

   分离轴算法,可以很好的检测出来碰撞点和碰撞点的深度。

   原理:当两物体相交,那这两物体从任意方向看过去都是相交的。对应的就是在各个方向的投影都有交叠。

粗检测-空间分割

四叉树

       面分割方法,世界大小的正方体是根节点,同等分割四份如果一个物体在一个分支中,找到最小能容纳他的正方体分支。一般情况是根据x y 来分割。

世界碰撞算法原理和总结(sat gjk)第1张

八叉树

   空间分割法,其实是比四叉树多一个z的方向的分割,是三维的。

 世界碰撞算法原理和总结(sat gjk)第2张

松散四叉树/八叉树

   松散八叉树其实是为了解决边界问题,当一个物体在四叉树边缘不断的从一个区域到另一个区域会导致节点不断的更新节点,层级也会发生变化,为了解决这一问题,提出了两个概念。

  1. 入口边界,入口边界等于四叉树/八叉树的真正边缘。
  2. 出口边界,出口边界比四叉树/八叉树的真正边缘大。

 出口边缘具体大多少没有一个明确的定义,大多数为如果边缘的2倍。

 世界碰撞算法原理和总结(sat gjk)第3张

 当物体移动时,先判断是否出出口边缘,如果没出,则还在当前节点和深度,如果出了则从新寻找入口边缘找到对应的深度和节点。

层次包围盒树

       层次包围树用于精确检测,当一个物体的形状是复杂的,多个不规则多边形组合在一起的时候,用此方法最好。例如人由头、身体、手、脚组成,当各个部位运动时,从下往上递归改变父节点的包围盒。

   还有一种用法是,当其中一个物体在空间中改变位置的时候,pop形状-刷新分支节点包围盒-重新加入包围盒树,计算bvh。

   一般包围盒形状是统一的,aabb、球、或者box。

   球构造很快(圆心和半径)。

   碰撞检测快,因为当父节点aabb不想交或者射线检测不到,则子节点无需检测。

细检测-运动中物体检测

       当物体在代码中模拟运动的时候,是离散的状态,每次经过dt的时间计算下一次的碰撞。碰撞的两物体因为dt的时间长短,很有可能发生穿插的问题。下面介绍了两种检测方法。

连续碰撞检测

把这段状态积分化,或者函数化,求导数的极致,来求得最后在dt中某个时间的碰撞。大连理工大学机械工程学院《凸多面体连续碰撞检测的运动轨迹分离轴算法》- 2013

1月张应中发表,这篇论文实际是应用了gjk的理论,并加上射线检测,求得最终的碰撞点。里面的算法名称叫做lccd。

   天津大学电气与自动化工程学院《基于gjk的凸体快速连续碰撞检测研究》-2014年10月刘丽发表,fccd算法,用于连续检测碰撞。

   上述两种检测算法,因为都需要模拟中间一段的求极值得过程,实际效率并不如下面的非连续碰撞检测。优点则是可以准确的求得当前碰撞的时间和点。

非连续碰撞检测

       非连续碰撞其实跟当前dt一样,求当前帧是否碰撞。但如果精度不够,可以继续缩小精度,当人物在dt的过程中,可以认为一切的变化都是线性的,所以可以通过线性求得dt/8(再细分8次)的过程的装态,判断8次中有没有碰撞。如果精度不够,则可以再继续划分精度,求得更精细的离散过程。中间当然可以先判断是否有可能在离散过程中可能碰撞。

物体与场景碰撞

       其实是物体跟三角形求出最近点,不让穿透。射线检测求相交。

物体形状碰撞效率

       多边形和不规则多边形的碰撞检测,有规律的多边形,一般为三角面,长方体(box),aabb包围盒、球体、胶囊体。圆柱等。

   不规则的多边形需要是凸多边形(gjk和sat算法都需要是凸多边形),如果不是,需要通过算法来把一个物体变为多个形状。

   现有的算法三角面、aabb、球体、胶囊体是可以通过他们的特殊性快读求得相交。而其他的需要通过sat具体来算出交点。Sat是a边型与b边型求交, 如果不交,则很快能得出, 相交需要判断O(a*b)。

总结

 算法最后还需要根据实际场景来选择。

免责声明:文章转载自《世界碰撞算法原理和总结(sat gjk)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇EJBCA的安装(基于Ubuntu 16.04 LTS + wildfly8 + ejbca6.3.11 + jdk7)Jmeter常见问题(更新ing)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转载]最小生成树-Prim算法和Kruskal算法

转载地址:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html  自己在学,感觉这个讲的很不错,就转载了。 Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点...

Base64编解码算法详解(附C/C++源码)[转自CSDN]

Base64不是什么新奇的算法了,不过如果你没从事过页面开发(或者说动态页面开发,尤其是邮箱服务),你都不怎么了解过,只是听起来很熟悉。对于黑客来说,Base64与MD5算法有着同样的位置,因为电子邮箱(e-mail)正文就是base64编码的。那么,我们就一起来深入的探讨一下这个东东吧。对于一种算法,与其问“它是什么?”,不如问“它实现了什么?”Base...

Kubernetes增强型调度器Volcano算法分析

【摘要】 Volcano 是基于 Kubernetes 的批处理系统,源自于华为云开源出来的。Volcano 方便 AI、大数据、基因、渲染等诸多行业通用计算框架接入,提供高性能任务调度引擎,高性能异构芯片管理,高性能任务运行管理等能力。 1      为什么K8S需要Volcano     K8S自带的的资源调度器,有一个明显的特点是:依次调度每个容器...

迪杰斯特拉 算法 在游戏中的运用

迪杰斯特拉 (Dijkstra).是算最短节点的。虽然网上有很多文献资料和代码,不过并不适合我的口味。于是简单的改造了下。 纯手工鼠标画图一张。 static void Main(string[] args) { int n = 7, en = 11; //-1表示不可达 int[,] a = new in...

[Java工程实践] 1.Java常用概念:Bean

一、Java Bean基本概念: 1、所有属性为private2、提供默认构造方法3、提供getter和setter4、实现serializable接口 作者:杨博链接:https://www.zhihu.com/question/19773379/answer/31625054来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。...

速度之王 — LZ4压缩算法(一)

LZ4 (Extremely Fast Compression algorithm) 项目:http://code.google.com/p/lz4/ 作者:Yann Collet 本文作者:zhangskd @ csdn blog 简介 LZ4 is a very fast lossless compression algorithm, providin...