Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to make a beam collide with other objects #4636

Open
KHJ273 opened this issue Apr 9, 2024 · 0 comments
Open

How to make a beam collide with other objects #4636

KHJ273 opened this issue Apr 9, 2024 · 0 comments

Comments

@KHJ273
Copy link

KHJ273 commented Apr 9, 2024

Hello, thank you for good simulator.

I'm using sofa framework with sofapython in python 3.8.19, Ubuntu 20.04.6 LTS and making an environment of catheter in vessel.
I want to make some objects in the simulator which interact with catheter.

Therefore, I made a sphere, but it doesn't interact with the catheter.
When the catheter contact with the sphere, it doesn't react, but some notice appears on the prompt.

How can I ensure interaction between the catheter and the sphere?

  1. The video when the catheter touches the sphere.
    The catheter interacts well with the vessel.
20240409_134500.mp4
  1. The message when the catheter touches the sphere.
184
[WARNING] [LCPConstraintSolver(LCPConstraintSolver)] No convergence in unbuilt nlcp gaussseidel function : error =5.62447e-05 after 1000 iterations
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
[WARNING] [IntersectorMap] Element Intersector SphereCollisionModel<StdRigidTypes<3u,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> NOT FOUND within :  RayCollisionModel-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  nullptr  
  RayCollisionModel-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  nullptr  
  RayCollisionModel-SphereCollisionModel<StdRigidTypes<3u,double>>  Ray-TSphere<StdRigidTypes<3u,double>>  
  RayCollisionModel-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  Ray-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  RayCollisionModel-TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  Ray-TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  RayCollisionModel-TetrahedronCollisionModel  Ray-Tetrahedron  
  CubeCollisionModel-CubeCollisionModel  Cube-Cube  
  LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  SphereCollisionModel<StdRigidTypes<3u,double>>-SphereCollisionModel<StdRigidTypes<3u,double>>  TSphere<StdRigidTypes<3u,double>>-TSphere<StdRigidTypes<3u,double>>  
  SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdRigidTypes<3u,double>>  TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdRigidTypes<3u,double>>  
  SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  nullptr  
  TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  nullptr  
  TetrahedronCollisionModel-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  Tetrahedron-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  

[WARNING] [IntersectorMap] Element Intersector SphereCollisionModel<StdRigidTypes<3u,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> NOT FOUND within :  RayCollisionModel-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  nullptr  
  RayCollisionModel-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  nullptr  
  RayCollisionModel-SphereCollisionModel<StdRigidTypes<3u,double>>  Ray-TSphere<StdRigidTypes<3u,double>>  
  RayCollisionModel-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  Ray-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  RayCollisionModel-TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  Ray-TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  RayCollisionModel-TetrahedronCollisionModel  Ray-Tetrahedron  
  CubeCollisionModel-CubeCollisionModel  Cube-Cube  
  LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  SphereCollisionModel<StdRigidTypes<3u,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  nullptr  
  SphereCollisionModel<StdRigidTypes<3u,double>>-SphereCollisionModel<StdRigidTypes<3u,double>>  TSphere<StdRigidTypes<3u,double>>-TSphere<StdRigidTypes<3u,double>>  
  SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdRigidTypes<3u,double>>  TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdRigidTypes<3u,double>>  
  SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  nullptr  
  TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  nullptr  
  TetrahedronCollisionModel-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  Tetrahedron-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>  
  

208
209
210
211

  1. My entire code.
    The vessel file is from here, carotids.stl.
import Sofa

import Sofa
import Sofa.SofaGL
import os
import numpy as np
import pygame
from scipy.spatial.transform import Rotation as R
import time
import PIL.Image

import OpenGL.GL
import OpenGL.GLU

path = os.path.dirname(os.path.abspath(__file__))+'/vessel/'
model = 'phantom'

display_size = (640, 480)


def init_display(root):
    """Initialize OpenGL and pygame.

    Parameters:
    ----------
        root: Sofa.Core.Node
            Root node of Sofa simulator.

    Returns:
    -------
        None.

    """
    pygame.display.init()
    pygame.display.set_mode(display_size, pygame.DOUBLEBUF | pygame.OPENGL)

    OpenGL.GL.glClear(OpenGL.GL.GL_COLOR_BUFFER_BIT | OpenGL.GL.GL_DEPTH_BUFFER_BIT)
    OpenGL.GL.glEnable(OpenGL.GL.GL_LIGHTING)
    OpenGL.GL.glEnable(OpenGL.GL.GL_DEPTH_TEST)
    Sofa.SofaGL.glewInit()
    Sofa.Simulation.initVisual(root)
    Sofa.Simulation.initTextures(root)
    OpenGL.GL.glMatrixMode(OpenGL.GL.GL_PROJECTION)
    OpenGL.GL.glLoadIdentity()
    OpenGL.GLU.gluPerspective(45, (display_size[0] / display_size[1]), 0.1, 50.0)

    OpenGL.GL.glMatrixMode(OpenGL.GL.GL_MODELVIEW)
    OpenGL.GL.glLoadIdentity()
    

