| 404 | } |
| 405 | |
| 406 | void 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 | |