碰撞检测技术

合集下载

计算机游戏开发中的物理引擎与碰撞检测

计算机游戏开发中的物理引擎与碰撞检测

计算机游戏开发中的物理引擎与碰撞检测计算机游戏开发是一个综合性较强的领域,其中物理引擎和碰撞检测是游戏开发过程中非常重要的一部分。

物理引擎主要负责模拟游戏中的物体行为,而碰撞检测则用于判断物体之间是否发生碰撞。

本文将对这两个关键概念进行详细探讨。

一、物理引擎在计算机游戏中,物理引擎是指模拟和计算游戏中物体的力学特性,使得物体在游戏世界内运动和交互的系统。

物理引擎通常由一些数学和物理算法组成,可以模拟物体受到的力、速度、加速度等。

1.1 力学模拟物理引擎使用牛顿力学等物理定律来模拟物体受到的力和运动。

通过计算物体所受到的合力,可以得到物体的加速度。

通过积分计算,可以得到物体的速度和位置。

这种力学模拟方法可以更真实地模拟物体在游戏中的行为。

1.2 碰撞响应物理引擎还处理物体之间的碰撞,并根据碰撞的类型进行相应的处理。

在碰撞检测的基础上,物理引擎可以计算出物体碰撞时的撞击力、反弹方向等。

这种碰撞响应可以使得游戏中的物体产生更真实的碰撞效果。

1.3 关节系统物理引擎还可以模拟复杂的物体之间的连接关系,如关节系统。

通过约束和连接,可以实现物体之间的运动关系,如车辆的悬挂系统、刚体的连接等。

这种关节系统可以增加游戏中物体之间的互动性和真实感。

二、碰撞检测碰撞检测是计算机游戏开发中的关键技术,用于判断游戏中的物体是否发生碰撞。

在游戏中,物体的碰撞判断是实时进行的,因此碰撞检测的效率和准确性非常重要。

2.1 离散碰撞检测离散碰撞检测是最基本的碰撞检测技术。

它通过比较物体的包围盒或几何形状,判断物体之间是否发生碰撞。

这种方法简单高效,适用于很多场景,但对于复杂的物体形状可能不够准确。

2.2 连续碰撞检测连续碰撞检测是一种更加精确的碰撞检测技术,它考虑到物体运动过程中的碰撞情况。

通过追踪物体在一段时间内的运动轨迹,可以判断物体是否在这段时间内发生碰撞。

这种方法可以解决离散碰撞检测的不准确性问题。

2.3 碰撞优化为了提高碰撞检测的效率,游戏开发者通常会采用一些优化手段。

协作机器人零力控制与碰撞检测技术研究共3篇

协作机器人零力控制与碰撞检测技术研究共3篇

协作机器人零力控制与碰撞检测技术研究共3篇协作机器人零力控制与碰撞检测技术研究1协作机器人零力控制与碰撞检测技术研究随着智能制造业的快速发展,协作机器人越来越多地出现在制造场景中。

协作机器人不同于传统的工业机器人,它可以协同工人完成一系列任务,实现人机协作,提升生产效率。

协作机器人的一个重要问题是如何实现“零力控制”和“碰撞检测”,使机器人在与人类近距离协作时能够及时感知周围的环境,保证安全性和可靠性。

一、协作机器人零力控制技术研究协作机器人与人类进行工作时需要实现零力控制技术,即机器人在与人类接触或协作时不会对人体造成伤害或危害。

实现零力控制技术,可以采用力测量、力控制器和探针等方式。

1、力测量力测量是一种常用的实现零力控制的方法。

利用压电传感器等可测量力和力矩的装置,测量机器人运动过程中的力和力矩,即机器人与人体接触造成的相互作用力。

在机器人运动控制过程中,通过实时测量的力信号计算机自动调整控制信号,以实现零力控制。

2、力控制器力控制器是一种利用传感器获取机器人端末执行器和相应工具的力信号后,通过运算控制执行器所受的力的大小、方向和刚度等的装置。

当机器人执行器与外界物体接触时,力控制器可以自动调整控制信号,保证机器人与外界物体的相互作用力在一定范围内。

