为了确保任何区域的空间不被多于1个物体占用,我们需要基于物体间的空间信息来做碰撞检测。

碰撞检测中重要的事情是有大量的测试,因此需要理由GPU资源。

例如:如果我们有n个物体,一个物体将会碰撞n-1个物体(因为自己不会撞自己嘛),第二个物体撞剩下的n-2个。因此可能的碰撞是(n-1) * (n-2) * (n-3) ... 1

这几乎等于 n! / 2!*(n-2)!

在动画播放时,我们可能需要在每一帧检测碰撞,因此有效的碰撞检测是非常重要的。我们因此需要考虑下面的事情:

空间划分:

检测碰撞过程的数量是基于物体的数量,可能的碰撞数量是基于两个移动物体的位置,这大致将会与移动对象数目的平方成正比。

降低碰撞测试数量的方法是分割空间,例如规则立方体、三维格子、octtrees、k-d树、BSP树,我们此时将只能在一个给定空间(或者可能邻接的空间)检测物体碰撞。这个假定是物体相对空间大小不是太大,我们可能需要为每个大物体比如地面做特殊安排。

这允许我们在我们的模拟中扩展移动物体,并保持以O(N)而不是O(N^2)时间来处理。

包围盒

在这个场景里,每个形状都被一个红色长方形边界包围。如果有任何边界重叠,形状可能重叠,需要进一步检测,如果边界没有重叠,那就没有碰撞。因此这需要CPU来检测任何复杂形状的重叠。

检测盒子的重叠是很简单的,如果提供了同一方向的数据,我们只需要比较每个方向(x,y,z)的最大值和最小值。

比如盒子A定义了AxMin, AxMax, AyMin, AyMax, AzMin, and AzMax.盒子B定义了BxMin, BxMax, ByMin, ByMax, BzMin, and BzMax.

如果满足下面条件就可以判断盒子重叠:

AxMin < BxMax and AxMax > BxMin
AyMin < ByMax and AyMax > ByMin
AzMin < BzMax and AzMax > BzMin

右面的图展示了X方向的条件判断。当然,必须在y,z方向也满足才能确定碰撞。

然而这种算法只是在包围盒以象限对齐时有效。如果包围盒被定义在本地坐标系,并且包围盒带了旋转我们将必须:

  1. 用一个算法来检测任意朝向、任意象限的包围盒的相交,这将是非常复杂的。
  2. 或者在每一帧以绝对坐标系为基准重新计算包围盒。这计算鸭梨也很大。
如果针对物体的单一包围盒不能给予足够精确的碰撞检测,我们可以用更多的盒子比如oct树。

为了高效计算,oct树需要以觉得象限为基准

包围球

如果包围球重叠,那检测会非常简单,例如

物体A中心点为ax,ay,az,半径为ar
物体A中心点为bx,by,bz,半径为br

如果满足下面条件包围球就相交:

(ax-bx)2+(ay-by)2+(az-bz)2 < (ar+br)2

这个方法的优点是与方向独立。因此如果有象限转换,这种方法就没问题。

包围球的缺点是对于细长的物体效果不好,在这种情况下将会一些错误的碰撞检测,但我们可以用额外的检测来更加小心地检测边界。

其他技巧

实现我们自己的碰撞检测:

如果有大量物体需要碰撞检测,每一帧都计算一个物体与其他物体是否碰撞的计算量将是巨大的。

这里有一些减少碰撞检测过程的技巧,比如

  • 只考虑边界重叠的图形对。
  • 只考虑在互相移动的图形

检测网状的相交

如果物体有复杂形状,只考虑包围盒或者包围球是不够的。尽管包围盒能筛选出没有重叠的物体。

另外一个我们能依赖包围盒或者包围球的原因是可以进行计算碰撞响应的第二个阶段,我们也需要知道相对于网状中心店的影响点。

包围树

我们可以增加包围盒方法的精度,如果不是只用一个长方体,我们用diogenes长方体会横精确地匹配不规则物体。

这些子包围盒不需要每个大小都一样,尽管这可能是一种简化算法。

三角形的相交

If we want to test for collision of meshes, made up from triangles, and we want to check for collisions accurately, using all the information from the geometry, we may need to test each triangle. Once we have culled any non contenders for collisions using the methods above we may then have to test each triangle on object 'A' with each triangle on object 'B' for intersection.

如果我们测试由三角形构成的网状物体的碰撞,我们想用所有几何信息来精确检测碰撞,我们可能需要检测A或B之间的每个三角形。

我们可以计算下面展示的各个平面上的每个三角形。让我们可以计算出没量过平面的相交。

如果两个三角形都在同一部分的线上,则三角形相交。

凸形物体

许多物体间碰撞检测算法要求物体是凸的,就是说这些算法不能处理物体里有空洞或者齿。如果我们用这些算法检测非凸物体,我们必须首先把物体分割成很多小的的凸形状。尽管这些凸分解成更小的凸形状,这种计算在每一帧是很密集的。

