为了确保任何区域的空间不被多于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. VMware12 安装 CentOS 6.5 64位

    前言:本人在配置Hadoop的过程中,需要搭建Cent OS 64 环境,借此,顺便将Cent OS 64 的安装在此记录,方便自己,也方便大家学习.本次是在VM12虚拟机中实现Cent OS 64 ...

  2. 设计模式UML类图基础

    1.聚合 聚合(aggregation)表示一种弱的"拥有"关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分.如大雁是群居动物,每只大雁都属于一个雁群,一个雁群可以 ...

  3. selenium通过WebDriverWait实现ajax测试,实现等页面元素加载完成

    WebDriverWait(driver, 10)10秒内每隔500毫秒扫描1次页面变化,当出现指定的元素后结束. http://fox1984.iteye.com/blog/1225265new W ...

  4. 【原创】-- nfs安装配置及使用,挂载根文件系统

    环境:ubuntu14.04(非虚拟机),OK6410 环境搭建: (1) #sudo apt-get install nfs-kernel-server 如果已经是最新版本了,无需安装 (2) 建立 ...

  5. Android系统的常用权限

    1.ACCES_NETWORK_STATE                       允许应用程序获取网络状态信息的权限 2.ACCESS_WIFI_STATE                   ...

  6. C++混合编程之idlcpp教程Python篇(4)

    上一篇在这 C++混合编程之idlcpp教程Python篇(3) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial2中,同样加入了三个文件 Pyt ...

  7. 用c#开发微信 (7) 微渠道 - 推广渠道管理系统 2 业务逻辑实现

    我们可以使用微信的“生成带参数二维码接口”和 “用户管理接口”,来实现生成能标识不同推广渠道的二维码,记录分配给不同推广渠道二维码被扫描的信息.这样就可以统计和分析不同推广渠道的推广效果. 上次介绍了 ...

  8. Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示

    CRM的项目,审批流是一个必须品.为了更方便灵活地使用.配置审批流,我们自定义了一整套审批流.首先来看下它的效果: 1. 审批模板 这是一个最简单的审批流,首先指定审批实体,及相关字段,再配置流程节点 ...

  9. 初学者利用git 上传代码到Coding的简单操作步骤

    1.首先登陆coding网站注册账号https://coding.net/ (注册完后需登陆邮箱激活邮件) 2.登陆刚注册的coding账号 ,添加项目 添加项目—〉输入项目名称—〉输入对项目的简单描 ...

  10. [芯片] 3、接口技术·实验三·可编程并行接口8255A

    目录 一.实验目的和要求 二.实验原理与背景 2-1.8255A简介 2-2.8255A编程 三.实验具体的内容 3-1.8255方式0实验1 3-2.8255方式0实验2 3-3.8255方式1输出 ...