3、探针探针是一种具有弹性和敏感性的传感器,可感知接触和相互作用的力和变形。

探针作为机器人末端装置,通过感知机器人与外界物体之间的相互作用力,来调节机器人的运动并实现零力控制。

二、协作机器人碰撞检测技术研究协作机器人的另一个重要问题是如何实现碰撞检测技术,及时判断是否发生了碰撞,保障整个系统的安全性。

机器人碰撞检测技术的常用方法有:力矩保护、视觉碰撞检测和电容传感碰撞检测等。

1、力矩保护力矩保护是在机器人末端装置或机器人的关节处安装传感器,当机器人运动时,通过测量传感器获取的力信号计算机程序进行判断,如果力信号超过预设值,则机器人将自动停止,从而实现碰撞检测。

CAD中的零件和装配的碰撞检测教程

CAD中的零件和装配的碰撞检测教程

CAD中的零件和装配的碰撞检测教程CAD(计算机辅助设计)是一种广泛应用于工程设计领域的技术。

在CAD软件中,零件和装配的碰撞检测是一个非常重要的功能,它能够帮助设计师在设计过程中避免错误和冲突。

本教程将介绍如何在CAD软件中进行碰撞检测。

首先,打开CAD软件并创建一个新的项目。

在这个项目中,我们将创建一些零件和装配模型来演示碰撞检测的过程。

第一步是创建零件模型。

选择适合你的设计需求的基本形状,如长方体、球体或圆柱体,并按照所需的尺寸和比例进行绘制。

你也可以根据需要使用CAD软件提供的其他工具和特性来制作更复杂的零件模型。

完成零件模型后,我们需要将它们组装成一个装配体。

选择需要组装的零件并将它们放置在适当的位置。

确保零件之间的连接部分正确对齐并符合设计要求。

完成装配体后,我们可以开始进行碰撞检测了。

在CAD软件的菜单栏或工具栏中,找到碰撞检测功能。

不同的CAD软件可能会有不同的名称和位置,但其功能基本相同。

点击碰撞检测功能后,选择需要进行碰撞检测的零件和装配体。

确保你选择了正确的模型,并根据需要设置相应的参数和条件。

开始进行碰撞检测后,CAD软件会自动计算和分析模型之间的碰撞情况。

如果存在碰撞或冲突,CAD软件将会给出相应的警告或错误信息。

根据软件的不同,你可能可以查看碰撞的具体位置、角度和程度。

根据碰撞检测的结果,你可以对零件和装配体进行调整和修改,以解决碰撞或冲突的问题。

你可以改变零件的尺寸、形状或位置,也可以调整装配体的连接方式或顺序等。

重复进行碰撞检测和修改的过程,直到没有任何碰撞或冲突问题。

这样,你就可以确保你的设计在实际应用中不会出现碰撞和冲突的情况,提高了设计的安全性和可靠性。

除了基本的碰撞检测外,CAD软件还提供了其他一些高级的碰撞检测功能。

例如,它可以检测零件之间的间隙或过于接近的情况,帮助设计师进一步优化设计。

此外,CAD软件还可以模拟和分析零件和装配体的运动、应力和动力学行为,以预测和优化设计的性能和行为。

3DMAX中的碰撞检测和物体互动技术

 3DMAX中的碰撞检测和物体互动技术

3DMAX中的碰撞检测和物体互动技术在3DMAX中,碰撞检测和物体互动技术是实现真实场景渲染和动画效果的关键。

通过精确的碰撞检测和物体互动技术,可以使对象在场景中准确地进行交互,增加视觉真实感和用户体验。

本文将介绍3DMAX中的碰撞检测原理和物体互动技术的应用。

一、碰撞检测原理在3DMAX中,碰撞检测是指判断两个或多个物体是否发生碰撞的过程。

通过触发碰撞事件,可以实现物体之间的交互效果。

碰撞检测的原理主要包括以下几个方面:1.1 碰撞体的定义在3DMAX中,每个物体都可以定义一个或多个碰撞体。