3D碰撞检测的更多相关文章

  1. Web3D编程总结——3D碰撞检测初探

    自己动手写一个方法比分析他人的写的方法困难很多,由此而来的对程序的进一步理解也是分析别人的代码很难得到的. 一.先来几张效果图: 1.场景中有两个半径为1的球体,蓝色线段从球心出发指向球体的“正向” ...

  2. Web三维编程入门总结之三:3D碰撞检测初探

    自己动手写一个方法比分析他人的写的方法困难很多,由此而来的对程序的进一步理解也是分析别人的代码很难得到的. 一.先来几张效果图: 1.场景中有两个半径为1的球体,蓝色线段从球心出发指向球体的“正向” ...

  3. 基于 HTML5 Canvas 的 3D 碰撞检测

    这是公司大神写的一个放官网上给用户学习的例子,我一开始真的不知道这是在干嘛,就只是将三个形状图元组合在一起,然后可以同时旋转.放大缩小这个三个图形,点击"Animate"就能让中间 ...

  4. JAVA智能设备基于OpenGL的3D开发技术 之AABB碰撞检测算法论述

    摘要:无论是PC机的3D还是智能设备应用上,碰撞检测始终是程序开发的难点,甚至可以用碰撞检测作为衡量3D引擎是否完善的标准.现有许多3D碰撞检测算法,其中AABB碰撞检测是一种卓有成效而又经典的检测算 ...

  5. V-rep学习笔记:碰撞检测与距离计算

    V-REP可以在几何组件中快速判断各种干扰与碰撞,以及计算多个组件间的最小距离. 碰撞检测 V-REP可以检测两个碰撞体实体(Collidable objects are objects that c ...

  6. Web3D编程入门总结——面向对象的基础Web3D框架

    本篇主要通过分析Tony Parisi的sim.js库(原版代码托管于:https://github.com/tparisi/WebGLBook/tree/master/sim),总结基础Web3D框 ...

  7. VTK三维点集轮廓凸包提取

    碰撞检测问题在虚拟现实.计算机辅助设计与制造.游戏及机器人等领域有着广泛的应用,甚至成为关键技术.而包围盒算法是进行碰撞干涉初步检测的重要方法之一.包围盒算法是一种求解离散点集最优包围空间的方法.基本 ...

  8. HTML5实现3D和2D可视化QuadTree四叉树碰撞检测

    QuadTree四叉树顾名思义就是树状的数据结构,其每个节点有四个孩子节点,可将二维平面递归分割子区域.QuadTree常用于空间数据库索引,3D的椎体可见区域裁剪,甚至图片分析处理,我们今天介绍的是 ...

  9. bullet物理引擎与OpenGL结合 导入3D模型进行碰撞检测 以及画三角网格的坑

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11681069.html 一.初始化世界以及模型 /// 冲突配置包含内存的默认设置,冲突设置. ...

随机推荐

  1. Centos添加新硬盘、分区、格式化、自动挂载

    创建分区 #fdisk /dev/hdb 格式化新创建的分区 #mkfs.ext3 /dev/hdb1 使新创建的分区挂载/mnt/data01目录下 #mount /dev/hdb1 /mnt/da ...

  2. WebBrowser 中遍历所有的frames

    枚举所有iframe的IWebBrowser2 // Get the IDispatch of the document. // LPDISPATCH lpDisp = NULL; lpDisp = ...

  3. Hibernate框架—简介

    ORM对象/关系数据库映射 ORM全称Object/Relation Mapping,对象/关系数据库映射,可以理解成一种规范.该框架的基本特征:完成面向对象的编程语言到关系数据库之间的映射. ORM ...

  4. return和exit函数的区别

    在上Linux课的时候,老师提到一句,调用vfork产生的子进程就是为了使用exec族函数来执行其他的代码逻辑. 在子进程退出的时候有两种方式,exit和exec族函数,不能使用return,为什么不 ...

  5. ansible 控制windows

    1.installing on the control machine On a Linux control machine: #pip install "pywinrm>=0.1.1 ...

  6. Coins(HDU 2844):一个会超时的多重背包

    Coins  HDU 2844 不能用最基础的多重背包模板:会超时的!!! 之后看了二进制优化了的多重背包. 就是把多重转变成01背包: 具体思路见:http://www.cnblogs.com/tt ...

  7. 禁用 WebView 放大镜及拷贝粘贴弹出框

    文/KyXu(简书作者)原文链接:http://www.jianshu.com/p/40048d9c979a著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 背景:当你的App中有 We ...

  8. Orchard Platform v1.7.2 发布

    发布说明: 1. 添加Json格式数据文件支持.2. 删除了Settings, Modules, Themes模块中的Routers和Controllers.3. 删除了默认的ContentType, ...

  9. 设计模式之美:Bridge(桥接)

    索引 别名 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用 Bridge 模式分离抽象部分和实现部分. 别名 Handle Body 意图 将抽象部分与它的实现部分分离,使它们 ...

  10. [ACM_搜索] ZOJ 1103 || POJ 2415 Hike on a Graph (带条件移动3盘子到同一位置的最少步数 广搜)

    Description "Hike on a Graph" is a game that is played on a board on which an undirected g ...