113 Three.js的obb (OrientedboundingBox)方向包围盒的使用

一、包围盒简介:

包围盒是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤(即当包围体碰撞,才进行精确碰撞检测和处理)。包围体类型包括球体、轴对齐包围盒(AABB)、有向包围盒(OBB)、8-DOP以及凸壳。

包围盒广泛地应用于碰撞检测,比如射击、点击、相撞等,每一个物体都有自己的包围盒。因为包围盒一般为规则物体,因此用它来代替物体本身进行计算,会比直接用物体本身更加高效和简单。

在这里插入图片描述
目前广泛应用的是AABB和OBB包围盒,其中AABB包围盒更常见。因为它的生成方法很简单,因它与坐标轴是对齐的。但它也有不足,它不随物体旋转,可以看出当图中的老虎沿着Z轴方向站立时,AABB包围盒还和老虎比较贴合,但当老虎转了一个角度后,AABB包围盒便增加了较大的空隙,对于较精确的碰撞检测效果不太好。这时就需要OBB包围盒,它始终沿着物体的主成分方向生成最小的一个矩形包围盒,可以随物体旋转,可用于较精确的碰撞检测。

以上摘自:https://blog.csdn.net/qing101hua/article/details/53100112

二、 Three.js中的包围盒使用

在three.js中,获取一个模型的包围盒有很多种方法,下面我列一下,我个人经常使用的:
第一种方法,也是最无脑的方法:
实例化一个THREE.Box3,然后用.expandByObject 直接可以获取到此模型的包围盒,而且还能包含它的子对象,官方注释(扩展此包围盒的边界,使得对象及其子对象在包围盒内,包括对象和子对象的世界坐标的变换。)
第二种方法,获取单个几何体的模型的方法:
首先获取到模型的geometry的boundingbox,然后把这个boundingbox乘以模型的世界变换矩阵,就可以实现包围盒的获取。
以上两种,都是获取AABB类型的包围盒,使用简单,理解简单,也好用。

针对于OBB包围盒,今天发现three.js也有相应的封装,文件地址在/examples/jsm/math/OBB.js
官方有demo,可以在我网站上翻一翻,地址:http://wjceo.com/three.js/examples/?q=obb#webgl_math_obb
在这里插入图片描述

你也可以自己打开一个官方的demo搜一下OBB,来查看一下,demo效果就是,如果两个盒子发生了碰撞,就会变成红色,仅此而已。

针对于这个OBB包围盒对象使用,我们需要手动设置其初始的包围盒尺寸,官方的demo没有在初始化的时候直接传值,而是,实例化后,直接设置的尺寸,而且还需要设置包围盒子尺寸的一半,不知道为啥要这么设置:

var obb = new OBB();
obb.halfSize.copy(new THREE.Vector(x, y, z)).multiplyScalar(0.5);

我们可以直接复制一下size的值,然后让每个值乘以0.5,就是一半的盒子。
每个对象都设置了一个OBB对象,那么怎么实现的碰撞检测。官方demo里面是在每一帧的render里面,因为demo里面的模型的几何体都是用的一个默认的几何体盒子,所以,在每一帧里面,模型都先copy了一下几何体的OBB对象,然后再乘以模型的世界矩阵,获取到了模型的OBB包围盒。
我们查看这个OBB.js文件,会发现里面有很多的内置方法,什么和点检测的,面检测碰撞的,和球的,所以,我们只需要调用相应的api即可。
官方demo在render里面,显示更新每个模型的OBB包围盒,然后拿着其中的一个和其它所有的OBB包围盒,通过intersectsOBB方法来检测是否碰撞,如果检测碰撞,直接设置颜色为红色。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: AABB包围是一个长方形子,其各个面都与坐标轴平行。它通常用于快速确定物体是否与另一个物体发生碰撞。 包围球是一个具有固定半径的球形对象,它通常用于包围一个物体或一组物体。包围球可以用于求取物体之间的距离或者相交情况。 方向包围OBB是一个最适合物体形状的子,它可以朝着任意方向旋转。OBB可以用于求取物体之间的碰撞或相交关系。 固定方向凸包FDH是一个凸多边形,它是根据点云构造出来的具有一定厚度的表面。FDH可以用于进行3D渲染或者物体刚体碰撞计算。 希望我的回答能够满足您的需求。如果您还有其他问题,请随时提出。 ### 回答2: AABB包围包围球、方向包围OBB和固定方向凸包FDH是计算机图形学和碰撞检测中常用的表示物体边界的方法。 AABB包围(Axis-Aligned Bounding Box)是一种简单的包围形式,它是通过对象的最小和最大的x、y和z值定义的。AABB包围是一个与坐标轴对齐的长方体。在碰撞检测中,通过比较两个AABB包围之间的位置关系,可以快速判断是否发生碰撞。 包围球是一个以物体中心为原点,半径为半径的球体。它可以更准确地逼近物体形状,但相对于AABB包围来说计算复杂度更高。包围球对于检测是否有物体与其他物体相交很有用。 方向包围OBB(Oriented Bounding Box)是一种能够任意朝向的子。与AABB包围不同,OBB是一个可以在3D空间中旋转的长方体。OBB可以更准确地逼近对象的形状,但相对于AABB包围来说计算复杂度更高。OBB广泛应用于碰撞检测和物体包围等领域。 固定方向凸包FDH(Fixed Direction Convex Hull)是一个定义了对象的最小凸多边形的包围体。它可以通过一系列的向量定义,并且具有固定的朝向。FDH通常用于包围多个物体或者给定一个3D场景的碰撞检测。 ### 回答3: AABB包围(Axis-Aligned Bounding Box)是一种包围物体的立方体框,其边与坐标轴平行。这意味着包围的六个面总是与世界坐标系的坐标轴对齐。AABB包围通常用于快速确定物体之间是否相交,以及进行碰撞检测包围球(Bounding Sphere)是一种包围物体的球体,其半径足够小以便覆盖了整个物体。包围球的中心点位于物体的重心处。包围球常用于确定物体之间的距离,例如在碰撞检测和视锥剔除(Frustum Culling)中使用方向包围OBB(Oriented Bounding Box)是一种包围物体的立方体框,与物体的方向相关。与AABB不同,OBB的边不必与坐标轴平行,其方向可以被旋转调整以适应物体的朝向。OBB在一些模拟和碰撞检测算法中被广泛使用。 固定方向凸包FDH(Fixed-Orientation Convex Hull)是一种凸多边形,其边界能够完全包围物体。FDH通常在较早期的物理引擎中使用,用于对物体进行碰撞检测和坐标转换。通过简单的几何运算,FDH可以更高效地检测碰撞,并提供物体之间的最小接触区域。然而,FDH也有一些局限性,例如无法准确描述非凸物体的形状。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值