碰撞体是一个用于检测碰撞的虚拟形状,可以是简单的几何体,如球体、盒子或胶囊体等,也可以是复杂的自定义模型。

每个碰撞体都有自己的位置、旋转和缩放信息,可以与其他碰撞体进行比较。

1.2 碰撞体之间的碰撞检测当多个物体具有碰撞体时,系统会对每对碰撞体进行碰撞检测。

碰撞检测的方法有多种,包括包围盒碰撞检测、精确碰撞检测和边缘碰撞检测等。

其中,包围盒碰撞检测是最常用的一种方法,它利用包围盒来代表物体的边界,减少计算量,提高检测效率。

1.3 碰撞事件的触发当两个碰撞体发生碰撞时,系统会触发碰撞事件。

碰撞事件可以触发物体的动画效果、声音效果或触发其他特定的逻辑处理。

例如,在一个游戏中,当玩家的角色与敌人发生碰撞时,会触发玩家受伤的动画效果和减少生命值等。

二、物体互动技术的应用物体互动技术是指在3DMAX中,通过碰撞检测实现物体之间的互动效果。

物体互动技术可以应用于游戏开发、虚拟现实、建筑模拟和工业设计等领域。

以下是几个常见的物体互动技术的应用场景:2.1 游戏开发在游戏开发中,物体的碰撞检测和互动效果是实现游戏玩法和真实场景的关键。

通过3DMAX中的物体碰撞检测,可以实现玩家与游戏场景中的各种物体之间的互动。

例如,在一款跑酷游戏中,玩家控制的角色运动时与墙壁碰撞,会触发跳跃动作,实现游戏玩法的连贯流畅。

2.2 建筑模拟在建筑模拟领域,物体互动技术可以帮助开发者更加准确地模拟现实世界中的建筑物。

碰撞检测技术——凸包的建立

碰撞检测技术——凸包的建立

碰撞检测技术——凸包的建立
-ZH1110
实时碰撞检测是机器人、动画仿真、虚拟现实等领域中一个非常关键的问题,其基本任务是确定两个或多个物体彼此之间是否发生接触或穿透。

多面体尤其是凸体良好的空间结构特性如空间连贯性可被利用来优化碰撞检测的效率。

因此,基于多面体,尤其是基于凸体的碰撞检测算法一直是碰撞检测算法中的一个研究重点
一般的AABB,OBB树由于包围较松散,会产生较多的节点,我们选择研究凸包包围体,其包围物体紧密,但相互之间的求交计算更复杂
1.包围球的球心求法
设物体顶点坐标所含最大最小值分别为:xmax,xmin,ymax,ymin,zmax,zmin,则球心坐标为:
2.包围球半径的求法
r=
2.凸包凸包概念:点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q 中的点或者在多边形边上或者在其内。

下图中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包。

平面凸包的求法:
凸包最常用的凸包算法是Graham扫描法和Jarvis步进法。

对于一个有三个或以上点的点集Q,过程如下:
计算点集最右边的点为凸包的顶点的起点,如上图的P3点。

Do
For i = 0 To 总顶点数
计算有向向量P3->Pi
If 其余顶点全部在有向向量P3->Pi的左侧或右侧,则Pi点为凸包的下一顶点Pi点加入凸包列表
GoTo 1
End If
Next
Exit Do
1:
Loop
此过程执行后,点按极角自动顺时针或逆时针排序,只需要按任意两点的次序就可以了。

而左侧或右侧的判断可以用前述的矢量点积性质实现。

文件下载。

机器人碰撞检测原理

机器人碰撞检测原理

机器人碰撞检测原理机器人碰撞检测原理随着工业4.0的到来,机器人正逐渐取代人类完成一些重复性高、操作相对简单的任务。

机器人可以全天候、不停歇地进行工作,甚至比人类更加精准、高效。

但是在工业自动化中,机器人的碰撞问题也逐渐成为了一个需要重视的问题,因为机器人一旦发生碰撞,不仅会对周围的设备和设施造成损害,还会威胁到员工的安全。

因此,机器人碰撞检测技术成为工业界广泛关注的热点。

