ViewDesignEngine  3.1.0
高性能 CAD 计算几何引擎
vde::spatial::BVH类 参考

包围盒层次结构 — 三角形网格加速结构 更多...

#include <bvh.h>

类 vde::spatial::BVH 继承关系图:
vde::spatial::BVH 的协作图:

struct  HitResult
 射线最近命中查询结果 更多...
 

Public 成员函数

 BVH (const BVHBuildOptions &opts={})
 构造 BVH 并指定构建选项 更多...
 
void build (const std::vector< Triangle3D > &tris) override
 清除已有数据并重建 BVH 更多...
 
void insert (const Triangle3D &tri) override
 插入单个三角形 更多...
 
bool remove (const Triangle3D &tri) override
 删除三角形 更多...
 
std::vector< Triangle3D > query_range (const AABB3D &range) const override
 AABB 范围查询 更多...
 
std::vector< Triangle3D > query_knn (const Point3D &point, size_t k) const override
 K 近邻查询 更多...
 
std::vector< Triangle3D > query_ray (const Ray3Dd &ray) const override
 射线查询:返回所有命中的三角形 更多...
 
void clear () override
 清空 BVH 树和所有三角形 更多...
 
size_t size () const override
 三角形数量 更多...
 
std::optional< HitResultquery_ray_nearest (const Ray3Dd &ray) const
 射线最近命中查询 更多...
 
- Public 成员函数 继承自 vde::spatial::SpatialIndex< Triangle3D >
virtual ~SpatialIndex ()=default
 

详细描述

包围盒层次结构 — 三角形网格加速结构

BVH 将三角形集合递归划分为嵌套的包围盒树。 每个内部节点存储其子节点包围盒的并集, 叶节点包含不超过 leaf_size 个三角形的引用。

构建时间复杂度 O(n log n),空间 O(n)。 单条射线查询 O(log n),最近命中 O(log n)。

三种分裂策略:

  • Middle: 沿最长轴按包围盒中点一分为二,构建最快但质量一般
  • Equal: 按三角形数量平分,适合均匀分布
  • SAH: 最小化随机射线命中成本期望,构建慢但查询最快(默认)
BVH bvh(BVHBuildOptions{ .strategy = BVHSplitStrategy::SAH, .leaf_size = 8 });
bvh.build(triangles);
auto hit = bvh.query_ray_nearest(ray);
auto near = bvh.query_knn(p, 10);
BVH(const BVHBuildOptions &opts={})
构造 BVH 并指定构建选项
Definition: bvh.h:77
参见
SpatialIndex, Octree, KDTree, RTree

在文件 bvh.h70 行定义.

构造及析构函数说明

◆ BVH()

vde::spatial::BVH::BVH ( const BVHBuildOptions opts = {})
inlineexplicit

构造 BVH 并指定构建选项

参数
opts构建选项(分裂策略、叶节点大小、最大深度)

在文件 bvh.h77 行定义.

成员函数说明

◆ build()

void vde::spatial::BVH::build ( const std::vector< Triangle3D > &  tris)
overridevirtual

清除已有数据并重建 BVH

使用 SAH(或指定策略)自顶向下递归构建。 构建复杂度 O(n log n)。

参数
tris三角形数组

实现了 vde::spatial::SpatialIndex< Triangle3D >.

◆ clear()

void vde::spatial::BVH::clear ( )
overridevirtual

清空 BVH 树和所有三角形

实现了 vde::spatial::SpatialIndex< Triangle3D >.

◆ insert()

void vde::spatial::BVH::insert ( const Triangle3D &  tri)
overridevirtual

插入单个三角形

当前实现:加入图元列表后全量重建。 如需增量插入,建议使用 RTree。

参数
tri要插入的三角形

实现了 vde::spatial::SpatialIndex< Triangle3D >.

◆ query_knn()

std::vector<Triangle3D> vde::spatial::BVH::query_knn ( const Point3D &  point,
size_t  k 
) const
overridevirtual

K 近邻查询

使用最小堆遍历 BVH,按包围盒距离剪枝。

参数
point查询点
k返回数量
返回
最近的 k 个三角形

实现了 vde::spatial::SpatialIndex< Triangle3D >.

◆ query_range()

std::vector<Triangle3D> vde::spatial::BVH::query_range ( const AABB3D &  range) const
overridevirtual

AABB 范围查询

遍历与 range 相交的 BVH 节点,收集叶节点中重叠的三角形。 复杂度 O(log n + k),k 为结果数量。

参数
range查询包围盒
返回
与 range 相交的三角形列表

实现了 vde::spatial::SpatialIndex< Triangle3D >.

◆ query_ray()

std::vector<Triangle3D> vde::spatial::BVH::query_ray ( const Ray3Dd &  ray) const
overridevirtual

射线查询:返回所有命中的三角形

深度优先遍历,收集所有与射线相交的叶节点三角形。 复杂度 O(log n + k)。

参数
ray查询射线
返回
按命中顺序排列的三角形列表

实现了 vde::spatial::SpatialIndex< Triangle3D >.

◆ query_ray_nearest()

std::optional<HitResult> vde::spatial::BVH::query_ray_nearest ( const Ray3Dd &  ray) const

射线最近命中查询

遍历 BVH,维护当前最近 t 值进行剪枝, 返回射线方向上第一个命中的三角形。 典型复杂度 O(log n)。

参数
ray查询射线
返回
最近命中结果(若无命中则返回空)
注解
query_ray() 更高效,仅返回最近命中
if (auto hit = bvh.query_ray_nearest(ray)) {
std::cout << "Hit at t=" << hit->t << ", point=" << hit->point << "\n";
}

◆ remove()

bool vde::spatial::BVH::remove ( const Triangle3D &  tri)
overridevirtual

删除三角形

参数
tri要删除的三角形
返回
删除成功返回 true

实现了 vde::spatial::SpatialIndex< Triangle3D >.

◆ size()

size_t vde::spatial::BVH::size ( ) const
inlineoverridevirtual

三角形数量

返回
当前索引的三角形总数

实现了 vde::spatial::SpatialIndex< Triangle3D >.

在文件 bvh.h150 行定义.


该类的文档由以下文件生成: