使用 THREE.js 进行边界体积碰撞检测

news2024/11/22 22:04:23
推荐:使用 NSDT场景编辑器 快速搭建3D应用场景

使用 Box3 和 Sphere

三.js具有表示数学体积和形状的对象 - 对于3D AABB和边界球体,我们可以使用Box3Sphere对象。实例化后,它们具有可用于针对其他卷进行交集测试的方法。

实例化盒子

要创建 Box3 实例,我们需要提供盒子的下限和上限。通常,我们希望这个AABB被“链接”到我们3D世界中的对象(如角色)。在 Three.js 中,实例具有对象的属性和边界。请记住,为了定义此属性,您需要事先手动调用。GeometryboundingBoxminmaxGeometry.computeBoundingBox

.JS复制到剪贴板

const knot = new THREE.Mesh(
  new THREE.TorusKnotGeometry(0.5, 0.1),
  new MeshNormalMaterial({}),
);

knot.geometry.computeBoundingBox();
const knotBBox = new Box3(
  knot.geometry.boundingBox.min,
  knot.geometry.boundingBox.max,
);

注意:该属性将自身作为引用,而不是 .因此,在计算计算框时,应用于 的任何转换(例如比例、位置等)都将被忽略。boundingBoxGeometryMeshMesh

解决上一个问题的更简单的替代方法是稍后使用 设置这些边界,这将计算尺寸,同时考虑 3D 实体的变换任何子网格Box3.setFromObject

.JS复制到剪贴板

const knot = new THREE.Mesh(
  new THREE.TorusKnotGeometry(0.5, 0.1),
  new MeshNormalMaterial({}),
);

const knotBBox = new Box3(new THREE.Vector3(), new THREE.Vector3());
knotBBox.setFromObject(knot);

实例化球体

实例化 Sphere 对象与此类似。我们需要提供球体的中心和半径,可以将其添加到 中可用的属性中。boundingSphereGeometry

.JS复制到剪贴板

const knot = new THREE.Mesh(
  new THREE.TorusKnotGeometry(0.5, 0.1),
  new MeshNormalMaterial({}),
);

const knotBSphere = new Sphere(
  knot.position,
  knot.geometry.boundingSphere.radius,
);

遗憾的是,没有等效的 Sphere 实例。因此,如果我们应用变换或更改位置 ,我们需要手动更新边界球体。例如:Box3.setFromObjectMesh

.JS复制到剪贴板

knot.scale.set(2, 2, 2);
knotBSphere.radius = knot.geometry.radius * 2;

交叉测试

点与Box3 / Sphere

两者都有一个包含点方法来执行此测试。Box3Sphere

.JS复制到剪贴板

const point = new THREE.Vector3(2, 4, 7);
knotBBox.containsPoint(point);

Box3Box3

Box3.intersectsBox 方法可用于执行此测试。

.JS复制到剪贴板

knotBbox.intersectsBox(otherBox);

注意:这与检查 Box3 是否完全包装另一个的方法不同。Box3.containsBox

SphereSphere

与以前类似的方式,有一个 Sphere.intersectsSphere 方法来执行此测试。

.JS复制到剪贴板

knotBSphere.intersectsSphere(otherSphere);

SphereBox3

不幸的是,这个测试没有在 Three.js 中实现,但我们可以修补 Sphere 以实现 Sphere 与 AABB 交集算法。

.JS复制到剪贴板

// expand THREE.js Sphere to support collision tests vs. Box3
// we are creating a vector outside the method scope to
// avoid spawning a new instance of Vector3 on every check

THREE.Sphere.__closest = new THREE.Vector3();
THREE.Sphere.prototype.intersectsBox = function (box) {
  // get box closest point to sphere center by clamping
  THREE.Sphere.__closest.set(this.center.x, this.center.y, this.center.z);
  THREE.Sphere.__closest.clamp(box.min, box.max);

  const distance = this.center.distanceToSquared(THREE.Sphere.__closest);
  return distance < this.radius * this.radius;
};

