From 2eb1d24f1201486a12bb1302f10e9602b2720bbf Mon Sep 17 00:00:00 2001 From: Themis Skamagkis Date: Fri, 25 Jul 2025 16:46:34 +0200 Subject: [PATCH 1/2] [Needle][algorithm] Volume proximities are re-projected back onto the needle at every time step --- .../algorithm/InsertionAlgorithm.h | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/sofa/collisionAlgorithm/algorithm/InsertionAlgorithm.h b/src/sofa/collisionAlgorithm/algorithm/InsertionAlgorithm.h index e17d880e..6ed85d0f 100644 --- a/src/sofa/collisionAlgorithm/algorithm/InsertionAlgorithm.h +++ b/src/sofa/collisionAlgorithm/algorithm/InsertionAlgorithm.h @@ -146,36 +146,38 @@ class InsertionAlgorithm : public BaseAlgorithm { } else { - const SReal dist = (m_needlePts.back()->getPosition() - m_couplingPts.back()->getPosition()).norm(); + auto itfrom = l_from->begin(); + auto createProximityOp = Operations::CreateCenterProximity::Operation::get(itfrom->getTypeInfo()); + auto pfrom = createProximityOp(itfrom->element()); + const SReal dist = (pfrom->getPosition() - m_couplingPts.back()->getPosition()).norm(); + + outputList.clear(); if(dist > d_slideDistance.getValue()) { - outputList.clear(); auto findClosestProxOp_vol = Operations::FindClosestProximity::Operation::get(l_destVol); auto projectOp_vol = Operations::Project::Operation::get(l_destVol); auto projectFromOp_vol = Operations::Project::Operation::get(l_fromVol); - auto pdestVol = findClosestProxOp_vol(m_needlePts.back(), l_destVol.get(), projectOp_vol, getFilterFunc()); - if (pdestVol != nullptr) + auto pdestVol = findClosestProxOp_vol(pfrom, l_destVol.get(), projectOp_vol, getFilterFunc()); + if (pdestVol != nullptr) { pdestVol->normalize(); m_couplingPts.push_back(pdestVol); m_needlePts.push_back(m_needlePts.back()); + } + } - auto itfromVol = l_fromVol->begin(l_fromVol->getSize() - 1 - m_couplingPts.size()); - - auto findClosestProxOp_needle = Operations::FindClosestProximity::Operation::get(l_fromVol); - auto projectOp_needle = Operations::Project::Operation::get(l_fromVol); - - for(int i = 0 ; i < m_needlePts.size() - 1; i++) - { - auto pfromVol = findClosestProxOp_needle(m_couplingPts[i], l_fromVol.get(), projectOp_needle, getFilterFunc()); - m_needlePts[i] = pfromVol; - } + auto findClosestProxOp_needle = Operations::FindClosestProximity::Operation::get(l_fromVol); + auto projectOp_needle = Operations::Project::Operation::get(l_fromVol); - for(int i = 0 ; i < m_needlePts.size(); i++) - outputList.add(m_needlePts[i], m_couplingPts[i]); - } + for(int i = 0 ; i < m_needlePts.size(); i++) + { + auto pfromVol = findClosestProxOp_needle(m_couplingPts[i], l_fromVol.get(), projectOp_needle, getFilterFunc()); + m_needlePts[i] = pfromVol; } + + for(int i = 0 ; i < m_needlePts.size(); i++) + outputList.add(m_needlePts[i], m_couplingPts[i]); } d_output.endEdit(); From 3bc762907a67deadef43c413c27fc2a2cfcc0c6c Mon Sep 17 00:00:00 2001 From: Themis Skamagkis Date: Mon, 28 Jul 2025 12:52:29 +0200 Subject: [PATCH 2/2] [Needle][algorithm] Minor cleanup --- .../collisionAlgorithm/algorithm/InsertionAlgorithm.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sofa/collisionAlgorithm/algorithm/InsertionAlgorithm.h b/src/sofa/collisionAlgorithm/algorithm/InsertionAlgorithm.h index 6ed85d0f..a020bfdf 100644 --- a/src/sofa/collisionAlgorithm/algorithm/InsertionAlgorithm.h +++ b/src/sofa/collisionAlgorithm/algorithm/InsertionAlgorithm.h @@ -146,20 +146,20 @@ class InsertionAlgorithm : public BaseAlgorithm { } else { + outputList.clear(); + auto itfrom = l_from->begin(); auto createProximityOp = Operations::CreateCenterProximity::Operation::get(itfrom->getTypeInfo()); auto pfrom = createProximityOp(itfrom->element()); const SReal dist = (pfrom->getPosition() - m_couplingPts.back()->getPosition()).norm(); - - outputList.clear(); if(dist > d_slideDistance.getValue()) { auto findClosestProxOp_vol = Operations::FindClosestProximity::Operation::get(l_destVol); auto projectOp_vol = Operations::Project::Operation::get(l_destVol); auto projectFromOp_vol = Operations::Project::Operation::get(l_fromVol); auto pdestVol = findClosestProxOp_vol(pfrom, l_destVol.get(), projectOp_vol, getFilterFunc()); - if (pdestVol != nullptr) + if (pdestVol) { pdestVol->normalize(); m_couplingPts.push_back(pdestVol); @@ -170,13 +170,13 @@ class InsertionAlgorithm : public BaseAlgorithm { auto findClosestProxOp_needle = Operations::FindClosestProximity::Operation::get(l_fromVol); auto projectOp_needle = Operations::Project::Operation::get(l_fromVol); - for(int i = 0 ; i < m_needlePts.size(); i++) + for(int i = 0 ; i < m_couplingPts.size(); i++) { auto pfromVol = findClosestProxOp_needle(m_couplingPts[i], l_fromVol.get(), projectOp_needle, getFilterFunc()); m_needlePts[i] = pfromVol; } - for(int i = 0 ; i < m_needlePts.size(); i++) + for(int i = 0 ; i < m_couplingPts.size(); i++) outputList.add(m_needlePts[i], m_couplingPts[i]); }