OglFluidModel
Particle model for OpenGL display, using glsl.
Vec3d
Templates:
- Vec3d
 
Target: SofaSphFluid
namespace: sofa::component::visualmodel
parents:
- VisualModel
 
Data
| Name | Description | Default value | 
|---|---|---|
| name | object name | unnamed | 
| printLog | if true, emits extra messages at runtime. | 0 | 
| tags | list of the subsets the object belongs to | |
| bbox | this object bounding box | |
| componentState | The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). | Undefined | 
| listening | if true, handle the events, otherwise ignore the events | 0 | 
| enable | Display the object or not | 1 | 
| position | Vertices coordinates | |
| debugFBO | DEBUG FBO | 9 | 
| spriteRadius | Radius of sprites | 1 | 
| spriteThickness | Thickness of sprites | 0.01 | 
| spriteBlurRadius | Blur radius (in pixels) | 10 | 
| spriteBlurScale | Blur scale | 0.1 | 
| spriteBlurDepthFalloff | Blur Depth Falloff | 1 | 
| spriteDiffuseColor | Diffuse Color | 0 0 1 1 | 
Links
| Name | Description | Destination type name | 
|---|---|---|
| context | Graph Node containing this object (or BaseContext::getDefault() if no graph is used) | BaseContext | 
| slaves | Sub-objects used internally by this object | BaseObject | 
| master | nullptr for regular objects, or master object for which this object is one sub-objects | BaseObject | 
Examples
OglFluidModel_SPH.scn
<?xml version="1.0" ?>
<Node dt="0.01" gravity="0 -20 0.0" >
    <RequiredPlugin name="Sofa.Component.Mass"/> <!-- Needed to use components [UniformMass] -->
    <RequiredPlugin name="Sofa.Component.MechanicalLoad"/> <!-- Needed to use components [PlaneForceField] -->
    <RequiredPlugin name="Sofa.Component.ODESolver.Forward"/> <!-- Needed to use components [EulerExplicitSolver] -->
    <RequiredPlugin name="Sofa.Component.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->
    <RequiredPlugin name="Sofa.Component.Topology.Container.Grid"/> <!-- Needed to use components [RegularGridTopology] -->
    <RequiredPlugin name="Sofa.Component.Visual"/> <!-- Needed to use components [VisualStyle] -->
    <RequiredPlugin name="SofaSphFluid"/> <!-- Needed to use components [OglFluidModel SPHFluidForceField SpatialGridContainer] -->
    <VisualStyle displayFlags="hideBehaviorModels hideForceFields hideCollisionModels" />
    <DefaultAnimationLoop/>
    <Node name="SPH" >
        <EulerExplicitSolver symplectic="1" />
        <RegularGridTopology nx="5" ny="400" nz="5" xmin="-3.0" xmax="0" ymin="-3" ymax="36" zmin="-3.0" zmax="0" />
        <MechanicalObject name="MModel" />
        <!-- A topology is used here just to set initial particles positions. It is a bad idea because this object has no real topology, but it works... -->
        <UniformMass name="M1" vertexMass="1" />
        <SpatialGridContainer cellWidth="0.75" />
        <SPHFluidForceField radius="0.745" density="15" kernelType="1" viscosityType="2" viscosity="10" pressure="1000" surfaceTension="-1000" printLog="0" />
        <!-- The following force fields handle collision with walls and an inclined floor -->
        <PlaneForceField normal="1 0 0" d="-4" />
        <PlaneForceField normal="-1 0 0" d="-4" />
        <PlaneForceField normal="0.5 1 0.1" d="-4" />
        <PlaneForceField normal="0 0 1" d="-10" />
        <PlaneForceField normal="0 0 -1" d="-10" />
    </Node>
    <Node name="Fluid" >            
        <OglFluidModel template="Vec3d" position="@../SPH/MModel.position" 
            debugFBO="9"
            spriteRadius="0.5" spriteThickness="0.015" spriteBlurRadius="10" spriteBlurScale="10" spriteBlurDepthFalloff="1"  />
    </Node>