机器人碰撞检测的原理是通过传感器对机器人的位置和姿态进行实时检测,及时发现或预测机器人的碰撞风险,提前采取应对措施,避免事故的发生。

针对机器人碰撞检测,目前国内外主要采用以下几种原理:1. 基于旁路式力传感器原理旁路式力传感器又称触觉传感器,它是一种能够测量机器人末端执行器向机器人碰撞物体施加的力和力矩的传感器。

当机器人运动中发生碰撞时,会产生瞬间的冲击力和力矩,传感器会通过测量机器人末端执行器传递的力和力矩信息,判断出机器人的碰撞方向和强度,并及时采取安全措施。

2. 基于视觉碰撞检测原理视觉检测是一种较为先进的检测技术,它可以通过机器人的摄像头或激光雷达,实时捕捉机器人周边环境中的物体信息,从而及时预测或检测出机器人的运动路线是否存在碰撞风险。

视觉检测技术的优点是灵敏度高,能够检测到机器人与物体之间距离的微小变化,但其劣势是需要设备的摆放和环境光线等因素会影响其检测精度。

3. 基于声波碰撞检测原理声波碰撞检测原理是通过利用超声波传感器来检测机器人运动中是否存在碰撞风险,它能够实时监测机器人的运动轨迹,发现运动上出现的异常状况。

当机器人运动中遇到障碍物时,超声波传感器会发现障碍物,并及时发送信号给机器人主控制器,控制机器人安全停止,从而避免碰撞的发生。

4. 基于光学碰撞检测原理光学碰撞检测利用机器人周边环境中可见的光线及传感器进行检测。

机器人周围装有红外光、激光光束或光网格等,当机器人运动中偏离预设轨迹时,光线会遭受阻挡或额外的反射,从而传感器监测到运动上的异常状况,并向机器人主控制器发送信号,控制机器人停止或改变运动方向。

3d碰撞检测公式_解释说明以及概述

3d碰撞检测公式_解释说明以及概述

3d碰撞检测公式解释说明以及概述1. 引言1.1 概述在计算机图形学和虚拟现实领域中,碰撞检测是一个关键的概念。

它用于判断模型、物体或粒子之间是否发生了碰撞,并在碰撞发生时进行相应的处理。

而3D 碰撞检测则是在三维空间中进行碰撞检测的一种技术。

1.2 文章结构本文将以以下方式组织内容:首先介绍3D碰撞检测的定义和应用领域。

接着,我们将详细解释常用的3D碰撞检测算法和公式,包括其基本原理和数学基础。

最后,我们将通过实际案例和应用示例来分析这些算法和公式在实践中的应用效果。

1.3 目的本文旨在提供对于3D碰撞检测公式的全面解释说明并概述相关内容。

希望通过阐述其基本原理、常用算法以及具体应用案例,读者能够深入理解3D碰撞检测的工作原理及其在各个领域中的重要性。

同时,我们也致力于探讨未来可能的研究方向和发展趋势,以期推动该领域的发展和创新。

2. 3D碰撞检测公式解释说明:2.1 什么是3D碰撞检测:在计算机图形学和游戏开发中,3D碰撞检测是一种用于判断物体是否相交或触碰到其他物体的技术。

它可以应用在虚拟现实、模拟仿真、游戏物理引擎等领域。

2.2 碰撞检测的应用领域:3D碰撞检测广泛应用于各种领域,例如电子游戏中的角色碰撞、场景中物体的重叠、交通仿真中车辆的碰撞等。

它为模拟真实世界中的物体行为提供了必要的信息,并且对于增强用户体验和提升应用效果至关重要。

2.3 常用的3D碰撞检测算法和公式:在进行3D碰撞检测时,常用的方法包括包围盒检测、距离函数法、光线投射法等。

其中,包围盒检测是一种简单有效的方法,它利用一个立方体或长方体将物体包围起来,并通过比较边界框之间是否存在重叠来判断是否碰撞。

距离函数法则通过计算两个物体之间的最短距离,从而判断是否相交。

而光线投射法则利用射线与物体表面的交点来进行碰撞检测。