def simple_render(root):
    """Render camera of root onto pygame.
    Get the OpenGL Context to render an image (snapshot) of the simulation state

    Parameters:
    ----------
        root: Sofa.Core.Node
            Root node of Sofa simulator.

    Returns:
    -------
        None.

    """
    zNear = 0.1; zFar = 0 # For penetrate infinite view.
    OpenGL.GL.glClear(OpenGL.GL.GL_COLOR_BUFFER_BIT | OpenGL.GL.GL_DEPTH_BUFFER_BIT)
    OpenGL.GL.glEnable(OpenGL.GL.GL_LIGHTING)
    OpenGL.GL.glEnable(OpenGL.GL.GL_DEPTH_TEST)
    OpenGL.GL.glMatrixMode(OpenGL.GL.GL_PROJECTION)
    OpenGL.GL.glLoadIdentity()
    OpenGL.GLU.gluPerspective(45, (display_size[0] / display_size[1]), zNear, zFar)
    OpenGL.GL.glMatrixMode(OpenGL.GL.GL_MODELVIEW)
    OpenGL.GL.glLoadIdentity()

    cameraMVM = root.camera.getOpenGLModelViewMatrix()
    OpenGL.GL.glMultMatrixd(cameraMVM)
    Sofa.SofaGL.draw(root)

    pygame.display.flip()

def GetFrame():
    """
    Get frame image as numpy.

    Parameters:
    ----------
        kwargs: Dictionary
            Initialization of the arguments.

    Returns:
    -------
        image: np.ndarray

    """
    buffer = OpenGL.GL.glReadPixels(0, 0, *display_size, OpenGL.GL.GL_RGB, OpenGL.GL.GL_UNSIGNED_BYTE)
    image_array = np.fromstring(buffer, np.uint8)
    if image_array.shape != (0,):
        image = image_array.reshape(display_size[1], display_size[0], 3)
    else:
        image = np.zeros((display_size[1], display_size[0], 3))
    image = np.flipud(image)
    return image
    
def SaveImage(image:np.ndarray, filename:str):
    im = PIL.Image.fromarray(image)
    im.save(filename)
    

