From f4ba920906edd19d062e8c365c914e403279fb0d Mon Sep 17 00:00:00 2001 From: Andrew Wilson <andx_roo@live.com> Date: Mon, 1 Jun 2020 17:32:21 -0400 Subject: [PATCH] REFAC: Examples updated --- .../ManualCDWithOctreeExample.cpp | 1 - .../CreateEnclosingMesh.cpp | 1 - .../DebugRendering/DebugRenderingExample.cpp | 1 - .../DeformableBody/DeformableBodyExample.cpp | 34 +--- .../GeometryProcessingExample.cpp | 1 - .../GeometryTransformsExample.cpp | 1 - Examples/LineMesh/LineMeshExample.cpp | 1 - Examples/MultipleScenes/multipleScenes.cpp | 11 +- .../ObjectCtrlDummyClientExample.cpp | 1 - Examples/PBD/PBDCloth/pbdClothExample.cpp | 5 +- .../PBDCollisionMultipleObjectsExample.cpp | 143 +++++--------- .../PBDCollisionOneObjectExample.cpp | 32 ++- .../PBDCollisionStairsExample.cpp | 183 ++++++++++-------- .../PBD3DDeformableObject.cpp | 9 +- Examples/PBD/PBDFluids/PBDFluidsExample.cpp | 30 ++- Examples/PBD/PBDString/pbdStringExample.cpp | 5 +- Examples/Rendering/RenderingExample.cpp | 1 - Examples/SPHFluid/Fluid.hpp | 6 - Examples/SPHFluid/SPHFluidExample.hpp | 16 +- .../SceneManagementExample.cpp | 4 +- Examples/Screenshot/ScreenshotExample.cpp | 1 - .../VolumeRenderingExample.cpp | 1 - 22 files changed, 192 insertions(+), 296 deletions(-) diff --git a/Examples/CollisionDetection/ManualCDWithOctree/ManualCDWithOctreeExample.cpp b/Examples/CollisionDetection/ManualCDWithOctree/ManualCDWithOctreeExample.cpp index a36fe291a..e936eaca3 100644 --- a/Examples/CollisionDetection/ManualCDWithOctree/ManualCDWithOctreeExample.cpp +++ b/Examples/CollisionDetection/ManualCDWithOctree/ManualCDWithOctreeExample.cpp @@ -33,7 +33,6 @@ #include "imstkCollidingObject.h" #include "imstkSceneManager.h" #include "imstkSurfaceMesh.h" -#include "imstkCollisionGraph.h" #include "imstkScene.h" #include "imstkVTKRenderer.h" diff --git a/Examples/CreateEnclosingMesh/CreateEnclosingMesh.cpp b/Examples/CreateEnclosingMesh/CreateEnclosingMesh.cpp index 48e14db1b..18f13d1a6 100644 --- a/Examples/CreateEnclosingMesh/CreateEnclosingMesh.cpp +++ b/Examples/CreateEnclosingMesh/CreateEnclosingMesh.cpp @@ -22,7 +22,6 @@ #include "imstkSimulationManager.h" #include "imstkLight.h" #include "imstkCamera.h" -#include "imstkCollisionGraph.h" #include "imstkAPIUtilities.h" #include "imstkSurfaceMesh.h" #include "imstkTetrahedralMesh.h" diff --git a/Examples/DebugRendering/DebugRenderingExample.cpp b/Examples/DebugRendering/DebugRenderingExample.cpp index fa36764c3..1dd76526a 100644 --- a/Examples/DebugRendering/DebugRenderingExample.cpp +++ b/Examples/DebugRendering/DebugRenderingExample.cpp @@ -24,7 +24,6 @@ #include "imstkLight.h" #include "imstkCamera.h" #include "imstkSceneManager.h" -#include "imstkCollisionGraph.h" #include "imstkDebugRenderGeometry.h" #include "imstkAPIUtilities.h" #include "imstkVTKViewer.h" diff --git a/Examples/DeformableBody/DeformableBodyExample.cpp b/Examples/DeformableBody/DeformableBodyExample.cpp index a49faf30d..e567f47c7 100644 --- a/Examples/DeformableBody/DeformableBodyExample.cpp +++ b/Examples/DeformableBody/DeformableBodyExample.cpp @@ -35,7 +35,6 @@ #include "imstkLight.h" #include "imstkCamera.h" #include "imstkFEMDeformableBodyModel.h" -#include "imstkCollisionGraph.h" #include "imstkSurfaceMesh.h" #include "imstkScene.h" @@ -68,21 +67,16 @@ main() volTetMesh->extractSurfaceMesh(surfMesh, true); - // Construct a map - // Construct one to one nodal map based on the above meshes auto oneToOneNodalMap = std::make_shared<OneToOneMap>(tetMesh, surfMesh); - // Scene object 1: Dragon - // Configure dynamic model auto dynaModel = std::make_shared<FEMDeformableBodyModel>(); - //dynaModel->configure(iMSTK_DATA_ROOT "/asianDragon/asianDragon.config"); - auto config = std::make_shared<FEMModelConfig>(); config->m_fixedNodeIds = { 51, 127, 178 }; dynaModel->configure(config); + //dynaModel->configure(iMSTK_DATA_ROOT "/asianDragon/asianDragon.config"); dynaModel->setTimeStepSizeType(TimeSteppingType::Fixed); dynaModel->setModelGeometry(volTetMesh); @@ -94,7 +88,7 @@ main() auto surfMeshModel = std::make_shared<VisualModel>(surfMesh); surfMeshModel->setRenderMaterial(material); - // Scene Object + // Scene object 1: Dragon auto deformableObj = std::make_shared<FeDeformableObject>("Dragon"); deformableObj->addVisualModel(surfMeshModel); deformableObj->setPhysicsGeometry(volTetMesh); @@ -111,30 +105,6 @@ main() planeObj->setCollidingGeometry(planeGeom); scene->addSceneObject(planeObj); - // create a nonlinear system - auto nlSystem = std::make_shared<NonLinearSystem>( - dynaModel->getFunction(), - dynaModel->getFunctionGradient()); - - nlSystem->setUnknownVector(dynaModel->getUnknownVec()); - nlSystem->setUpdateFunction(dynaModel->getUpdateFunction()); - nlSystem->setUpdatePreviousStatesFunction(dynaModel->getUpdatePrevStateFunction()); - - // create a linear solver - auto linSolver = std::make_shared<ConjugateGradient>(); - - if (linSolver->getType() == imstk::LinearSolver<imstk::SparseMatrixd>::Type::GaussSeidel - && dynaModel->isFixedBCImplemented()) - { - LOG(WARNING) << "The GS solver may not be viable!"; - } - - // create a non-linear solver and add to the scene - auto nlSolver = std::make_shared<NewtonSolver>(); - nlSolver->setLinearSolver(linSolver); - nlSolver->setSystem(nlSystem); - scene->addNonlinearSolver(nlSolver); - // Light auto light = std::make_shared<DirectionalLight>("light"); light->setFocalPoint(Vec3d(5, -8, -5)); diff --git a/Examples/GeometryProcessing/GeometryProcessingExample.cpp b/Examples/GeometryProcessing/GeometryProcessingExample.cpp index 7a7df7d81..13c67ddfd 100644 --- a/Examples/GeometryProcessing/GeometryProcessingExample.cpp +++ b/Examples/GeometryProcessing/GeometryProcessingExample.cpp @@ -31,7 +31,6 @@ #include "imstkMeshIO.h" #include "imstkSurfaceMesh.h" #include "imstkTetrahedralMesh.h" -#include "imstkCollisionGraph.h" #include "imstkScene.h" using namespace imstk; diff --git a/Examples/GeometryTransforms/GeometryTransformsExample.cpp b/Examples/GeometryTransforms/GeometryTransformsExample.cpp index a2656b5e9..b382a6506 100644 --- a/Examples/GeometryTransforms/GeometryTransformsExample.cpp +++ b/Examples/GeometryTransforms/GeometryTransformsExample.cpp @@ -21,7 +21,6 @@ #include "imstkSimulationManager.h" #include "imstkSceneManager.h" -#include "imstkCollisionGraph.h" #include "imstkSceneObject.h" #include "imstkCamera.h" #include "imstkLight.h" diff --git a/Examples/LineMesh/LineMeshExample.cpp b/Examples/LineMesh/LineMeshExample.cpp index 0aeb68af3..fdecd4d32 100644 --- a/Examples/LineMesh/LineMeshExample.cpp +++ b/Examples/LineMesh/LineMeshExample.cpp @@ -20,7 +20,6 @@ =========================================================================*/ #include "imstkSimulationManager.h" -#include "imstkCollisionGraph.h" #include "imstkAPIUtilities.h" #include "imstkCamera.h" #include "imstkLineMesh.h" diff --git a/Examples/MultipleScenes/multipleScenes.cpp b/Examples/MultipleScenes/multipleScenes.cpp index ca7f47f62..fbe49abf2 100644 --- a/Examples/MultipleScenes/multipleScenes.cpp +++ b/Examples/MultipleScenes/multipleScenes.cpp @@ -28,7 +28,6 @@ #include "imstkSurfaceMesh.h" #include "imstkMeshIO.h" #include "imstkTetrahedralMesh.h" -#include "imstkCollisionGraph.h" #include "imstkPlane.h" #include "imstkScene.h" @@ -66,15 +65,15 @@ createSoftBodyScene(std::shared_ptr<SimulationManager> simManager, const char* s auto pbdParams = std::make_shared<PBDModelConfig>(); // FEM constraint - pbdParams->m_YoungModulus = 100.0; - pbdParams->m_PoissonRatio = 0.3; + pbdParams->femParams->m_YoungModulus = 100.0; + pbdParams->femParams->m_PoissonRatio = 0.3; pbdParams->m_fixedNodeIds = { 51, 127, 178 }; pbdParams->enableFEMConstraint(PbdConstraint::Type::FEMTet, PbdFEMConstraint::MaterialType::StVK); // Other parameters pbdParams->m_uniformMassValue = 1.0; pbdParams->m_gravity = Vec3d(0, -9.8, 0); - pbdParams->m_maxIter = 45; + pbdParams->m_iterations = 45; // Set the parameters pbdModel->configure(pbdParams); @@ -165,8 +164,8 @@ createClothScene(std::shared_ptr<SimulationManager> simManager, const char* scen // Other parameters pbdParams->m_uniformMassValue = 1.0; pbdParams->m_gravity = Vec3d(0, -9.8, 0); - pbdParams->m_DefaultDt = 0.03; - pbdParams->m_maxIter = 5; + pbdParams->m_defaultDt = 0.03; + pbdParams->m_iterations = 5; // Set the parameters pbdModel->configure(pbdParams); diff --git a/Examples/ObjectControllerDummyClient/ObjectCtrlDummyClientExample.cpp b/Examples/ObjectControllerDummyClient/ObjectCtrlDummyClientExample.cpp index 87b0344db..632019b2a 100644 --- a/Examples/ObjectControllerDummyClient/ObjectCtrlDummyClientExample.cpp +++ b/Examples/ObjectControllerDummyClient/ObjectCtrlDummyClientExample.cpp @@ -21,7 +21,6 @@ #include "imstkSimulationManager.h" #include "imstkCollidingObject.h" -#include "imstkCollisionGraph.h" #include "imstkCamera.h" #include "imstkLight.h" #include "imstkSceneManager.h" diff --git a/Examples/PBD/PBDCloth/pbdClothExample.cpp b/Examples/PBD/PBDCloth/pbdClothExample.cpp index 6ccbf0a2c..0477de140 100644 --- a/Examples/PBD/PBDCloth/pbdClothExample.cpp +++ b/Examples/PBD/PBDCloth/pbdClothExample.cpp @@ -24,7 +24,6 @@ #include "imstkPbdObject.h" #include "imstkAPIUtilities.h" #include "imstkSurfaceMesh.h" -#include "imstkCollisionGraph.h" #include "imstkCamera.h" #include "imstkLight.h" #include "imstkScene.h" @@ -112,8 +111,8 @@ main() // Other parameters pbdParams->m_uniformMassValue = 1.0; pbdParams->m_gravity = Vec3d(0, -9.8, 0); - pbdParams->m_DefaultDt = 0.005; - pbdParams->m_maxIter = 5; + pbdParams->m_defaultDt = 0.005; + pbdParams->m_iterations = 5; // Set the parameters pbdModel->configure(pbdParams); diff --git a/Examples/PBD/PBDCollisionMultipleObjects/PBDCollisionMultipleObjectsExample.cpp b/Examples/PBD/PBDCollisionMultipleObjects/PBDCollisionMultipleObjectsExample.cpp index e620279b5..98da44f06 100644 --- a/Examples/PBD/PBDCollisionMultipleObjects/PBDCollisionMultipleObjectsExample.cpp +++ b/Examples/PBD/PBDCollisionMultipleObjects/PBDCollisionMultipleObjectsExample.cpp @@ -19,22 +19,17 @@ =========================================================================*/ -#include "imstkSimulationManager.h" -#include "imstkLight.h" #include "imstkCamera.h" #include "imstkCollisionGraph.h" -#include "imstkSceneManager.h" -#include "imstkPbdModel.h" -#include "imstkPbdObject.h" -#include "imstkTetrahedralMesh.h" +#include "imstkLight.h" #include "imstkMeshIO.h" +#include "imstkObjectInteractionFactory.h" #include "imstkOneToOneMap.h" -#include "imstkSurfaceMeshToSurfaceMeshCD.h" -#include "imstkPBDCollisionHandling.h" -#include "imstkVTKTextStatusManager.h" -#include "imstkCollisionData.h" -#include "imstkSurfaceMesh.h" +#include "imstkPbdModel.h" #include "imstkScene.h" +#include "imstkSimulationManager.h" +#include "imstkSurfaceMesh.h" +#include "imstkTetrahedralMesh.h" // Enable this macro to generate many dragons #define BIG_SCENE @@ -124,17 +119,16 @@ generateDragon(const std::shared_ptr<imstk::Scene>& scene, auto pbdParams = std::make_shared<PBDModelConfig>(); // FEM constraint - pbdParams->m_YoungModulus = 1000.0; - pbdParams->m_PoissonRatio = 0.3; + pbdParams->femParams->m_YoungModulus = 1000.0; + pbdParams->femParams->m_PoissonRatio = 0.3; pbdParams->enableFEMConstraint(PbdConstraint::Type::FEMTet, PbdFEMConstraint::MaterialType::StVK); // Other parameters pbdParams->m_uniformMassValue = 5.0; pbdParams->m_gravity = Vec3d(0, -1.0, 0); - pbdParams->m_DefaultDt = 0.01; - pbdParams->m_maxIter = 20; - pbdParams->m_proximity = 0.5; - pbdParams->m_contactStiffness = 0.1; + pbdParams->m_defaultDt = 0.01; + pbdParams->m_iterations = 20; + pbdParams->collisionParams->m_proximity = 0.5; pbdModel->configure(pbdParams); deformableObj->setDynamicalModel(pbdModel); @@ -156,10 +150,6 @@ main() auto viewer = std::dynamic_pointer_cast<VTKViewer>(simManager->getViewer()); viewer->getVtkRenderWindow()->SetSize(1920, 1080); - auto statusManager = viewer->getTextStatusManager(); - statusManager->setStatusFontSize(VTKTextStatusManager::Custom, 25); - statusManager->setStatusFontColor(VTKTextStatusManager::Custom, Color::Orange); - // Build floor geometry const double width = 100.0; const double height = 100.0; @@ -194,48 +184,45 @@ main() } } - auto floorMesh = std::make_shared<SurfaceMesh>(); - floorMesh->initialize(vertList, triangles); - - auto materialFloor = std::make_shared<RenderMaterial>(); - materialFloor->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface); - auto floorMeshModel = std::make_shared<VisualModel>(floorMesh); - floorMeshModel->setRenderMaterial(materialFloor); - - auto floor = std::make_shared<PbdObject>("Floor"); - floor->setCollidingGeometry(floorMesh); - floor->setVisualGeometry(floorMesh); - floor->setPhysicsGeometry(floorMesh); - - auto pbdModel2 = std::make_shared<PbdModel>(); - pbdModel2->setModelGeometry(floorMesh); - - // configure model - auto pbdParams2 = std::make_shared<PBDModelConfig>(); - pbdParams2->m_uniformMassValue = 0.0; - pbdParams2->m_proximity = 0.1; - pbdParams2->m_contactStiffness = 0.1; - pbdParams2->m_maxIter = 0; - - // Set the parameters - pbdModel2->configure(pbdParams2); - floor->setDynamicalModel(pbdModel2); - scene->addSceneObject(floor); + auto floorObj = std::make_shared<PbdObject>("Floor"); + { + auto floorMesh = std::make_shared<SurfaceMesh>(); + floorMesh->initialize(vertList, triangles); + + auto materialFloor = std::make_shared<RenderMaterial>(); + materialFloor->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface); + auto floorMeshModel = std::make_shared<VisualModel>(floorMesh); + floorMeshModel->setRenderMaterial(materialFloor); + + floorObj->setCollidingGeometry(floorMesh); + floorObj->setVisualGeometry(floorMesh); + floorObj->setPhysicsGeometry(floorMesh); + + auto pbdFloorModel = std::make_shared<PbdModel>(); + pbdFloorModel->setModelGeometry(floorMesh); + + // Configure floor + auto pbdFloorConfig = std::make_shared<PBDModelConfig>(); + pbdFloorConfig->m_uniformMassValue = 0.0; + pbdFloorConfig->collisionParams->m_proximity = -0.1; + pbdFloorConfig->m_iterations = 0; + + // Set the parameters + pbdFloorModel->configure(pbdFloorConfig); + floorObj->setDynamicalModel(pbdFloorModel); + scene->addSceneObject(floorObj); + } #ifdef BIG_SCENE const int expandsXZ = 1; - const int expandsY = 4; + const int expandsY = 2; #endif const double shiftX = 5.0; const double distanceXZ = 10.0; const double distanceY = 5.0; const double minHeight = -5.0; - std::vector<std::shared_ptr<SurfaceMesh>> surfaceMeshes; std::vector<std::shared_ptr<PbdObject>> pbdObjs; - //std::vector<std::shared_ptr<PbdSolver>> pbdSolvers; - std::vector<std::shared_ptr<CollisionData>> allCollisionData; - size_t numTriangles = 0; #ifdef BIG_SCENE for (int i = -expandsXZ; i < expandsXZ; ++i) @@ -260,59 +247,23 @@ main() std::shared_ptr<PbdSolver> solver; Vec3d translation(shiftX + i * distanceXZ, minHeight + j * distanceY, k * distanceXZ); generateDragon(scene, translation, mesh, pbdObj, solver); - surfaceMeshes.push_back(mesh); pbdObjs.push_back(pbdObj); - //pbdSolvers.push_back(solver); - numTriangles += mesh->getNumTriangles(); - - // Collision between dragon with floor - const auto colData = std::make_shared<CollisionData>(); - const auto CD = std::make_shared<SurfaceMeshToSurfaceMeshCD>(mesh, floorMesh, colData); - const auto CH = std::make_shared<PBDCollisionHandling>(CollisionHandling::Side::A, - colData, pbdObj, floor); - scene->getCollisionGraph()->addInteractionPair(pbdObj, floor, CD, CH, nullptr); - allCollisionData.push_back(colData); + + scene->getCollisionGraph()->addInteraction(makeObjectInteractionPair(pbdObj, floorObj, + InteractionType::PbdObjToPbdObj_Collision, CollisionDetection::Type::SurfaceMeshToSurfaceMesh)); } } } - for (size_t i = 0; i < surfaceMeshes.size(); ++i) + for (size_t i = 0; i < pbdObjs.size(); ++i) { - for (size_t j = 0; j < surfaceMeshes.size(); ++j) + for (size_t j = i + 1; j < pbdObjs.size(); ++j) { - if (i == j) - { - continue; - } - - // Collision between two dragons - const auto colData = std::make_shared<CollisionData>(); - const auto CD = std::make_shared<SurfaceMeshToSurfaceMeshCD>(surfaceMeshes[i], surfaceMeshes[j], colData); - const auto CH = std::make_shared<PBDCollisionHandling>(CollisionHandling::Side::A, - colData, pbdObjs[i], pbdObjs[j]); - scene->getCollisionGraph()->addInteractionPair(pbdObjs[i], pbdObjs[j], CD, CH, nullptr); + scene->getCollisionGraph()->addInteraction(makeObjectInteractionPair(pbdObjs[i], pbdObjs[j], + InteractionType::PbdObjToPbdObj_Collision, CollisionDetection::Type::SurfaceMeshToSurfaceMesh)); } } - auto updateFunc = - [&](Module*) { - size_t numVTCollisions = 0; - size_t numEECollisions = 0; - for (const auto& colData: allCollisionData) - { - numVTCollisions += colData->VTColData.getSize(); - numEECollisions += colData->EEColData.getSize(); - } - - std::stringstream ss; - ss << "Num. dragons: " << surfaceMeshes.size() - << "\nNum. surface triangles: " << numTriangles - << "\nNum. collision: " << numVTCollisions << " (VT) | " - << numEECollisions << " (EE)"; - statusManager->setCustomStatus(ss.str()); - }; - simManager->getSceneManager(scene)->setPostUpdateCallback(updateFunc); - // Light auto light = std::make_shared<DirectionalLight>("light"); light->setFocalPoint(Vec3d(5, -8, -5)); diff --git a/Examples/PBD/PBDCollisionOneObject/PBDCollisionOneObjectExample.cpp b/Examples/PBD/PBDCollisionOneObject/PBDCollisionOneObjectExample.cpp index 8a09a5c06..8616bf08b 100644 --- a/Examples/PBD/PBDCollisionOneObject/PBDCollisionOneObjectExample.cpp +++ b/Examples/PBD/PBDCollisionOneObject/PBDCollisionOneObjectExample.cpp @@ -24,15 +24,13 @@ #include "imstkCamera.h" #include "imstkLight.h" #include "imstkPbdModel.h" -#include "imstkPbdObject.h" -#include "imstkTetrahedralMesh.h" #include "imstkMeshIO.h" #include "imstkOneToOneMap.h" -#include "imstkMeshToMeshBruteForceCD.h" -#include "imstkPBDCollisionHandling.h" #include "imstkTetraTriangleMap.h" #include "imstkSurfaceMesh.h" #include "imstkScene.h" +#include "imstkComputeGraphVizWriter.h" +#include "imstkObjectInteractionFactory.h" using namespace imstk; @@ -44,8 +42,7 @@ int main() { auto simManager = std::make_shared<SimulationManager>(); - auto scene = simManager->createNewScene("PbdCollision"); - + auto scene = simManager->createNewScene("PbdCollisionOneDragon"); scene->getCamera()->setPosition(0, 3.0, 20.0); scene->getCamera()->setFocalPoint(0.0, -10.0, 0.0); @@ -81,18 +78,18 @@ main() auto pbdParams = std::make_shared<PBDModelConfig>(); // FEM constraint - pbdParams->m_YoungModulus = 1000.0; - pbdParams->m_PoissonRatio = 0.3; + pbdParams->femParams->m_YoungModulus = 1000.0; + pbdParams->femParams->m_PoissonRatio = 0.3; pbdParams->enableFEMConstraint(PbdConstraint::Type::FEMTet, PbdFEMConstraint::MaterialType::Corotation); // Other parameters pbdParams->m_uniformMassValue = 1.0; pbdParams->m_gravity = Vec3d(0, -10.0, 0); - pbdParams->m_DefaultDt = 0.01; - pbdParams->m_maxIter = 5; - pbdParams->m_proximity = 0.3; - pbdParams->m_contactStiffness = 0.1; + pbdParams->m_defaultDt = 0.01; + pbdParams->m_iterations = 5; + pbdParams->collisionParams->m_proximity = 0.3; + pbdParams->collisionParams->m_stiffness = 0.1; pbdModel->configure(pbdParams); deformableObj->setDynamicalModel(pbdModel); @@ -152,9 +149,8 @@ main() // configure model auto pbdParams2 = std::make_shared<PBDModelConfig>(); pbdParams2->m_uniformMassValue = 0.0; - pbdParams2->m_proximity = 0.1; - pbdParams2->m_contactStiffness = 1.0; - pbdParams2->m_maxIter = 0; + pbdParams2->m_iterations = 0; + pbdParams2->collisionParams->m_proximity = -0.1; // Set the parameters pbdModel2->configure(pbdParams2); @@ -163,10 +159,8 @@ main() scene->addSceneObject(floor); // Collision - scene->getCollisionGraph()->addInteractionPair(deformableObj, floor, - CollisionDetection::Type::MeshToMeshBruteForce, - CollisionHandling::Type::PBD, - CollisionHandling::Type::None); + scene->getCollisionGraph()->addInteraction(makeObjectInteractionPair(deformableObj, floor, + InteractionType::PbdObjToPbdObj_Collision, CollisionDetection::Type::MeshToMeshBruteForce)); // Light auto light = std::make_shared<DirectionalLight>("light"); diff --git a/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp b/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp index 7ae559e88..bbc2c685a 100644 --- a/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp +++ b/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp @@ -20,6 +20,8 @@ //=========================================================================*/ #include "imstkCamera.h" +#include "imstkCollisionGraph.h" +#include "imstkLight.h" #include "imstkMeshIO.h" #include "imstkMeshToMeshBruteForceCD.h" #include "imstkOneToOneMap.h" @@ -27,13 +29,12 @@ #include "imstkPbdModel.h" #include "imstkPbdObject.h" #include "imstkPbdSolver.h" +#include "imstkScene.h" #include "imstkSimulationManager.h" +#include "imstkSurfaceMesh.h" #include "imstkTetrahedralMesh.h" #include "imstkTetraTriangleMap.h" -#include "imstkCollisionGraph.h" -#include "imstkSurfaceMesh.h" -#include "imstkLight.h" -#include "imstkScene.h" +#include "imstkObjectInteractionFactory.h" using namespace imstk; @@ -92,6 +93,87 @@ buildStairs(int nSteps, double width, double height, double depth) return stairMesh; } +static std::shared_ptr<PbdObject> +makeDragonPbdObject(const std::string& name) +{ + auto pbdObj = std::make_shared<PbdObject>(name); + + // Read in the dragon mesh + auto highResSurfMesh = std::dynamic_pointer_cast<SurfaceMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.obj")); + auto coarseTetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.veg")); + highResSurfMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData); + coarseTetMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData); + auto coarseSurfMesh = std::make_shared<SurfaceMesh>(); + coarseTetMesh->extractSurfaceMesh(coarseSurfMesh, true); + + // Setup the Parameters + auto pbdParams = std::make_shared<PBDModelConfig>(); + pbdParams->femParams->m_YoungModulus = 1000.0; + pbdParams->femParams->m_PoissonRatio = 0.3; + pbdParams->enableFEMConstraint(PbdConstraint::Type::FEMTet, + PbdFEMConstraint::MaterialType::StVK); + pbdParams->m_uniformMassValue = 1.0; + pbdParams->m_gravity = Vec3d(0, -10.0, 0); + pbdParams->m_defaultDt = 0.01; + pbdParams->m_iterations = 10; + pbdParams->collisionParams->m_proximity = 0.3; + pbdParams->collisionParams->m_stiffness = 0.1; + + // Setup the Model + auto pbdModel = std::make_shared<PbdModel>(); + pbdModel->setModelGeometry(coarseTetMesh); + pbdModel->configure(pbdParams); + + // Setup the VisualModel + auto material = std::make_shared<RenderMaterial>(); + material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface); + auto surfMeshModel = std::make_shared<VisualModel>(highResSurfMesh); + surfMeshModel->setRenderMaterial(material); + + // Setup the Object + pbdObj->addVisualModel(surfMeshModel); + pbdObj->setCollidingGeometry(coarseSurfMesh); + pbdObj->setPhysicsGeometry(coarseTetMesh); + pbdObj->setPhysicsToCollidingMap(std::make_shared<OneToOneMap>(coarseTetMesh, coarseSurfMesh)); + pbdObj->setPhysicsToVisualMap(std::make_shared<TetraTriangleMap>(coarseTetMesh, highResSurfMesh)); + pbdObj->setDynamicalModel(pbdModel); + + return pbdObj; +} + +static std::shared_ptr<PbdObject> +makeStairsPbdObject(const std::string& name, int numSteps, double width, double height, double depth) +{ + auto stairObj = std::make_shared<PbdObject>(name); + + std::shared_ptr<SurfaceMesh> stairMesh(std::move(buildStairs(numSteps, width, height, depth))); + + // Setup the parameters + auto pbdParams = std::make_shared<PBDModelConfig>(); + pbdParams->m_uniformMassValue = 0.0; + pbdParams->collisionParams->m_proximity = -0.1; + pbdParams->m_iterations = 0; + + // Setup the model + auto pbdModel = std::make_shared<PbdModel>(); + pbdModel->setModelGeometry(stairMesh); + pbdModel->configure(pbdParams); + + // Setup the VisualModel + auto stairMaterial = std::make_shared<RenderMaterial>(); + stairMaterial->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface); + auto stairMeshModel = std::make_shared<VisualModel>(stairMesh); + stairMeshModel->setRenderMaterial(stairMaterial); + + stairObj->addVisualModel(stairMeshModel); + stairObj->setDynamicalModel(pbdModel); + stairObj->setCollidingGeometry(stairMesh); + stairObj->setVisualGeometry(stairMesh); + stairObj->setPhysicsGeometry(stairMesh); + + return stairObj; +} + /// /// \brief This example demonstrates the collision interaction /// using Position based dynamic on a more complex mesh @@ -100,96 +182,25 @@ int main() { auto simManager = std::make_shared<SimulationManager>(); - auto scene = simManager->createNewScene("PbdCollision"); + auto scene = simManager->createNewScene("PbdStairsCollision"); scene->getCamera()->setPosition(0.0, 0.0, -30.0); scene->getCamera()->setFocalPoint(0.0, 0.0, 0.0); - auto deformableObj = std::make_shared<PbdObject>("DeformableObj"); - { - // Read in the dragon mesh - auto highResSurfMesh = std::dynamic_pointer_cast<SurfaceMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.obj")); - auto coarseTetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.veg")); - highResSurfMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData); - coarseTetMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData); - auto coarseSurfMesh = std::make_shared<SurfaceMesh>(); - coarseTetMesh->extractSurfaceMesh(coarseSurfMesh, true); - - // Setup parameters - auto pbdParams = std::make_shared<PBDModelConfig>(); - pbdParams->m_YoungModulus = 1000.0; - pbdParams->m_PoissonRatio = 0.3; - pbdParams->enableFEMConstraint(PbdConstraint::Type::FEMTet, - PbdFEMConstraint::MaterialType::StVK); - pbdParams->m_uniformMassValue = 1.0; - pbdParams->m_gravity = Vec3d(0, -10.0, 0); - pbdParams->m_DefaultDt = 0.01; - pbdParams->m_maxIter = 5; - pbdParams->m_proximity = 0.3; - pbdParams->m_contactStiffness = 0.1; - - // Setup Model - auto pbdModel = std::make_shared<PbdModel>(); - pbdModel->setModelGeometry(coarseTetMesh); - pbdModel->configure(pbdParams); - - // Setup VisualModel - auto material = std::make_shared<RenderMaterial>(); - material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface); - auto surfMeshModel = std::make_shared<VisualModel>(highResSurfMesh); - surfMeshModel->setRenderMaterial(material); - - // Setup Object - deformableObj->addVisualModel(surfMeshModel); - deformableObj->setCollidingGeometry(coarseSurfMesh); - deformableObj->setPhysicsGeometry(coarseTetMesh); - deformableObj->setPhysicsToCollidingMap(std::make_shared<OneToOneMap>(coarseTetMesh, coarseSurfMesh)); - deformableObj->setPhysicsToVisualMap(std::make_shared<TetraTriangleMap>(coarseTetMesh, highResSurfMesh)); - deformableObj->setDynamicalModel(pbdModel); - - // Add to scene - scene->addSceneObject(deformableObj); - } + // Create and add the dragon to the scene + auto pbdDragon1 = makeDragonPbdObject("PbdDragon1"); + scene->addSceneObject(pbdDragon1); - auto stairObj = std::make_shared<PbdObject>("Floor"); - { - std::shared_ptr<SurfaceMesh> stairMesh(std::move(buildStairs(15, 20.0, 10.0, 20.0))); - - // Setup parameters - auto pbdParams2 = std::make_shared<PBDModelConfig>(); - pbdParams2->m_uniformMassValue = 0.0; - pbdParams2->m_proximity = 0.1; - pbdParams2->m_contactStiffness = 1.0; - pbdParams2->m_maxIter = 0; - - // Setup model - auto pbdModel2 = std::make_shared<PbdModel>(); - pbdModel2->setModelGeometry(stairMesh); - pbdModel2->configure(pbdParams2); - - // Setup VisualModel - auto stairMaterial = std::make_shared<RenderMaterial>(); - stairMaterial->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface); - auto stairMeshModel = std::make_shared<VisualModel>(stairMesh); - stairMeshModel->setRenderMaterial(stairMaterial); - - stairObj->addVisualModel(stairMeshModel); - stairObj->setDynamicalModel(pbdModel2); - stairObj->setCollidingGeometry(stairMesh); - stairObj->setVisualGeometry(stairMesh); - stairObj->setPhysicsGeometry(stairMesh); - - scene->addSceneObject(stairObj); - } + auto stairObj = makeStairsPbdObject("PbdStairs", 12, 20.0, 10.0, 20.0); + scene->addSceneObject(stairObj); // Collision - scene->getCollisionGraph()->addInteractionPair(deformableObj, stairObj, - CollisionDetection::Type::MeshToMeshBruteForce, - CollisionHandling::Type::PBD, - CollisionHandling::Type::None); + scene->getCollisionGraph()->addInteraction(makeObjectInteractionPair(pbdDragon1, stairObj, + InteractionType::PbdObjToPbdObj_Collision, CollisionDetection::Type::MeshToMeshBruteForce)); // Light - auto light = std::make_shared<DirectionalLight>("light"); - light->setFocalPoint(Vec3d(5, -8, 5)); + auto light = std::make_shared<DirectionalLight>("Light"); + light->setFocalPoint(Vec3d(5.0, -8.0, 5.0)); + light->setIntensity(1.0); scene->addLight(light); simManager->setActiveScene(scene); diff --git a/Examples/PBD/PBDDeformableObject/PBD3DDeformableObject.cpp b/Examples/PBD/PBDDeformableObject/PBD3DDeformableObject.cpp index 46f8788b6..b52a57a9e 100644 --- a/Examples/PBD/PBDDeformableObject/PBD3DDeformableObject.cpp +++ b/Examples/PBD/PBDDeformableObject/PBD3DDeformableObject.cpp @@ -27,7 +27,6 @@ #include "imstkOneToOneMap.h" #include "imstkAPIUtilities.h" #include "imstkTetraTriangleMap.h" -#include "imstkCollisionGraph.h" #include "imstkSurfaceMesh.h" #include "imstkCamera.h" #include "imstkPlane.h" @@ -67,15 +66,15 @@ main() auto pbdParams = std::make_shared<PBDModelConfig>(); // FEM constraint - pbdParams->m_YoungModulus = 100.0; - pbdParams->m_PoissonRatio = 0.3; + pbdParams->femParams->m_YoungModulus = 100.0; + pbdParams->femParams->m_PoissonRatio = 0.3; pbdParams->m_fixedNodeIds = { 51, 127, 178 }; pbdParams->enableFEMConstraint(PbdConstraint::Type::FEMTet, PbdFEMConstraint::MaterialType::StVK); // Other parameters pbdParams->m_uniformMassValue = 1.0; pbdParams->m_gravity = Vec3d(0, -9.8, 0); - pbdParams->m_maxIter = 45; + pbdParams->m_iterations = 45; // Set the parameters pbdModel->configure(pbdParams); @@ -87,8 +86,6 @@ main() deformableObj->setPhysicsGeometry(tetMesh); deformableObj->setPhysicsToVisualMap(map); //assign the computed map - deformableObj->setDynamicalModel(pbdModel); - scene->addSceneObject(deformableObj); // Setup plane diff --git a/Examples/PBD/PBDFluids/PBDFluidsExample.cpp b/Examples/PBD/PBDFluids/PBDFluidsExample.cpp index 50e7ee13e..46c002e16 100644 --- a/Examples/PBD/PBDFluids/PBDFluidsExample.cpp +++ b/Examples/PBD/PBDFluids/PBDFluidsExample.cpp @@ -19,18 +19,19 @@ =========================================================================*/ -#include "imstkSimulationManager.h" -#include "imstkCollisionGraph.h" +#include "imstkAPIUtilities.h" #include "imstkCamera.h" +#include "imstkCollisionGraph.h" #include "imstkLight.h" #include "imstkMeshIO.h" -#include "imstkPbdModel.h" -#include "imstkPbdObject.h" -#include "imstkAPIUtilities.h" #include "imstkMeshToMeshBruteForceCD.h" +#include "imstkObjectInteractionFactory.h" #include "imstkPBDCollisionHandling.h" -#include "imstkSurfaceMesh.h" +#include "imstkPbdModel.h" +#include "imstkPbdObject.h" #include "imstkScene.h" +#include "imstkSimulationManager.h" +#include "imstkSurfaceMesh.h" using namespace imstk; @@ -76,10 +77,9 @@ main() // Other parameters pbdParams->m_uniformMassValue = 1.0; pbdParams->m_gravity = Vec3d(0, -9.8, 0); - pbdParams->m_DefaultDt = 0.01; - pbdParams->m_maxIter = 2; - pbdParams->m_proximity = 0.01; - pbdParams->m_contactStiffness = 0.2; + pbdParams->m_defaultDt = 0.01; + pbdParams->m_iterations = 2; + pbdParams->collisionParams->m_proximity = 0.01; // Set the parameters pbdModel->configure(pbdParams); @@ -211,8 +211,7 @@ main() // Configure model auto pbdParams2 = std::make_shared<PBDModelConfig>(); pbdParams2->m_uniformMassValue = 0.0; - pbdParams2->m_proximity = 0.1; - pbdParams2->m_contactStiffness = 1.0; + pbdParams2->collisionParams->m_proximity = 0.1; pbdModel2->configure(pbdParams2); floor->setDynamicalModel(pbdModel2); @@ -220,11 +219,8 @@ main() scene->addSceneObject(floor); // Collisions - auto colGraph = scene->getCollisionGraph(); - auto CD = std::make_shared<MeshToMeshBruteForceCD>(fluidMesh, floorMeshColliding, nullptr); - auto CH = std::make_shared<PBDCollisionHandling>(CollisionHandling::Side::A, - CD->getCollisionData(), deformableObj, floor); - colGraph->addInteractionPair(deformableObj, floor, CD, CH, nullptr); + scene->getCollisionGraph()->addInteraction(makeObjectInteractionPair(deformableObj, floor, + InteractionType::PbdObjToPbdObj_Collision, CollisionDetection::Type::MeshToMeshBruteForce)); // Light (white) auto whiteLight = std::make_shared<DirectionalLight>("whiteLight"); diff --git a/Examples/PBD/PBDString/pbdStringExample.cpp b/Examples/PBD/PBDString/pbdStringExample.cpp index 94a4a4a41..9d34aa312 100644 --- a/Examples/PBD/PBDString/pbdStringExample.cpp +++ b/Examples/PBD/PBDString/pbdStringExample.cpp @@ -25,7 +25,6 @@ #include "imstkPbdObject.h" #include "imstkSimulationManager.h" #include "imstkSceneManager.h" -#include "imstkCollisionGraph.h" #include "imstkCamera.h" #include "imstkScene.h" @@ -97,8 +96,8 @@ main() sims[i].params->m_fixedNodeIds = { 0 }; sims[i].params->m_uniformMassValue = 5.0; sims[i].params->m_gravity = Vec3d(0, -9.8, 0); - sims[i].params->m_DefaultDt = 0.0005; - sims[i].params->m_maxIter = 5; + sims[i].params->m_defaultDt = 0.0005; + sims[i].params->m_iterations = 5; // Set the parameters sims[i].model->configure(sims[i].params); diff --git a/Examples/Rendering/RenderingExample.cpp b/Examples/Rendering/RenderingExample.cpp index 2d5ff2a29..e9ba71efc 100644 --- a/Examples/Rendering/RenderingExample.cpp +++ b/Examples/Rendering/RenderingExample.cpp @@ -22,7 +22,6 @@ #include "imstkSimulationManager.h" #include "imstkAPIUtilities.h" #include "imstkVisualObjectImporter.h" -#include "imstkCollisionGraph.h" #include "imstkIBLProbe.h" #include "imstkCamera.h" #include "imstkLight.h" diff --git a/Examples/SPHFluid/Fluid.hpp b/Examples/SPHFluid/Fluid.hpp index 48ab27fa6..4b9eb3702 100644 --- a/Examples/SPHFluid/Fluid.hpp +++ b/Examples/SPHFluid/Fluid.hpp @@ -21,7 +21,6 @@ #include "imstkSimulationManager.h" #include "imstkSPHObject.h" -#include "imstkSPHSolver.h" #include "imstkSPHModel.h" #include "imstkPointSet.h" #include "imstkScene.h" @@ -175,10 +174,5 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) fluidObj->setPhysicsGeometry(fluidGeometry); // TODO: Look into API duplication and resulting conflicts scene->addSceneObject(fluidObj); - // Configure the solver - auto sphSolver = std::make_shared<SPHSolver>(); - sphSolver->setSPHObject(fluidObj); - scene->addNonlinearSolver(sphSolver); - return fluidObj; } diff --git a/Examples/SPHFluid/SPHFluidExample.hpp b/Examples/SPHFluid/SPHFluidExample.hpp index d86ee4588..4111cc156 100644 --- a/Examples/SPHFluid/SPHFluidExample.hpp +++ b/Examples/SPHFluid/SPHFluidExample.hpp @@ -31,6 +31,7 @@ #include "imstkCollisionGraph.h" #include "imstkSceneManager.h" #include "imstkCamera.h" +#include "imstkObjectInteractionFactory.h" #include "Fluid.hpp" #include "Solid.hpp" @@ -101,23 +102,18 @@ main(int argc, char* argv[]) }); // Collision between fluid and solid objects - auto colGraph = scene->getCollisionGraph(); - + std::shared_ptr<CollisionGraph> collisionGraph = scene->getCollisionGraph(); for (auto& solid: solids) { if (std::dynamic_pointer_cast<Plane>(solid->getCollidingGeometry())) { - colGraph->addInteractionPair(fluidObj, solid, - CollisionDetection::Type::PointSetToPlane, - CollisionHandling::Type::SPH, - CollisionHandling::Type::None); + collisionGraph->addInteraction(makeObjectInteractionPair(fluidObj, solid, + InteractionType::SphObjToCollidingObj_Collision, CollisionDetection::Type::PointSetToPlane)); } else if (std::dynamic_pointer_cast<Sphere>(solid->getCollidingGeometry())) { - colGraph->addInteractionPair(fluidObj, solid, - CollisionDetection::Type::PointSetToSphere, - CollisionHandling::Type::SPH, - CollisionHandling::Type::None); + collisionGraph->addInteraction(makeObjectInteractionPair(fluidObj, solid, + InteractionType::SphObjToCollidingObj_Collision, CollisionDetection::Type::PointSetToSphere)); } else { diff --git a/Examples/SceneManagement/SceneManagementExample.cpp b/Examples/SceneManagement/SceneManagementExample.cpp index 45418a5f9..f0c4668a3 100644 --- a/Examples/SceneManagement/SceneManagementExample.cpp +++ b/Examples/SceneManagement/SceneManagementExample.cpp @@ -19,10 +19,10 @@ =========================================================================*/ -#include "imstkSimulationManager.h" -#include "imstkCollisionGraph.h" #include "imstkCamera.h" +#include "imstkCollisionGraph.h" #include "imstkScene.h" +#include "imstkSimulationManager.h" using namespace imstk; diff --git a/Examples/Screenshot/ScreenshotExample.cpp b/Examples/Screenshot/ScreenshotExample.cpp index b34ce731d..9b88ed1ac 100644 --- a/Examples/Screenshot/ScreenshotExample.cpp +++ b/Examples/Screenshot/ScreenshotExample.cpp @@ -21,7 +21,6 @@ #include "imstkSimulationManager.h" #include "imstkSceneObject.h" -#include "imstkCollisionGraph.h" #include "imstkCamera.h" #include "imstkLight.h" #include "imstkCube.h" diff --git a/Examples/VolumeRendering/VolumeRenderingExample.cpp b/Examples/VolumeRendering/VolumeRenderingExample.cpp index f5d5dff50..97e96ed9d 100644 --- a/Examples/VolumeRendering/VolumeRenderingExample.cpp +++ b/Examples/VolumeRendering/VolumeRenderingExample.cpp @@ -28,7 +28,6 @@ #include "imstkVolumeRenderMaterialPresets.h" #include "imstkVTKTextStatusManager.h" #include "imstkSceneManager.h" -#include "imstkCollisionGraph.h" #include "imstkScene.h" #include "imstkVTKRenderer.h" -- GitLab