CARLA
 
载入中...
搜索中...
未找到
MeshReconstruction.h
浏览该文件的文档.
1#pragma once//程序预处理
2#include "DataStructs.h"//这行代码包含了一个名为DataStructs.h的头文件。头文件通常包含函数声明、结构体定义和宏定义等内容。
3#include "Cube.h"//名为Cube.h的头文件
4#include "Triangulation.h"//存储某些信息。
5
6namespace MeshReconstruction// 命名空间 MeshReconstruction,用于网格重建相关的功能
7{
8 ///使用 <a href=“https://en.wikipedia.org/wiki/Marching_cubes”>Marching Cube 从给定的有向距离函数重建三角形网格</a>。
9 ///@param sdf <a href=“http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm”>有符号距离函数</a>。
10 /// @param 域 重建域。
11 /// @returns 重建的网格。
13 Fun3s const &sdf,
14 Rect3 const &domain);
15
16 /// 使用 <a href=“https://en.wikipedia.org/wiki/Marching_cubes”>Marching Cube 从给定的有向距离函数重建三角形网格</a>。
17 ///@param sdf <a href=“http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm”>有符号距离函数</a>。
18 ///@param 域 重建域。
19 /// @param cubeSize 行进立方体的大小。立方体越小,生成的网格分辨率越高。
20 /// @param应对其进行三角剖分的 SDF 的 isoLevel Level 集。更改此值将移动重建的表面。
21 /// @param SDF 的 sdfGrad 梯度,可生成重建网格的顶点法线。如果未提供任何参数,则使用数值近似值。
22 /// @returns 重建的网格。
24 Fun3s const &sdf,
25 Rect3 const &domain,
26 Vec3 const &cubeSize,
27 double isoLevel = 0,
28 Fun3v sdfGrad = nullptr);
29}
30
31using namespace MeshReconstruction;
32using namespace std;
33
34// Adapted from here: http://paulbourke.net/geometry/polygonise/
35
36namespace// 匿名命名空间,用于定义一些仅在当前翻译单元内可见的辅助函数
37{
38// 计算给定函数在某一点的数值梯度。
39// @param f 一个三维函数。
40// @param p 计算梯度的点。
41// @returns 该点处的数值梯度
42 Vec3 NumGrad(Fun3s const &f, Vec3 const &p)
43 {
44 auto const Eps = 1e-6;// 用于计算梯度的微小增量
45 Vec3 epsX{Eps, 0, 0}, epsY{0, Eps, 0}, epsZ{0, 0, Eps};
46// 通过中心差分法计算 x、y、z 方向的偏导数
47 auto gx = (f(p + epsX) - f(p - epsX)) / 2;
48 auto gy = (f(p + epsY) - f(p - epsY)) / 2;
49 auto gz = (f(p + epsZ) - f(p - epsZ)) / 2;
50 return {gx, gy, gz};
51 }
52}
53// 实现命名空间 MeshReconstruction 中的 MarchCube 函数,当只传入有符号距离函数和区域时的版本。
54// 默认情况下,使用一个固定数量的立方体进行重建,并调用另一个接受立方体大小参数的 MarchCube 函数。
56{
57 auto const NumCubes = 50;// 固定的立方体数量
58 auto cubeSize = domain.size * (1.0 / NumCubes);// 计算默认的立方体大小
59
60 return MarchCube(sdf, domain, cubeSize);
61}
62// 实现命名空间 MeshReconstruction 中的 MarchCube 函数,接受更多参数的版本。
64 Fun3s const &sdf,
65 Rect3 const &domain,
66 Vec3 const &cubeSize,
67 double isoLevel,
68 Fun3v sdfGrad)
69{
70 // Default value.
71 sdfGrad = sdfGrad == nullptr
72 ? [&sdf](Vec3 const &p)
73 { return NumGrad(sdf, p); }
74 : sdfGrad;
75
76 auto const NumX = static_cast<int>(ceil(domain.size.x / cubeSize.x));// 计算 x 方向上的立方体数量
77 auto const NumY = static_cast<int>(ceil(domain.size.y / cubeSize.y));// 计算 y 方向上的立方体数量
78 auto const NumZ = static_cast<int>(ceil(domain.size.z / cubeSize.z));// 计算 z 方向上的立方体数量
79
80 auto const HalfCubeDiag = cubeSize.Norm() / 2.0;// 计算立方体对角线长度的一半
81 auto const HalfCubeSize = cubeSize * 0.5;// 计算立方体边长的一半
82
83 Mesh mesh;// 创建一个空的网格对象
84// 遍历所有的立方体
85 for (auto ix = 0; ix < NumX; ++ix)
86 {
87 auto x = domain.min.x + ix * cubeSize.x;// 当前立方体的 x 坐标
88
89 for (auto iy = 0; iy < NumY; ++iy)
90 {
91 auto y = domain.min.y + iy * cubeSize.y;// 当前立方体的 y 坐标
92
93 for (auto iz = 0; iz < NumZ; ++iz)
94 {
95 auto z = domain.min.z + iz * cubeSize.z;// 当前立方体的 z 坐标
96 Vec3 min{x, y, z};// 当前立方体的最小坐标
97
98 // 仅当立方体位于表面周围的窄带内时才处理。
99 auto cubeCenter = min + HalfCubeSize;// 计算立方体的中心坐标
100 auto dist = abs(sdf(cubeCenter) - isoLevel);// 计算立方体中心到等值面的距离
101 if (dist > HalfCubeDiag)
102 continue;
103
104 Cube cube({min, cubeSize}, sdf);// 创建一个立方体对象
105 auto intersect = cube.Intersect(isoLevel); // 计算立方体与等值面的交点
106 Triangulate(intersect, sdfGrad, mesh); // 对交点进行三角剖分,并将结果添加到网格中
107 }
108 }
109 }
110
111 return mesh;// 返回重建后的网格
112}
double min(double v1, double v2)
返回两个数中的较小值
Definition Simplify.h:591
IntersectInfo Intersect(double isoLevel=0) const
Definition Cube.h:160
void Triangulate(IntersectInfo const &intersect, Fun3v const &grad, Mesh &mesh)
给定一个网格立方体和一个等值面,计算出在立方体中表示等值面的三角形(最多5个)。
Mesh MarchCube(Fun3s const &sdf, Rect3 const &domain)
使用 Marching Cube 从给定的有向距离函数重建三角形网格。
std::function< Vec3(Vec3 const &)> Fun3v
Definition DataStructs.h:78
std::function< double(Vec3 const &)> Fun3s
Definition DataStructs.h:75