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桥梁,聚合团队。
本学习分享资料不得用于商业用途,仅做学习交流!!如有侵权立即删除!!