在碰撞检测中,常用的数学公式包括向量点乘、向量叉乘、矩阵变换等。

向量点乘可以用来计算两个向量之间的夹角和投影关系,从而判断两个物体之间的相对方位。

aabb碰撞检测算法

aabb碰撞检测算法

aabb碰撞检测算法碰撞检测是实时渲染和游戏引擎中的重要部分,其中包括了许多种算法和技术。

aabb碰撞检测算法是其中最基础和常用的一种算法。

下面将会介绍aabb碰撞检测算法的原理和实现方式。

一、aabb碰撞检测算法概述aabb碰撞检测算法的全称是Axis Aligned Bounding Box,意味着轴对齐的边界框。

该算法通过把物体包裹在一个轴对齐的矩形框中,来检测两个物体是否相交或碰撞。

这个矩形框包含了物体的全部或部分区域,这样就可以快速的进行碰撞检测。

二、aabb碰撞检测算法原理aabb碰撞检测算法的原理很简单:首先,对每个物体建立aabb盒,然后检查这些盒子是否相交,如果相交,则说明两个物体碰撞了。

三、aabb碰撞检测算法实现aabb碰撞检测算法的实现可以通过以下步骤完成:1. 建立aabb盒。

对于一个物体,可以通过以下方式建立aabb盒:- 获取物体中心点坐标x,y和z。

- 获取物体长度、宽度和高度。

- 根据上述信息计算出物体的最小点min(x,y,z)和最大点max(x,y,z),以便构建aabb盒。

2. 碰撞检测。

对于两个物体A和B,进行碰撞检测可以通过以下方式完成:- 检测A的aabb盒是否与B的aabb盒相交。

- 如果相交,那么可以认为A和B碰撞了。

- 如果不相交,那么可以认为A和B没有碰撞。

3. 优化。

为了提高aabb碰撞检测算法的效率和性能,可以采用以下优化方法:- 对于一个物体,可以通过分层处理的方式进行碰撞检测,每层物体可能会包含多个子物体,这样可以把同层物体的aabb盒相交的检测转换成子物体之间的aabb盒相交检测。

- 使用空间分区算法,如Quadtree、Octree、BVH等,在检测碰撞时只检查与当前物体相邻的物体,这样可以减少不必要的碰撞检测,提高效率。

以上就是关于aabb碰撞检测算法的原理和实现方式的介绍。

这种算法虽然简单,但是非常实用,并且可以与其他算法一起使用,进一步提高碰撞检测的精度和效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

碰撞检测技术 碰撞检测技术2011-05-06 23:00 技术--引擎2008-09-05 19:50:55阅读251 10.3碰撞检测技术 到目前为止,构造的各种对象都是相互独立的,在场景中漫游各种物体,墙壁、树木对玩家(视点)好像是虚设,可以任意从其中穿越。为了使场景人物更加完善,还需要使用碰撞检测技术。

10.3.1碰撞检测技术简介 无论是PC游戏,还是移动应用,碰撞检测始终是程序开发的难点,甚至可以用碰撞检测作为衡量游戏引擎是否完善的标准。

好的碰撞检测要求人物在场景中可以平滑移动,遇到一定高度的台阶可以自动上去,而过高的台阶则把人物挡住,遇到斜率较小的斜坡可以上去,斜率过大则会把人物挡住,在各种前进方向被挡住的情况下都要尽可能地让人物沿合理的方向滑动而不是被迫停下。

在满足这些要求的同时还要做到足够精确和稳定,防止人物在特殊情况下穿墙而掉出场景。

做碰撞检测时,该技术的重要性容易被人忽视,因为这符合日常生活中的常识。如果出现Bug,很容易被人发现,例如人物无缘无故被卡住不能前进或者人物穿越了障碍。所以,碰撞检测是让很多程序员头疼的算法,算法复杂,容易出错。