演示

我们准备了一些现场演示来演示这些技术,并提供了要检查的源代码。

  • 点与盒和球体
  • 盒子与盒子和球体
  • 球体与盒子和球体

A knot object, a large sphere object and a small sphere object in 3-D space. Three vectors are drawn on the small sphere. The vectors point in the directions of the three axes that define the space. Text at the bottom reads: Drag the ball around.

使用 BoxHelper

作为使用 raw 和 object 的替代方法,Three.js 有一个有用的对象,可以更轻松地处理边界框:BoxHelper(以前已弃用)。此帮助程序获取并为其计算边界框体积(包括其子网格)。这将生成一个表示边界框的新框,该框显示边界框的形状,并且可以传递给前面看到的方法,以便使边界框与 .Box3SphereBoundingBoxHelperMeshMeshsetFromObjectMesh

BoxHelper是处理 Three.js 中边界体积的 3D 碰撞的推荐方法。你会错过球体测试,但权衡是非常值得的。

使用此帮助程序的优点是:

  • 它有一个方法,如果链接的网格旋转或更改其尺寸,它将调整其边界框网格的大小,并更新其位置update()
  • 它在计算边界框的大小时会考虑子网格,因此原始网格及其所有子网格都已包装。
  • 我们可以通过渲染创建的 es 来轻松调试碰撞。默认情况下,它们是使用材质(用于绘制线框样式几何图形的三.js材质)创建的。MeshBoxHelperLineBasicMaterial

主要缺点是它只创建框边界体积,所以如果你需要球体与 AABB 测试,你需要创建自己的对象。Sphere

要使用它,我们需要创建一个新实例并提供几何体和(可选)将用于线框材料的颜色。我们还需要将新创建的对象添加到场景中才能渲染它。我们假设我们的场景变量被调用。BoxHelperthree.jsscene

.JS复制到剪贴板

const knot = new THREE.Mesh(
  new THREE.TorusKnotGeometry(0.5, 0.1),
  new THREE.MeshNormalMaterial({}),
);
const knotBoxHelper = new THREE.BoxHelper(knot, 0x00ff00);
scene.add(knotBoxHelper);

为了也拥有我们的实际边界框,我们创建了一个新对象并使其具有 的形状和位置。Box3Box3BoxHelper

.JS复制到剪贴板

const box3 = new THREE.Box3();
box3.setFromObject(knotBoxHelper);

如果我们更改位置、旋转、缩放等,我们需要调用该方法,以便实例与其链接匹配。我们还需要再次调用才能使 .Meshupdate()BoxHelperMeshsetFromObjectBox3Mesh

.JS复制到剪贴板

knot.position.set(-3, 2, 1);
knot.rotation.x = -Math.PI / 4;
// update the bounding box so it stills wraps the knot
knotBoxHelper.update();
box3.setFromObject(knotBoxHelper);

执行碰撞测试的方式与上一节中解释的方式相同 — 我们使用 Box3 对象的方式与上述相同。

.JS复制到剪贴板

// box vs. box
box3.intersectsBox(otherBox3);
// box vs. point
box3.containsPoint(point.position);

演示

您可以在我们的现场演示页面上查看两个演示。第一个展示了使用 .第二个执行盒与盒测试。BoxHelper

A knot object, a sphere object and a cube object in 3-D space. The knot and the sphere are encompassed by a virtual bounding box. The cube is intersecting the bounding box of the sphere. Text at the bottom reads: Drag the cube around. Press Esc to toggle B-Boxes.

