RSMesh 1.0.0
一个曲面重构的系统,输入为点云,输出为obj,stl等主流格式的网格文件,使用的方法为径向基函数插值,采取了并行优化、Intel-MKL等优化措施,支持百万级别的点云
载入中...
搜索中...
未找到
isosurface.h
1//
2// Created by RainSure on 2024/2/29.
3//
4
5#ifndef RSMESH_ISOSURFACE_H
6#define RSMESH_ISOSURFACE_H
7
8#include "geometry/bbox3d.h"
9#include "geometry/point3d.h"
10#include "isosurface/mesh_defects_finder.h"
11#include "isosurface/rmt_lattice.h"
12#include "isosurface/rmt_surface.h"
13#include "isosurface/surface.h"
14#include <unordered_set>
15
16
17namespace rsmesh::isosurface {
18 class isosurface {
19 public:
20 isosurface(const geometry::bbox3d& bbox, double resolution) : rmt_lattice_(bbox, resolution) {}
21
22 surface generate(field_function& field_fn, double isovalue = 0.0) {
23 field_fn.set_evaluation_bbox(rmt_lattice_.extended_bbox());
24
25 rmt_lattice_.add_all_nodes(field_fn, isovalue);
26
27 return generate_common();
28 }
29
30 surface generate_from_seed_points(const geometry::points3d& seed_points, field_function& field_fn,
31 double isovalue = 0.0) {
32 field_fn.set_evaluation_bbox(rmt_lattice_.extended_bbox());
33
34 for (auto p : seed_points.rowwise()) {
35 rmt_lattice_.add_cell_contains_point(p);
36 }
37 rmt_lattice_.add_nodes_by_tracking(field_fn, isovalue);
38
39 return generate_common();
40 }
41
42 private:
43 surface generate_common() {
44 rmt_lattice_.cluster_vertices();
45
46 rmt_surface rmt_surf(rmt_lattice_);
47 rmt_surf.generate_surface();
48
49 // Unclustering non-manifold vertices may require a few iterations.
50 while (true) {
51 auto vertices = rmt_lattice_.get_vertices();
52 auto faces = rmt_surf.get_faces();
53 mesh_defects_finder defects(vertices, faces);
54
55 auto vis = defects.singular_vertices();
56 auto fis = defects.intersecting_faces();
57
58 std::unordered_set<vertex_index> vertices_to_uncluster;
59 for (auto vi : vis) {
60 vertices_to_uncluster.insert(vi);
61 }
62 for (auto fi : fis) {
63 auto f = faces.row(fi);
64 vertices_to_uncluster.insert(f(0));
65 vertices_to_uncluster.insert(f(1));
66 vertices_to_uncluster.insert(f(2));
67 }
68
69 rmt_lattice_.uncluster_vertices(vertices_to_uncluster);
70
71 // fis.empty() is not checked as it is not possible to eliminate all self intersections.
72 if (vis.empty()) {
73 break;
74 }
75 }
76
77 surface surf(rmt_lattice_.get_vertices(), rmt_surf.get_faces());
78
79 rmt_lattice_.clear();
80
81 return surf;
82 }
83
84 rmt_lattice rmt_lattice_;
85 };
86}
87
88#endif //RSMESH_ISOSURFACE_H
vectors3d points3d
3维点的集合
Definition point3d.h:48
该命名空间下主要定义了等值面提取相关的类和函数