对于移动终端有限的运算能力,几乎不可能检测每个物体的多边形和顶点的穿透,那样的运算量对手机等设备来讲是不可完成的,所以移动游戏上使用的碰撞检测不可能使用太精确的检测,而且对于3D碰撞检测问题,还没有几乎完美的解决方案。目前只能根据需要来取舍运算速度和精确性。 目前成功商业3D游戏普遍采用的碰撞检测是BSP树及AABB(axially aligned bounding box)包装盒(球)方式。简单地讲,AABB检测法就是采用一个描述用的立方体或者球形体包裹住3D物体对象的整体(或者是主要部分),之后根据包装盒的距离、位置等信息来计算是否发生碰撞,如图10-24所示。

除了球体和正方体以外,其他形状也可以作包装盒,但是相比计算量和方便性来讲还是立方体和球体更方便些,所以其他形状的包装只用在一些特殊场合使用。BSP树是用来控制检测顺序和方向的数据描述。

在一个游戏场景中可能存在很多物体,它们之间大多属于较远位置或者相对无关的状态,一个物体的碰撞运算没必要遍历这些物体,同时还可以节省重要的时间。

如果使用单步碰撞检测,需要注意当时间步长较大时会发生两个物体完全穿透而算法却未检测出来的问题,如图10-25所示。其解决方案是产生一个4D空间,在物体运动的开始和结束时间之间产生一个4D超多面体,用于穿透测试。

图10-24 AABB包装盒图10-25碰撞检测的单步失控和4D测试 读者在程序开发初期有必要对碰撞检测有一个初步的估计,以免最后把大量精力消耗在碰撞检测问题上,从而降低了在基础的图形编程之上的注意力。

10.3.2球体碰撞检测 真实的物理模拟系统需要非常精确的碰撞检测算法,但是游戏中常常只需要较为简单的碰撞检测,因为只需要知道物体什么时候发生碰撞,而不用知道模型的哪个多边形发生了碰撞,因此可以将不规则的物体投影成较规则的物体进行碰撞检测。

球体只有一个自由度,其碰撞检测是最简单的数学模型,我们只需要知道两个球体的球心和半径就能进行检测。

那么球体碰撞是如何工作的?主要过程如下。 n计算两个物体中心之间的距离,并且将其与两个球体的半径和进行比较。 n如果距离大于半径和,则没有发生碰撞。 n否则,如果距离小于半径和,则发生了物体碰撞。 考虑由球心c1、c2和半径r1、r2定义的两个球,如图10-26所示。设d为球心间的距离。很明显,当dd2<(r1+r2)2,可以避免包括计算d在内的平方根运算。

对两个运动的球进行碰撞检测要麻烦一些,假设两个球的运动向量为d1和d2,球与位移向量是一一对应的,它们描述了所讨论时间段中的运动方式。

事实上,物体的运动是相对的,例如两列在两条平行轨道上相向行驶的火车,在其中一列中观察,对方的速度是两车速度之和。同样,也可以从第一个球的角度来简化问题,假设第一个球是"静止"的,另一个是"运动"的,那么该运动向量等于原向量d1和d2之差,如图10-27所示。

图10-27动态球的检测过程 球体碰撞的优点是非常适用于需要快速检测的游戏,因为它不需要精确的碰撞检测算法。执行速度相对较快,不会给CPU带来过大的计算负担。

球体碰撞的另一个劣势是只适用于近似球形物体,如果物体非常窄或者非常宽,该碰撞检测算法将会失效,因为会在物体实际发生碰撞之前,碰撞检测系统就发出碰撞信号,如图10-28所示是球体碰撞检测中可能出现的坏情况,其解决方法是缩小检测半径,或者使用其他检测模型,如图10-29所示。

图10-28球体碰撞的坏情况图10-29缩小检测半径 为了解决包容球精确度不高的问题,人们又提出了球体树的方法。 球体树实际上是一种表达3D物体的层次结构。对一个形状复杂的3D物体,先用一个大球体包容整个物体,然后对物体的各个主要部分用小一点的球体来表示,然后对更小的细节用更小的包容球体,这些球体和它们之间的层次关系就形成了一个球体树。 举例来说,对一个游戏中的人物角色,可以用一个大球来表示整个人,然后用中等大小的球体来表示四肢和躯干,然后用更小的球体来表示手脚等。这样在对两个物体进行碰撞检测时,先比较两个最大的球体。