原文链接:使用 THREE.js 进行边界体积碰撞检测 (mvrlink.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/964626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zabbix 部署

1.zabbix简介 Zabbix 软件能够监控众多网络参数和服务器的健康度、完整性。Zabbix 使用灵活的告警机制&#xff0c;允许用 户为几乎任何事件配置基于邮件的告警。这样用户可以快速响应服务器问题。Zabbix 基于存储的数据 提供出色的报表和数据可视化功能。这些功能使得 Zabbix…

Cmake qt ,vtkDataArray.cxx.obj: File too big

解决方法&#xff1a; Qt4 在pro 加入“QMAKE_CXXFLAGS -BigObj” 可以解决 Qt5 在网上用“-Wa,-mbig-obj” 不能解决&#xff0c;最后通过“QMAKE_CXXFLAGS -Ofast -flto”解决问题。 Qt4 在pro 加入“QMAKE_CXXFLAGS -BigObj” 可以解决Qt5 在网上用“-Wa,-mbig-obj” …

aop中获取@PathVariable参数

1.controller中的声明 2.aop中获取 RequestAttributes attributes RequestContextHolder.getRequestAttributes(); ServletRequestAttributes servletRequestAttributes (ServletRequestAttributes)attributes; HttpServletRequest request servletRequestAttributes.getReq…

漏洞修复:在应用程序中发现不必要的 Http 响应头

描述 blablabla描述&#xff0c;一般是在返回的响应表头中出现了Server键值对&#xff0c;那我们要做的就是移除它&#xff0c;解决方案中提供了nginx的解决方案 解决方案 第一种解决方案 当前解决方案会隐藏nginx的版本号&#xff0c;但还是会返回nginx字样&#xff0c;如…

WordPress关注公众号可见内容插件源码

Wordpress公众号引流工具——关注公众号可见内容插件推荐 通过关注微信公众号&#xff0c;获取随机验证码从而获得隐藏文本的访问权限。 插件特点 隐藏内容扫码关注获取验证码 可以作为引流公众号 支持无必须API接口&#xff0c;无备案域名也可以 自定义验证接口URL 自定…

每天一道动态规划之第四天

一、与字符串相关的动态规划 1.1题目 给定一个字符串str&#xff0c;给定一个字符串类型的数组arr&#xff0c;出现的字符都是小写英文arr每一个字符串&#xff0c;代表一张贴纸&#xff0c;你可以把单个字符剪开使用&#xff0c;目的是拼出str来返回需要至少多少张贴纸可以完…

vue第1篇前端的发展历史

一 vue的发展历史 1.1 vue vue是一个渐进式的javascript框架&#xff0c;Vue 的核心库只关注视图层&#xff0c;方便与第三方库或既有项目整合。 1.2 前端知识核心快捷汇总 Soc原则&#xff1a;关注点分离原则 HTML CSS JS : 视图 &#xff1a; 刷新后端提供的数据展示…

经管博士科研基础【16】一元二次函数的解的公式

1. 一元二次函数的形式 2. 一元二次函数的图形与性质 一元二次函数的图像是一条抛物线&#xff0c;图像定点公式为(-b/2a,4ac-b*b/4a)&#xff0c;对称轴位直线x-b/2a。 3. 求根公式 形如ax*xb*xc0的一元二次方程&#xff0c;其求根公式为&#xff1a; 4. 韦达定理 如果x1和…

财报解读:份额企稳、均价上浮,小米高端化驶入正轨?

时隔半个月&#xff0c;在雷军那场颇有反响的以“成长”为主题的个人演讲之后&#xff0c;小米发布了今年二季度财报。二季报中亮眼的财务数据&#xff0c;为雷军的演讲提供了一份更加有力的注解&#xff0c;小米经过三年探索&#xff0c;似乎已经找到了高端化的诀窍&#xff0…

C++:日期类

学习目标&#xff1a; 加深对四个默认构造函数的理解&#xff1a; 1.构造函数 2.析构函数 3.拷贝构造 4.运算符重载 实现功能 1.比较日期的大小 2.日期-天数 3.前/后置&#xff0c;-- 这里基本会使用运算符重载 定义一个日期类 class Date { public://1.全缺省参数的构造函数Da…

Ubuntu的C++环境配置

文章目录 1. 如果没有配置C环境会有情况出现2. Ubuntu的C环境配置方法 上篇介绍了Ubuntu中安装和配置QtCreator&#xff0c;下来将会介绍C的相关内容。 C的简介此处不做介绍。 想要在Ubuntu上运行C程序&#xff0c;首先需要先配置好C环境。 1. 如果没有配置C环境会有情况出现…

WEB项目利用Eclipse打包成war包并部署在CentOS8

1、Eclipse把WEB项目打包成war包 2、Xftp上传war包到Linux中安装Tomcat的webapps目录 /usr/local/tomcat/apache-tomcat-9.0.80/webapps3、利用IP地址访问部署的项目 在CentOS中可用 ifconfig找到对应的IP地址 http://192.168.122.2:8080/CentOS-Web/index.html

基于SSM的物资管理系统的设计与实现(论文+源码)_kaic

【摘 要】此物资管理系统是针对生产型企业开发的。通过分析企业的实际管理工作中存在的问题&#xff0c;与管理系统开发的详细步骤及系统开发的原理&#xff0c;并利用计算机的运算速度快、存储容量大、处理逻辑问题强等优点&#xff0c;将管理工作与计算机结合起来。根据管理工…

【文心一言】学习笔记

学习资料 《听说文心一言App霸榜了&#xff0c;那必须来一波全方位实测了》 情感陪伴&#xff1a;文心一言 App 可以充当用户的情感树洞&#xff0c;提供知心姐姐、【暖男】等角色扮演&#xff0c;为用户提供情绪疏导、情感分析、约会建议等服务。 1. 模型属性 【提示词工具…

leetcode:1710. 卡车上的最大单元数(python3解法)

难度&#xff1a;简单 请你将一些箱子装在 一辆卡车 上。给你一个二维数组 boxTypes &#xff0c;其中 boxTypes[i] [numberOfBoxesi, numberOfUnitsPerBoxi] &#xff1a; numberOfBoxesi 是类型 i 的箱子的数量。numberOfUnitsPerBoxi 是类型 i 每个箱子可以装载的单元数量。…

C++算法 —— 分治(2)归并

文章目录 1、排序数组2、数组中的逆序对3、计算右侧小于当前元素的个数4、翻转对 1、排序数组 排序数组 排序数组也可以用归并排序来做。 vector<int> tmp;//写成全局是因为如果在每一次小的排序中都创建一次&#xff0c;更消耗时间和空间&#xff0c;设置成全局的就更高…

ROS-4.创建发布者和订阅者

ros中非长连接的通信使用topic的方式&#xff0c;publisher向topic发布消息&#xff0c;subscriber订阅topic消息&#xff0c;对于非应答模式的通信适合使用该模式&#xff0c;如下图 接下来我们实现一个发布者和订阅者 1. 创建功能包 在实现订阅者和发布者的时候我们需要先…

oled--SSD1315驱动

OLED 接口方式&#xff08;由硬件电路确定&#xff09;&#xff1a;6800、8080、spi、i2c. 常见的驱动芯片&#xff1a;ssd1306、ssd1315。 oled屏幕的发光原理不同于lcd&#xff0c;上电后无法直接显示&#xff0c;需要初始化后才能正常显示。 SSD1315手册资料 SSD1315是一款…

微信小程序手机号快速验证组件调用方式

目录 一、测试环境 二、问题现象 三、总结 手机号验证组件&#xff08;包括快速验证组件和实时验证组件&#xff09;调用后无法对事件进行回调这个问题&#xff0c;先说结论&#xff0c;以下是正确的使用方式&#xff1a; <!-- 手机号快速验证组件 --> <button op…

第三章 图像到图像的映射

文章目录 第三章 图像到图像的映射3.1 单应性变换3.1.1 直接线性变换算法3.1.2 仿射变换 3.2 图像扭曲3.2.1 图像中的图像3.2.2 分段仿射扭曲3.2.3 图像配准 3.3 创建全景图3.3.1 RANSAC3.3.2 稳健的单应性矩阵估计3.3.3 拼接图像 第三章 图像到图像的映射 本章讲解…