</Node>
def createScene(root_node):
   node = root_node.addChild('node', dt="0.01", gravity="0 -20 0.0")
   node.addObject('RequiredPlugin', name="Sofa.Component.Mass")
   node.addObject('RequiredPlugin', name="Sofa.Component.MechanicalLoad")
   node.addObject('RequiredPlugin', name="Sofa.Component.ODESolver.Forward")
   node.addObject('RequiredPlugin', name="Sofa.Component.StateContainer")
   node.addObject('RequiredPlugin', name="Sofa.Component.Topology.Container.Grid")
   node.addObject('RequiredPlugin', name="Sofa.Component.Visual")
   node.addObject('RequiredPlugin', name="SofaSphFluid")
   node.addObject('VisualStyle', displayFlags="hideBehaviorModels hideForceFields hideCollisionModels")
   node.addObject('DefaultAnimationLoop', )
   sph = node.addChild('SPH')
   sph.addObject('EulerExplicitSolver', symplectic="1")
   sph.addObject('RegularGridTopology', nx="5", ny="400", nz="5", xmin="-3.0", xmax="0", ymin="-3", ymax="36", zmin="-3.0", zmax="0")
   sph.addObject('MechanicalObject', name="MModel")
   sph.addObject('UniformMass', name="M1", vertexMass="1")
   sph.addObject('SpatialGridContainer', cellWidth="0.75")
   sph.addObject('SPHFluidForceField', radius="0.745", density="15", kernelType="1", viscosityType="2", viscosity="10", pressure="1000", surfaceTension="-1000", printLog="0")
   sph.addObject('PlaneForceField', normal="1 0 0", d="-4")
   sph.addObject('PlaneForceField', normal="-1 0 0", d="-4")
   sph.addObject('PlaneForceField', normal="0.5 1 0.1", d="-4")
   sph.addObject('PlaneForceField', normal="0 0 1", d="-10")
   sph.addObject('PlaneForceField', normal="0 0 -1", d="-10")
   fluid = node.addChild('Fluid')
   fluid.addObject('OglFluidModel', template="Vec3d", position="@../SPH/MModel.position", debugFBO="9", spriteRadius="0.5", spriteThickness="0.015", spriteBlurRadius="10", spriteBlurScale="10", spriteBlurDepthFalloff="1")
OglFluidModel_SPHParticles.scn
<?xml version="1.0" ?>
<Node dt="0.01" gravity="0 -10 0" bbox="-6 -6 -6  6 6 6">
    <RequiredPlugin name="Sofa.Component.Mass"/> <!-- Needed to use components [UniformMass] -->
    <RequiredPlugin name="Sofa.Component.ODESolver.Forward"/> <!-- Needed to use components [EulerExplicitSolver] -->
    <RequiredPlugin name="Sofa.Component.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->
    <RequiredPlugin name="Sofa.Component.Topology.Container.Dynamic"/> <!-- Needed to use components [PointSetTopologyContainer PointSetTopologyModifier] -->
    <RequiredPlugin name="Sofa.Component.Visual"/> <!-- Needed to use components [VisualStyle] -->
    <RequiredPlugin name="SofaSphFluid"/> <!-- Needed to use components [OglFluidModel ParticleSink ParticleSource SPHFluidForceField SpatialGridContainer] -->
    <VisualStyle displayFlags="hideBehaviorModels hideForceFields hideWireframe" />
    <DefaultAnimationLoop/>
    <Node name="Particles">
        <EulerExplicitSolver symplectic="1" />
        <MechanicalObject name="MModel"/>
        <ParticleSource name="Source" translation="0 20 0" radius="0.01 0.1 0.01" velocity="0 -10 0" delay="0.02" start="0.0" stop="10" printLog="0"
        center="-0.375 0 -0.75 
            0.0 0.0 -0.75 
            0.375 0.0 -0.75 
            -0.75  0.0 -0.375 
            -0.375 0.0 -0.375 
            0.0 0.0 -0.375 
            0.375 0.0 -0.375 
            0.75 0.0 -0.375 
            -0.75 0.0 0.0 
            -0.375 0.0 0.0 
            0.0 0.0 0.0 
            0.375 0.0 0.0 
            0.75 0.0 0.0 
            -0.75 0.0 0.375 
            -0.375 0.0 0.375 
            0.0 0.0 0.375 
            0.375 0.0 0.375 
            0.75 0.0 0.375 
            -0.375 0.0 0.75 
            0.0 0.0 0.75 
            0.375 0.0 0.75"  />
        <UniformMass name="M1" vertexMass="1.0" />
        <PointSetTopologyContainer name="con" />
        <PointSetTopologyModifier name="mod" />
        <SpatialGridContainer cellWidth="0.75" />
        <SPHFluidForceField radius="0.7" density="25" kernelType="1" viscosityType="2" viscosity="10" pressure="1000" surfaceTension="-1000" printLog="0" />
        <ParticleSink name="sink" normal="0 1 0" d0="1" d1="0" showPlane="0" printLog="0" />
        <Node name="Fluid" >            
            <OglFluidModel template="Vec3d" position="@../MModel.position" 
                debugFBO="9"
                spriteRadius="0.5" spriteThickness="0.015" spriteBlurRadius="10" spriteBlurScale="10" spriteBlurDepthFalloff="1"  />
        </Node>
    </Node>