如果有重叠,则沿树结构向下遍历,对小一点的球体进行比较,直到没有任何球体重叠,或者到了最小的球体,这个最小的球体所包含的部分就是碰撞的部分,如图10-30所示。

10.3.3 AABB立方体边界框检测 用球体去近似地代表物体运算量很小,但在游戏中的大多数物体是方的或者长条形的,应该用方盒来代表物体。另一种常见的检测模型是立方体边界框,如图10-31展示了一个AABB检测盒和它里面的物体。

坐标轴平行(Axially-aligned)不仅指盒体与世界坐标轴平行,同时也指盒体的每个面都和一条坐标轴垂直,这样一个基本信息就能减少转换盒体时操作的次数。AABB技术在当今的许多游戏中都得到了应用,开发者经常用它们作为模型的检测模型,再次指出,提高精度的同时也会降低速度。

因为AABB总是与坐标轴平行,不能在旋转物体时简单地旋转AABB,而是应该在每一帧都重新计算。如果知道每个对象的内容,这个计算就不算困难,也不会降低游戏的速度。然而,还面临着精度的问题。

假如有一个3D的细长刚性直棒,并且要在每一帧动画中都重建它的AABB。可以看到每一帧中的包装盒都不一样而且精度也会随之改变,如图10-32所示。

图10-31 3D模型与AABB检测盒图10-32不同方向的AABB 可以注意到AABB对物体的方向很敏感,同一物体的不同方向,AABB也可能不同(由于球体只有一个自由度,所以检测球对物体方向不敏感)。

当物体在场景中移动时,它的AABB也需要随之移动,当物体发生旋转时,有两种选择:用变换后的物体来重新计算AABB,或者对AABB做和物体同样的变换。 如果物体没有发生扭曲,可以通过"变换后的AABB"重新计算,因为该方法要比通过"变换后的物体"计算快得多,因为AABB只有8个顶点。变换AABB得出新的AABB要比变换物体的运算量小,但是也会带来一定的误差,如图10-33所示。

比较图中原AABB(灰色部分)和新AABB(右边比较大的方框),它是通过旋转后的AABB计算得到的,新AABB几乎是原来AABB的两倍,注意,如果从旋转后的物体而不是旋转后的AABB来计算新AABB,它的大小将和原来的AABB相同。

先介绍AABB的表达方法,AABB内的点满足以下条件: xmin≤x≤xmax ymin≤y≤ymax zmin≤z≤zmax 因此只需要知道两个特别重要的顶点(xmin,ymin,zmin)、(xmax,ymax,zmax),记作:

float min=new float{0.0f,0.0f,0.0f}; float max=new float{0.0f,0.0f,0.0f}; 中心点是两个顶点的中点,代表了包装盒的质点。 float center=new float{0.0f,0.0f,0.0f}; 中心点的计算方法如下: float center(){ center[0]=(min[0]+max[0])*0.5f; center[1]=(min[1]+max[1])*0.5f; center[2]=(min[2]+max[2])*0.5f; return center; 通过这两个顶点可以知道以下属性。 float xSize(){return(max[0]-min[0]);} float ySize(){return(max[1]-min[1]);} float zSize(){return(max[2]-min[2]);} float size(){return(max[0]-min[0])*(max[1]-min[1])*(max[2]-min[2]);}

当添加一个顶点到包装盒时,需要先与这两个顶点进行比较。 void add(float p){ if(p[0]min[0])min[0]=p[0]; if(p[0]max[0])max[0]=p[0]; if(p[1]min[1])min[1]=p[1]; if(p[1]max[1])max[1]=p[1]; if(p[2]min[2])min[2]=p[2]; if(p[2]max[2])max[2]=p[2]; 检测包装盒是否为空,可以将这两个顶点进行比较。 boolean isEmpty(){ return(min[0]max[0])||(min[1]max[1])||(min[2]max[2]); 检测某个点是否属于AABB范围之内的代码如下: boolean contains(float p){ return (p[0]=min[0])&&(p[0]=max[0])&&

相关文档
最新文档