碰撞检测

在任何一款3D游戏中,碰撞检测(Collision Detection)都是不可或缺的。碰撞检测是计算机动画、系统仿真、计算机图形学、计算几何、机器人学、CAD/CAM等研究领域的经典问题。

碰撞检测的概述

基于格子的碰撞检测,系统实现简单,精度不够,不属于严格意义的3D碰撞检测;

  • 按照数据结构不同,可以分为:
  1. 基于BSP数的碰撞检测算法
    基本成熟定性,但BSP树需要很长的预处理时间,不适合在加载时计算,所以BSP互粉经常会产生原多边形数三到四倍的多边形,数据量增加大,不太适合用于大型游戏。
  2. 基于BVTree
    对于任意复杂三角形几何的碰撞检测多(Bounding Volume Tree),具体的可以是AABB Tree、OBB Tree或者K-DOP Tree。
  • 按照检测方式不同,可以分为:
  1. 离散点的碰撞检测
    检测制定某一时刻T的两个静态碰撞体,看它们之间是否发生交跌,若没有交跌,则证明两个物体没有发生碰撞,这是返回它们最近点的举例;若发生交跌,则返回交跌深度,交跌方向等。离散点碰撞检测的缺点是:当检测到碰撞时,两个碰撞体其实已经发生了交跌。
  2. 连续碰撞检测
    分别指定T1、T2两个试可两个碰撞体的位置,看它们在由T1运动到T2时刻的过程中是否发生碰撞,如果碰撞,就返回第一碰撞点的位置和法线。连续碰撞检测是最自然的碰撞检测,可以大大方便碰撞相应逻辑的编写,很容易避免物体发生交跌或穿越。该方法的缺点是实现起来非常复杂,开销大。
    目前大部分引擎采用的是离散方式,通过采用小的模拟步长来避免物体交跌过深或者穿越。

常用的碰撞检测算法

距离跟踪法

通过寻找和跟踪两个多面体之间的最近点计算它们之间的距离。最近点计算是碰撞查询中强有力的工具,获取两物体之间的最近点后,即可得到它们之间的距离。如果两对象的合成最大位移量小于两者间的距离,对象就除与分离状态。当距离小于或等于零时,两个多面体发送碰撞,当物体的运动速度不快,相邻帧之间的运动位移变化小,可以用帧的连续性增量式计算物体间的距离。

基于图像空间的碰撞检测法

  1. Shinya算法:
    利用GPU中物体的深度信息,在绘制凸物体的时候保存每个像素的深度信息,并对深度信息进行排列找,然后检测物体在某一像素上的最大深度是否与其最小深度值相邻,来判断是否相交。
  2. Rossignac算法:
    利用深度缓存和模板缓存来减少深度信息的存储量,通过移动裁剪平面,判断平面上每个像素是否同时在两个实体之内,从而确定物体是否相交。
  3. Myszkowski算法:
    用模板缓存保存视口中每个像素所代表的射线进去一个物体前,已经进入和例开物体的次数,读这个数据来判断两个物体是否相交。
  4. Basiu算法:
    先用几何方法确定两个物体包围盒的相交区域,然后再相交区域中利用GPU加速进行相交检测,将相交情况按照深度值进行分类,用模板缓存值表示分类,然后通过检查模板缓存值判断两个物体之间是否碰撞。缺点是,仅能处理凸多面体。
  5. Govindaraju算法:
    利用硬件加速快速剔除明显不发生相交的物体,然后用几何快速相交检测算法得到碰撞结果。
  6. Heidelbeger算法:
    先将两个物体的相交区域按层次升读分解为层次深度图,然后通过图形硬件绘制过程判断两个物体在层次深度图的每个像素上是否有相交区间存在,来确定物体是否发生碰撞。

空间分解法

空间分解法是将整个虚拟空间划分成相等体积的单元格,只对占据同一单元格或相邻单元格的几何对象进行相交测试。常用的碰撞算法有BSP树、空间八叉树和空间四叉树。一般来说,空间分解算法在每次碰撞测试时都需要确定每个模型占有的空间单元,当有模型运动时,只需要重新计算运动模型所占有的空间即可。空间分解法使用于物体在空间中均匀分布的稀疏环境,通常被应用于类似物体在障碍之间运动的虚拟场景。
BSP算法,因为BSP的构建过程需要大量计算,一旦生成BSP树,就很难修改,所以不适用于实体形状发生改变的情况。对于传统的八叉树或四叉树不能保留物体的几何、物体属性,不利于进行交互式操作。

层次包围盒法

是使用较多的一种碰撞检测方法,用体积略大于几何特性简单的包围盒近似地描述复杂的几何对象,从而只需对包围盒重叠的对象进行进一步相交测试。通过构造书状层次结构可以越来月逼近对象的几何模型,知道几乎完全获得对象的几何特性。典型的层次结构树主要包括AABB层次书、包围球层次书、OBB层次树和k-DOP层次树等。
《Irrlicht 3D游戏引擎程序设计》阅读笔记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容