</Node>
def createScene(root_node):
   node = root_node.addChild('node', dt="0.01", gravity="0 -10 0", bbox="-6 -6 -6  6 6 6")
   node.addObject('RequiredPlugin', name="Sofa.Component.Mass")
   node.addObject('RequiredPlugin', name="Sofa.Component.ODESolver.Forward")
   node.addObject('RequiredPlugin', name="Sofa.Component.StateContainer")
   node.addObject('RequiredPlugin', name="Sofa.Component.Topology.Container.Dynamic")
   node.addObject('RequiredPlugin', name="Sofa.Component.Visual")
   node.addObject('RequiredPlugin', name="SofaSphFluid")
   node.addObject('VisualStyle', displayFlags="hideBehaviorModels hideForceFields hideWireframe")
   node.addObject('DefaultAnimationLoop', )
   particles = node.addChild('Particles')
   particles.addObject('EulerExplicitSolver', symplectic="1")
   particles.addObject('MechanicalObject', name="MModel")
   particles.addObject('ParticleSource', name="Source", translation="0 20 0", radius="0.01 0.1 0.01", velocity="0 -10 0", delay="0.02", start="0.0", stop="10", printLog="0", center="-0.375 0 -0.75              0.0 0.0 -0.75              0.375 0.0 -0.75              -0.75  0.0 -0.375              -0.375 0.0 -0.375              0.0 0.0 -0.375              0.375 0.0 -0.375              0.75 0.0 -0.375              -0.75 0.0 0.0              -0.375 0.0 0.0              0.0 0.0 0.0              0.375 0.0 0.0              0.75 0.0 0.0              -0.75 0.0 0.375              -0.375 0.0 0.375              0.0 0.0 0.375              0.375 0.0 0.375              0.75 0.0 0.375              -0.375 0.0 0.75              0.0 0.0 0.75              0.375 0.0 0.75")
   particles.addObject('UniformMass', name="M1", vertexMass="1.0")
   particles.addObject('PointSetTopologyContainer', name="con")
   particles.addObject('PointSetTopologyModifier', name="mod")
   particles.addObject('SpatialGridContainer', cellWidth="0.75")
   particles.addObject('SPHFluidForceField', radius="0.7", density="25", kernelType="1", viscosityType="2", viscosity="10", pressure="1000", surfaceTension="-1000", printLog="0")
   particles.addObject('ParticleSink', name="sink", normal="0 1 0", d0="1", d1="0", showPlane="0", printLog="0")
   fluid = Particles.addChild('Fluid')
   fluid.addObject('OglFluidModel', template="Vec3d", position="@../MModel.position", debugFBO="9", spriteRadius="0.5", spriteThickness="0.015", spriteBlurRadius="10", spriteBlurScale="10", spriteBlurDepthFalloff="1")