28 Fun3v sdfGrad =
nullptr);
44 auto const Eps = 1e-6;
45 Vec3 epsX{Eps, 0, 0}, epsY{0, Eps, 0}, epsZ{0, 0, Eps};
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;
57 auto const NumCubes = 50;
58 auto cubeSize = domain.
size * (1.0 / NumCubes);
71 sdfGrad = sdfGrad ==
nullptr
72 ? [&sdf](
Vec3 const &p)
73 {
return NumGrad(sdf, p); }
76 auto const NumX =
static_cast<int>(ceil(domain.
size.
x / cubeSize.
x));
77 auto const NumY =
static_cast<int>(ceil(domain.
size.
y / cubeSize.
y));
78 auto const NumZ =
static_cast<int>(ceil(domain.
size.
z / cubeSize.
z));
80 auto const HalfCubeDiag = cubeSize.
Norm() / 2.0;
81 auto const HalfCubeSize = cubeSize * 0.5;
85 for (
auto ix = 0; ix < NumX; ++ix)
87 auto x = domain.
min.
x + ix * cubeSize.
x;
89 for (
auto iy = 0; iy < NumY; ++iy)
91 auto y = domain.
min.
y + iy * cubeSize.
y;
93 for (
auto iz = 0; iz < NumZ; ++iz)
95 auto z = domain.
min.
z + iz * cubeSize.
z;
99 auto cubeCenter =
min + HalfCubeSize;
100 auto dist = abs(sdf(cubeCenter) - isoLevel);
101 if (dist > HalfCubeDiag)
104 Cube cube({
min, cubeSize}, sdf);
105 auto intersect = cube.
Intersect(isoLevel);
double min(double v1, double v2)
返回两个数中的较小值
IntersectInfo Intersect(double isoLevel=0) const
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
std::function< double(Vec3 const &)> Fun3s