MCPcopy Create free account
hub / github.com/InteractiveComputerGraphics/SPlisHSPlasH / generateSDF

Function generateSDF

Tools/VolumeSampling/main.cpp:406–441  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

404}
405
406void generateSDF(SPH::TriangleMesh &mesh)
407{
408 //////////////////////////////////////////////////////////////////////////
409 // Generate distance field of object using Discregrid
410 //////////////////////////////////////////////////////////////////////////
411#ifdef USE_DOUBLE
412 Discregrid::TriangleMesh sdfMesh(&mesh.getVertices()[0][0], mesh.getFaces().data(), mesh.numVertices(), mesh.numFaces());
413#else
414 // if type is float, copy vector to double vector
415 std::vector<double> doubleVec;
416 doubleVec.resize(3 * mesh.numVertices());
417 for (unsigned int i = 0; i < mesh.numVertices(); i++)
418 for (unsigned int j = 0; j < 3; j++)
419 doubleVec[3 * i + j] = mesh.getVertices()[i][j];
420 Discregrid::TriangleMesh sdfMesh(&doubleVec[0], mesh.getFaces().data(), mesh.numVertices(), mesh.numFaces());
421#endif
422
423 Discregrid::TriangleMeshDistance md(sdfMesh);
424 Eigen::AlignedBox3d domain;
425 domain.extend(bbmin.cast<double>());
426 domain.extend(bbmax.cast<double>());
427 //domain.max() += 1.0e-3 * domain.diagonal().norm() * Eigen::Vector3d::Ones();
428 //domain.min() -= 1.0e-3 * domain.diagonal().norm() * Eigen::Vector3d::Ones();
429 domain.max() += Eigen::Vector3d::Ones() * radius * 4.0;
430 domain.min() -= Eigen::Vector3d::Ones() * radius * 4.0;
431
432 LOG_INFO << "Set SDF resolution: " << resolutionSDF[0] << ", " << resolutionSDF[1] << ", " << resolutionSDF[2];
433 distanceField = std::make_shared<Discregrid::CubicLagrangeDiscreteGrid>(domain, std::array<unsigned int, 3>({ resolutionSDF[0], resolutionSDF[1], resolutionSDF[2] }));
434 auto func = Discregrid::DiscreteGrid::ContinuousFunction{};
435
436 // invert the distance field since the particles should stay inside
437 func = [&md](Eigen::Vector3d const& xi) {return -md.signed_distance(xi).distance; };
438
439 LOG_INFO << "Generate SDF";
440 distanceField->addFunction(func, false);
441}
442
443

Callers 3

sampleMeshMethod · 0.85
generateSamplingMethod · 0.85
mainFunction · 0.85

Calls 6

numVerticesMethod · 0.80
numFacesMethod · 0.80
maxMethod · 0.80
minMethod · 0.80
dataMethod · 0.45
resizeMethod · 0.45

Tested by

no test coverage detected