def createScene(root):
    root.addObject('RequiredPlugin', pluginName=['BeamAdapter',
                                                     'SofaMiscCollision',
                                                     'SofaConstraint',
                                                     'SofaImplicitOdeSolver',
                                                     'SofaGeneralLinearSolver',
                                                     'SofaBoundaryCondition',
                                                     'SofaDeformable',
                                                     'SofaTopologyMapping',
                                                     'SofaOpenglVisual,'
                                                     'SofaMeshCollision',
                                                     'Sofa.Component.Collision.Detection.Algorithm',
                                                     'Sofa.Component.IO.Mesh',
                                                     'Sofa.GL.Component.Rendering3D',
                                                     'Sofa.GL.Component.Shader'
                                                     ])
    root.addObject('FreeMotionAnimationLoop')
    root.addObject('VisualStyle', displayFlags=['showVisualModels',
                                                    'showCollisionModels',
                                                    ])
    root.addObject('LCPConstraintSolver', mu='0.1', tolerance='1e-10', maxIt='1000', build_lcp='false')
    root.addObject('DefaultPipeline', draw='0', depth='6', verbose='1')
    root.addObject('BruteForceBroadPhase', name='N2')
    root.addObject('BVHNarrowPhase')
    root.addObject('LocalMinDistance', contactDistance='1', alarmDistance='3', name='localmindistance', angleCone='0.02')
    root.addObject('DefaultContactManager', name='Response', response='FrictionContactConstraint')


    name='guide'
    straightLength=980.0
    length=1000.0
    numEdges=200
    youngModulus=20000
    spireDiameter=25
    numEdgesCollis=[50,10]
    spireHeight=0.0
    densityOfBeams=[30,5]
    youngModulusExtremity=10000
    topoLines_guide = root.addChild('topoLines_'+name)
    topoLines_guide.addObject('WireRestShape', name=name+'RestShape', 
                            straightLength=straightLength, length=length, 
                            numEdges=numEdges, youngModulus=youngModulus, 
                            spireDiameter=spireDiameter, numEdgesCollis=numEdgesCollis, 
                            printLog=True, template='Rigid3d', spireHeight=spireHeight, 
                            densityOfBeams=densityOfBeams, youngModulusExtremity=youngModulusExtremity)
    topoLines_guide.addObject('MechanicalObject', name='dofTopo2', template='Rigid3d')
    topoLines_guide.addObject('EdgeSetTopologyContainer', name='meshLinesGuide')
    topoLines_guide.addObject('EdgeSetTopologyModifier', name='Modifier')
    topoLines_guide.addObject('EdgeSetGeometryAlgorithms', name='GeomAlgo', template='Rigid3d')


    xtip=[1, 0, 0]
    instruments=['guide']
    step=0.5
    listening=True
    startingPos=[0, 0, 0, 1, 0, 0, 0]
    rotationInstrument=[0, 0, 0]
    speed=0
    controlledInstrument=0
    InstrumentCombined = root.addChild('InstrumentCombined')
    InstrumentCombined.addObject('EulerImplicitSolver', rayleighStiffness=0.2, 
                                    printLog=False, rayleighMass=0.1)
    InstrumentCombined.addObject('BTDLinearSolver', verification=False, 
                                    subpartSolve=False, verbose=False)
    InstrumentCombined.addObject('RegularGridTopology', name='meshLinesCombined', 
                                    zmax=1, zmin=1, nx=60, ny=1, nz=1, 
                                    xmax=1.0, xmin=0.0, ymin=0, ymax=0)
    InstrumentCombined.addObject('MechanicalObject', showIndices=False, name='DOFs', template='Rigid3d', ry=-90)
    for i in range(len(instruments)):
        InstrumentCombined.addObject('WireBeamInterpolation', WireRestShape='@../topoLines_'+instruments[i]+'/'+instruments[i]+'RestShape', 
                                    radius=0.15, printLog=False, name='Interpol'+instruments[i])
        InstrumentCombined.addObject('AdaptiveBeamForceFieldAndMass', massDensity=0.00000155, 
                                    name=instruments[i]+'ForceField', interpolation='@Interpol'+instruments[i])
    InstrumentCombined.addObject('InterventionalRadiologyController', xtip=xtip, name='m_ircontroller', 
                                    instruments=['Interpol'+instruments[i] for i in range(len(instruments))], 
                                    step=step, printLog=True, 
                                    listening=listening, template='Rigid3d', startingPos=startingPos, 
                                    rotationInstrument=rotationInstrument, speed=speed, 
                                    controlledInstrument=controlledInstrument)
    InstrumentCombined.addObject('LinearSolverConstraintCorrection', wire_optimization='true', printLog=False)
    InstrumentCombined.addObject('FixedConstraint', indices=0, name='FixedConstraint')
    InstrumentCombined.addObject('RestShapeSpringsForceField', points='@m_ircontroller.indexFirstNode', 
                                    angularStiffness=1e8, stiffness=1e8)
    # Collision model
    Collis = InstrumentCombined.addChild('Collis')
    #Collis.activated = 'true'
    Collis.addObject('EdgeSetTopologyContainer', name='collisEdgeSet')
    Collis.addObject('EdgeSetTopologyModifier', name='colliseEdgeModifier')
    Collis.addObject('MechanicalObject', name='CollisionDOFs')
    Collis.addObject('MultiAdaptiveBeamMapping', controller='../m_ircontroller', 
                        useCurvAbs=True, printLog=False, name='collisMap')
    Collis.addObject('LineCollisionModel', proximity=0.0, group=1)
    Collis.addObject('PointCollisionModel', proximity=0.0, group=1)
    # Visualization Guide
    VisuGuide = InstrumentCombined.addChild('VisuGuide')
    #VisuGuide.activated = 'true'
    VisuGuide.addObject('MechanicalObject', name='Quads')
    VisuGuide.addObject('QuadSetTopologyContainer', name='ContainerGuide')
    VisuGuide.addObject('QuadSetTopologyModifier', name='Modifier')
    VisuGuide.addObject('QuadSetGeometryAlgorithms', name='GeomAlgo', template='Vec3d')
    VisuGuide.addObject('Edge2QuadTopologicalMapping', radius='1', listening=True, 
                           input='@../../topoLines_guide/meshLinesGuide', 
                           nbPointsOnEachCircle='10', flipNormals='true', output='@ContainerGuide')
    VisuGuide.addObject('AdaptiveBeamMapping', interpolation='@../InterpolGuide', 
                           name='visuMapGuide', output='@Quads', isMechanical=False, 
                           input='@../DOFs', useCurvAbs=True, printLog=True)
    TriangleTopology = VisuGuide.addChild('TriangleTopology')
    TriangleTopology.addObject('TriangleSetTopologyContainer', name='TriangleContainer')
    TriangleTopology.addObject('TriangleSetTopologyModifier', name='Modifier')
    TriangleTopology.addObject('TriangleSetGeometryAlgorithms', name='GeomAlgo', template='Vec3d')
    TriangleTopology.addObject('Quad2TriangleTopologicalMapping', input='@../ContainerGuide', output='@TriangleContainer')
    # Ogl model
    VisuOgl = VisuGuide.addChild('VisuOgl')
    VisuOgl.addObject('OglModel', color=[0.2, 0.2, 0.8], triangles='@../TriangleTopology/TriangleContainer.triangles', 
                         material='texture Ambient 1 0.2 0.2 0.2 0.0 Diffuse 1 1.0 1.0 1.0 1.0 Specular 1 1.0 1.0 1.0 1.0 Emissive 0 0.15 0.05 0.05 0.0 Shininess 1 20', name='Visual')
    VisuOgl.addObject('IdentityMapping', input='@../Quads', output='@Visual')
    
    
    scale=1.5
    rotation=[-40.0, 0.0, 0.0]
    stl = 'carotids.stl'
    VISUAL = True
    vessels = root.addChild('Vessels')
    vessels.addObject('MeshSTLLoader', filename=stl, flipNormals=False, triangulate=True, name='meshLoader', scale=scale, rotation=rotation)
    vessels.addObject('MeshTopology', position='@meshLoader.position', triangles='@meshLoader.triangles')
    vessels.addObject('MechanicalObject', name='DOFs1', scale=1, rotation=rotation)
    vessels.addObject('TriangleCollisionModel', moving=False, simulated=False)
    vessels.addObject('LineCollisionModel', moving=False, simulated=False)
    vessels.addObject('PointCollisionModel', moving=False, simulated=False)
    vessels.addObject('OglModel', color=[1, 0, 0, 0.3], src='@meshLoader', name='Visual', rotation=rotation)


    # Add a sphere.
    newSphere = root.addChild('FixedSphere')
    newSphere.addObject('EulerImplicitSolver')
    newSphere.addObject('CGLinearSolver', threshold='1e-09', tolerance='1e-09', iterations='200')
    MO = newSphere.addObject('MechanicalObject', showObject=True, position=[0, 200, 200, 0, 0, 0, 0], name='Particle', template='Rigid3d')
    Mass = newSphere.addObject('UniformMass', totalMass=1)
    Force = newSphere.addObject('ConstantForceField', name="CFF", totalForce=[0, 0, 0, 0, 0, 0] )
    Sphere = newSphere.addObject('SphereCollisionModel', name="SCM", radius=30.0 )
    newSphere.addObject('FixedConstraint', name='FixedConstraint', indices=0)
    newSphere.addObject('OglModel', color=[1, 0, 0, 0.3],  name='Visual')
    
    
    
    # visualizing
    source = [-600,0,300]
    lookAt = source+np.array([1,0,0])
    orientation = [ 0, -0.70710678, 0, 0.70710678]
    root.addObject("LightManager")
    root.addObject("DirectionalLight", direction=[-1,0,0])
    root.addObject('InteractiveCamera', name='camera', position=source,
                    lookAt=lookAt, orientation=orientation)
    
if __name__ == "__main__":
    # Read real information from real world.
    pass

    # One simulation for one root. Maybe.
    # Create scene and initialize simulation.
    root = Sofa.Core.Node("root")
    createScene(root)
    Sofa.Simulation.init(root)

    # Initialize pygame.
    init_display(root)
    
    try:
        for i in range(10000):
            root.InstrumentCombined.m_ircontroller.findData('xtip').value =\
                root.InstrumentCombined.m_ircontroller.findData('xtip').value \
                + np.array([2,110,2], dtype=float)
            
            # Calculate simulator one step.
            Sofa.Simulation.animate(root, root.dt.value)
            Sofa.Simulation.updateVisual(root)
            time.sleep(root.dt.value)
            
            # Visualize in pygame.
            simple_render(root)
            
            
            # Save image of pygame.
            image = GetFrame()
            SaveImage(image, f"screen.jpeg")
            
            
            print(i)
            
            
    except KeyboardInterrupt:
        pass
        

How can I ensure interaction between the catheter and the sphere?

@KHJ273 KHJ273 changed the title Catheter-Sphere Interaction How to make two objects collide Apr 9, 2024
@KHJ273 KHJ273 changed the title How to make two objects collide How to make a beam collide with other objects Apr 9, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant