当前位置: 首页 > ds >正文

Learning vtkjs之OBBTree

OBBTree 包围盒

介绍

1. OBBTree的定义和基本概念

OBBTree是一种层次化的空间分割结构,其核心是“有向包围盒”(Oriented Bounding Box,OBB)。与传统的轴对齐包围盒(AABB)不同,OBB可以根据对象的形状和方向进行旋转,从而更紧密地包围目标对象,减少包围盒之间的重叠区域。

层次化结构:OBBTree通常以二叉树的形式组织,每个节点包含一个OBB,用于包围其子节点的几何体。树的根节点代表整个对象的粗略包围盒,而叶节点则对应对象的局部细节。

优点:相比AABB,OBB可以更准确地描述复杂形状,从而减少碰撞检测中的误判和计算量。

2. OBBTree的主要用途

OBBTree在以下场景中具有重要作用:

碰撞检测:OBBTree常用于中阶段的碰撞检测(mid-phase collision detection),快速判断两个对象是否可能发生碰撞。例如,在游戏开发中,OBBTree可以快速排除不可能碰撞的几何体,从而减少后续精细检测的计算量。

光线与多边形网格的交点计算:OBBTree可以高效地判断光线(或线段)与多边形网格的交点。例如,在三维渲染中,OBBTree能够快速定位光线与场景中对象的交点。

机器人运动规划:在机器人路径规划中,OBBTree用于检测机器人与周围环境的潜在碰撞,从而优化路径选择。

效果

在这里插入图片描述

核心代码

主要流程

	const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({background: [0, 0, 0],rootContainer: vtkContainerRef.current,});const renderer = fullScreenRenderer.getRenderer();const renderWindow = fullScreenRenderer.getRenderWindow();context.current = {renderer,renderWindow,};const source1 = vtkArrowSource.newInstance({ direction: [1, 0, 0] });source1.update();const source2 = vtkArrowSource.newInstance({ direction: [0, 1, 1] });source2.update();showAndIntersect(source1.getOutputData(), source2.getOutputData(), true);

相交

	function showAndIntersect(mesh1, mesh2, triangulate = false) {const { renderer, renderWindow } = context.current;const obbTree1 = addMesh(mesh1, null, triangulate);const obbTree2 = addMesh(mesh2, null, triangulate);const intersection = {obbTree1: obbTree2,intersectionLines: vtkPolyData.newInstance(),};const intersect = obbTree1.intersectWithOBBTree(obbTree2,null,obbTree1.findTriangleIntersections.bind(null, intersection));console.log("obbs are intersected : ", intersect);const tubeFilter = vtkTubeFilter.newInstance();tubeFilter.setInputData(intersection.intersectionLines);tubeFilter.setRadius(0.01);tubeFilter.update();const intesectionActor = render(tubeFilter.getOutputData());renderer.addActor(intesectionActor);intesectionActor.getProperty().setColor(1, 0, 0);intesectionActor.getMapper().setResolveCoincidentTopologyToPolygonOffset();intesectionActor.getMapper().setResolveCoincidentTopologyLineOffsetParameters(-1, -1);renderer.resetCamera();renderer.resetCameraClippingRange();renderWindow.render();}

全部代码都放到github上了
新坑_Learning vtkjs_git地址
关注我,我持续更新vtkjs的example学习案例

也欢迎各位给我提意见,技术交流~

大鸿

WeChat : HugeYen
WeChat Public Account : BIM树洞

做一个静谧的树洞君

用建筑的语言描述IT事物;

用IT的思维解决建筑问题;

共建BIM桥梁,聚合团队。

本学习分享资料不得用于商业用途,仅做学习交流!!如有侵权立即删除!!

http://www.xdnf.cn/news/3556.html

相关文章:

  • 油气地震资料数据中“照明”的含义
  • 2024 网络安全回顾与 2025 展望:守护数字世界的新征程
  • 2025五一杯数学建模竞赛C题 社交媒体用户分析 保姆级教程讲解|模型讲解
  • 【Leetcode 每日一题】2071. 你可以安排的最多任务数目
  • 【瑞萨RA4L1-SENSOR套件测评】LCD 自定义数字显示
  • Adam(Adaptive Moment Estimation)
  • windows电脑端SSH连接开termux的安卓端
  • 字符串格式漏洞-[第五空间2019 决赛]PWN5
  • 【 Node.js】 Node.js安装
  • 【无标题】linux的多进程讲解
  • C#中的LINQ:简化数据查询与操作
  • 梳理顶会论文相关的经验贴
  • Linux Shell 重定向与管道符号(>, >>, |)的实现机制
  • GD32F407单片机开发入门(二十五)HC-SR04超声波模块测距实战含源码
  • epoll函数
  • Perforated Backpropagation:神经网络优化的创新技术及PyTorch使用指南
  • TensorFlow深度学习实战——基于循环神经网络的情感分析模型
  • 多模态大语言模型arxiv论文略读(五十二)
  • LangChain4j +DeepSeek大模型应用开发——6 提示词
  • Nginx 核心功能02
  • 小米首个推理大模型开源——Xiaomi MiMo,为推理而战!
  • 体系学习1:C语言与指针1——预定义、进制打印、传参为数组
  • python多进程的使用
  • 机器视觉开发-摄像头扫描二维码
  • 2025五一数学建模C题完整分析论文(共36页)(含模型、可运行代码、数据)
  • 嵌入式产品运行中数据丢失怎么办?
  • SpringBoot云端日记本系统开发实现
  • 记录搭建自己的应用中心-需求看板搭建
  • DeepSeek V3 训练策略:FP8混合精度与多Token预测
  • 电子病历高质量语料库构建方法与架构项目(环境聆听与自动化文档生成篇)