diff --git a/examples/vegaFem/main.cpp b/examples/vegaFem/main.cpp index 8366ae95ed99592bc65844bde69ef53b573a0015..2a2839f229505bb9e41495d6d943fc1164e17dc5 100644 --- a/examples/vegaFem/main.cpp +++ b/examples/vegaFem/main.cpp @@ -37,7 +37,12 @@ #include "smSimulators/smVegaFemSimulator.h" #include "smSimulators/smDummySimulator.h" +#include "smCollision/smCollisionPair.h" #include "smCollision/smPlaneCollisionModel.h" +#include "smCollision/smMeshCollisionModel.h" +#include "smCollision/smPlaneToMeshCollision.h" + +#include "smContactHandling\smPenaltyContactHandling.h" #include "../common/wasdCameraController.h" #include "../common/KeyPressSDKShutdown.h" @@ -79,7 +84,7 @@ int main() "asianDragon/asianDragon.config"); auto femObjRenderDetail = std::make_shared<smRenderDetail>( - //SIMMEDTK_RENDER_FACES | + SIMMEDTK_RENDER_WIREFRAME | SIMMEDTK_RENDER_VERTICES ); femObjRenderDetail->setPointSize(4.0); @@ -105,7 +110,7 @@ int main() // create a static plane scene object of given normal and position staticObject = std::make_shared<smStaticSceneObject>(); - plane = std::make_shared<smPlaneCollisionModel>(smVec3d(0.0, -10.0, 0.0), + plane = std::make_shared<smPlaneCollisionModel>(smVec3d(0.0, -3.0, 0.0), smVec3d(0.0, 1.0, 0.0)); staticObject->setModel(plane); @@ -117,6 +122,38 @@ int main() auto sdkSimulator = sdk->getSimulator(); sdkSimulator->registerObjectSimulator(femSimulator); //sdkSimulator->registerObjectSimulator(staticSimulator); + + + //------------------------------------------------------- + // Enable collision between scene actors 1 and 2 + //------------------------------------------------------- + std::shared_ptr<smMeshCollisionModel> meshModel = + std::make_shared<smMeshCollisionModel>(); + meshModel->setMesh(femObject->getSurfaceMesh()); + + std::shared_ptr<smCollisionPair> planeMeshCollisionPairs = + std::make_shared<smCollisionPair>(); + + planeMeshCollisionPairs->setModels(meshModel, plane); + + sdkSimulator->addCollisionPair(planeMeshCollisionPairs); + + std::shared_ptr<smPlaneToMeshCollision> planeToMeshCollisionDetection = + std::make_shared<smPlaneToMeshCollision>(); + + sdkSimulator->registerCollisionDetection(planeToMeshCollisionDetection); + + //------------------------------------------------------- + // Enable contact handling between scene actors 1 and 2 + //------------------------------------------------------- + std::shared_ptr<smPenaltyContactHandling> planeToMeshContact = + std::make_shared<smPenaltyContactHandling>(false); + + planeToMeshContact->setCollisionPairs(planeMeshCollisionPairs); + + planeToMeshContact->setSceneObjects(staticObject, femObject); + + sdkSimulator->registerContactHandling(planeToMeshContact); //------------------------------------------------------- // Customize the viewer diff --git a/include/smCollision/smPlaneCollisionModel.h b/include/smCollision/smPlaneCollisionModel.h index 91c8842aa9343b95e53a5b43fda04691e2d9002d..66ed6e79eca30c192b7ce33f44aea0ac4239b021 100644 --- a/include/smCollision/smPlaneCollisionModel.h +++ b/include/smCollision/smPlaneCollisionModel.h @@ -33,11 +33,12 @@ class smPlaneCollisionModel : public smPlaneModel { - public: smPlaneCollisionModel(const smVec3d &p, const smVec3d &n); ~smPlaneCollisionModel(); + + }; #endif // SMPLANECOLLISIONMODEL_H_H diff --git a/include/smCore/smSimulator.h b/include/smCore/smSimulator.h index b49d932450b6b6c1436703db9a37a34df6763c08..cf71de2e913ad68e5e0e27bd3498966ec3b694cf 100644 --- a/include/smCore/smSimulator.h +++ b/include/smCore/smSimulator.h @@ -73,6 +73,8 @@ public: void registerCollisionDetection(std::shared_ptr<smCollisionDetection> p_collisionDetection); + void registerContactHandling(std::shared_ptr<smContactHandling> p_contactHandling); + ///Registration of the Simulation main. It is called in each and every frame void registerSimulationMain(std::shared_ptr<smSimulationMain> p_main); diff --git a/include/smGeometry/smPlaneModel.h b/include/smGeometry/smPlaneModel.h index 417b4ae09b01662381a9449d38cdb0b009732315..65edd7b98e37c6aa1f8d08d74e816a932f15d220 100644 --- a/include/smGeometry/smPlaneModel.h +++ b/include/smGeometry/smPlaneModel.h @@ -87,6 +87,16 @@ public: /// void setTransform(const RigidTransformType &t); + /// + /// @brief Set transformation operator + /// + void setPlaneModel(const std::shared_ptr<smPlane> &p); + + /// + /// @brief Set transformation operator + /// + std::shared_ptr<smPlane> getPlaneModel() const; + protected: // Plane data and transform std::shared_ptr<smPlane> plane; diff --git a/include/smSimulators/smVegaFemSceneObject.h b/include/smSimulators/smVegaFemSceneObject.h index b2decd73a29a369bc71ab3235a82de398c0ae5bd..ec231441b48dc5c1a7d66932259973ce92f9ffb9 100644 --- a/include/smSimulators/smVegaFemSceneObject.h +++ b/include/smSimulators/smVegaFemSceneObject.h @@ -194,6 +194,8 @@ public: virtual void init() override {}; + std::shared_ptr<smSurfaceMesh> getSurfaceMesh() const; + public: /// performance counters and simulation flags. some variable names are self explainatory double fps; ///< fps of the simulation diff --git a/src/smCollision/smPlaneToMeshCollision.cpp b/src/smCollision/smPlaneToMeshCollision.cpp index 0c83363a8b6cd2ef641effdf56769a439c988998..cbb248cb7d3d5ab7fce7ee9da072838dc52b9522 100644 --- a/src/smCollision/smPlaneToMeshCollision.cpp +++ b/src/smCollision/smPlaneToMeshCollision.cpp @@ -37,14 +37,17 @@ void smPlaneToMeshCollision::doComputeCollision(std::shared_ptr<smCollisionPair> auto mesh = std::static_pointer_cast<smMeshCollisionModel>(pair->getFirst()); auto plane = std::static_pointer_cast<smPlaneCollisionModel>(pair->getFirst()); - if(!mesh || !plane) + if (!mesh || !plane) + { return; + } + double d; smVec3d planeNormal = plane->getNormal(); float planeOffset = planeNormal.dot(plane->getPosition()); for (const auto& vertex : mesh->getVertices()) { - double d = planeNormal.dot(vertex) - planeOffset; + d = planeNormal.dot(vertex) - planeOffset; if (d < std::numeric_limits<float>::epsilon()) { // Create contact @@ -52,4 +55,4 @@ void smPlaneToMeshCollision::doComputeCollision(std::shared_ptr<smCollisionPair> } } -} +} \ No newline at end of file diff --git a/src/smContactHandling/smPenaltyContactHandling.cpp b/src/smContactHandling/smPenaltyContactHandling.cpp index 329bf6ee110d5828aeaeae19501e3d6afd2a286a..adc729e17de59efffc8a8e39075d597607270607 100644 --- a/src/smContactHandling/smPenaltyContactHandling.cpp +++ b/src/smContactHandling/smPenaltyContactHandling.cpp @@ -78,6 +78,8 @@ void smPenaltyContactHandling::computeUnilateralContactForces() std::vector<std::shared_ptr<smContact>> contactInfo = this->getCollisionPairs()->getContacts(); + std::cout << "# contacts: " << contactInfo.size() << std::endl; + if( this->getFirstSceneObject()->getType() == SIMMEDTK_SMVEGAFEMSCENEOBJECT && this->getSecondSceneObject()->getType() == SIMMEDTK_SMSTATICSCENEOBJECT ) { diff --git a/src/smCore/smSimulator.cpp b/src/smCore/smSimulator.cpp index 68af748bac565021e8e2fff622546d02f7d901ed..e31c22bf9791c833f584cd18ee39c801b3b50eb7 100644 --- a/src/smCore/smSimulator.cpp +++ b/src/smCore/smSimulator.cpp @@ -191,6 +191,12 @@ void smSimulator::registerCollisionDetection(std::shared_ptr<smCollisionDetectio collisionDetectors.emplace_back(p_collisionDetection); } +/// \brief +void smSimulator::registerContactHandling(std::shared_ptr<smContactHandling> p_contactHandling) +{ + contactHandlers.emplace_back(p_contactHandling); +} + /// \brief void smSimulator::registerSimulationMain(std::shared_ptr<smSimulationMain> p_main) { diff --git a/src/smGeometry/smPlaneModel.cpp b/src/smGeometry/smPlaneModel.cpp index d73d81db9ea31f0c9e241406b8114cc9a8c072a5..a80d73a610927c4b5554f10e050ea7fd9e0b26d1 100644 --- a/src/smGeometry/smPlaneModel.cpp +++ b/src/smGeometry/smPlaneModel.cpp @@ -53,3 +53,13 @@ void smPlaneModel::setTransform(const smPlaneModel::RigidTransformType& t) { this->transform = t; } + +void smPlaneModel::setPlaneModel(const std::shared_ptr<smPlane> &p) +{ + this->plane = p; +} + +std::shared_ptr<smPlane> smPlaneModel::getPlaneModel() const +{ + return plane; +} diff --git a/src/smSimulators/smVegaFemSceneObject.cpp b/src/smSimulators/smVegaFemSceneObject.cpp index 1ea09e56fad8ba98ffc80f4d2a84860b2cd58409..b82fc4f4e7fbb024a827e9236bcf68b1c74cd6d3 100644 --- a/src/smSimulators/smVegaFemSceneObject.cpp +++ b/src/smSimulators/smVegaFemSceneObject.cpp @@ -1018,7 +1018,7 @@ void smVegaFemSceneObject::advanceDynamics() timestepCounter++; - std::cout << "Time step: " << timestepCounter << std::endl; + //std::cout << "Time step: " << timestepCounter << std::endl; memcpy(u, integratorBase->Getq(), sizeof(double) * 3 * n); @@ -1320,3 +1320,8 @@ void smVegaFemSceneObject::draw() { smtkSurfaceMesh->draw(); } + +std::shared_ptr<smSurfaceMesh> smVegaFemSceneObject::getSurfaceMesh() const +{ + return smtkSurfaceMesh; +}