TransformPosition
This component belongs to the category of Engines. The TransformPosition engine transforms the positions of one DataFields into new positions after applying a transformation. This transformation can be either:
- Projection on a plane (plane defined by an origin and a normal vector)
- Translation, rotation, scale and some combinations of translation rotation and scale
Transform position of 3d points.
Vec3d
Templates:
- Vec3d
Target: Sofa.Component.Engine.Transform
namespace: sofa::component::engine::transform
parents:
- DataEngine
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 |
method | transformation method either translation or scale or rotation or random or projectOnPlane | |
seedValue | the seed value for the random generator | 0 |
maxRandomDisplacement | the maximum displacement around initial position for the random transformation | 1 |
filename | filename of an affine matrix. Supported extensions are: .trm, .tfm, .xfm and .txt(read as .xfm) | |
Inputs | ||
origin | A 3d point on the plane/Center of the scale | |
input_position | input array of 3d points | |
normal | plane normal | |
translation | translation vector | |
rotation | rotation vector | |
scale | scale factor | 1 1 1 |
matrix | 4x4 affine matrix | [1 0 0 0,0 1 0 0,0 0 1 0,0 0 0 1] |
fixedIndices | Indices of the entries that are not transformed | |
Outputs | ||
output_position | output array of 3d points projected on a plane | |
Visualization | ||
drawInput | Draw input points | 0 |
drawOutput | Draw output points | 0 |
pointSize | Point size | 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
TransformPosition.scn
<Node name="root" gravity="0 0 -9.81" dt="0.05">
<RequiredPlugin name="Sofa.Component.Collision.Detection.Algorithm"/> <!-- Needed to use components [BVHNarrowPhase BruteForceBroadPhase CollisionPipeline] -->
<RequiredPlugin name="Sofa.Component.Collision.Detection.Intersection"/> <!-- Needed to use components [MinProximityIntersection] -->
<RequiredPlugin name="Sofa.Component.Collision.Response.Contact"/> <!-- Needed to use components [CollisionResponse] -->
<RequiredPlugin name="Sofa.Component.Engine.Transform"/> <!-- Needed to use components [TransformPosition] -->
<RequiredPlugin name="Sofa.Component.IO.Mesh"/> <!-- Needed to use components [MeshOBJLoader] -->
<RequiredPlugin name="Sofa.Component.LinearSolver.Iterative"/> <!-- Needed to use components [CGLinearSolver] -->
<RequiredPlugin name="Sofa.Component.Mapping.Linear"/> <!-- Needed to use components [BarycentricMapping] -->
<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.Backward"/> <!-- Needed to use components [EulerImplicitSolver] -->
<RequiredPlugin name="Sofa.Component.SolidMechanics.FEM.Elastic"/> <!-- Needed to use components [HexahedronFEMForceField] -->
<RequiredPlugin name="Sofa.Component.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->
<RequiredPlugin name="Sofa.Component.Topology.Container.Grid"/> <!-- Needed to use components [SparseGridTopology] -->
<RequiredPlugin name="Sofa.Component.Visual"/> <!-- Needed to use components [VisualStyle] -->
<RequiredPlugin name="Sofa.GL.Component.Rendering3D"/> <!-- Needed to use components [OglModel] -->
<DefaultAnimationLoop/>
<VisualStyle displayFlags="showVisual showBehaviorModels" />
<CollisionPipeline name="DefaultCollisionPipeline" verbose="0" draw="0" depth="6" />
<BruteForceBroadPhase/>
<BVHNarrowPhase/>
<MinProximityIntersection name="Proximity" alarmDistance="3" contactDistance="2" />
<CollisionResponse name="Response" response="PenalityContactForceField" />
<Node name="Object" gravity="0 -9.81 0">
<EulerImplicitSolver name="Implicit Euler Solver" rayleighStiffness="0.1" rayleighMass="0.1" />
<CGLinearSolver name="Conjugate Gradient" tolerance="1e-05" threshold="1e-05" iterations="5"/>
<SparseGridTopology name="grid" fileTopology="mesh/dragon.obj" n="7 6 5" />
<TransformPosition name="transfo" method="fromFile" filename="transfo.tfm" input_position="@grid.position"/>
<MechanicalObject name="Particles" restScale="1" position="@transfo.output_position" />
<UniformMass name="Mass" totalMass="1.0"/>
<PlaneForceField name="Plane" normal="0 0 1" d="-10" />
<HexahedronFEMForceField name="FEM" youngModulus="200" poissonRatio="0.45"/>
<Node name="VisualNode" gravity="0 -9.81 0">
<MeshOBJLoader name="meshLoader_0" filename="mesh/dragon.obj" handleSeams="1" />
<OglModel name="Objective" src="@meshLoader_0" />
<BarycentricMapping name="Visual Mapping" output="@Objective" />
</Node>
</Node>
<Node name="Floor">
<MeshOBJLoader name="ObjLoader" filename="mesh/floor.obj" />
<OglModel name="VisualModel" src="@./ObjLoader" translation="0 0 -9" rotation="90 0 0"/>
</Node>
</Node>
def createScene(root_node):
root = root_node.addChild('root', gravity="0 0 -9.81", dt="0.05")
root.addObject('RequiredPlugin', name="Sofa.Component.Collision.Detection.Algorithm")
root.addObject('RequiredPlugin', name="Sofa.Component.Collision.Detection.Intersection")
root.addObject('RequiredPlugin', name="Sofa.Component.Collision.Response.Contact")
root.addObject('RequiredPlugin', name="Sofa.Component.Engine.Transform")
root.addObject('RequiredPlugin', name="Sofa.Component.IO.Mesh")
root.addObject('RequiredPlugin', name="Sofa.Component.LinearSolver.Iterative")
root.addObject('RequiredPlugin', name="Sofa.Component.Mapping.Linear")
root.addObject('RequiredPlugin', name="Sofa.Component.Mass")
root.addObject('RequiredPlugin', name="Sofa.Component.MechanicalLoad")
root.addObject('RequiredPlugin', name="Sofa.Component.ODESolver.Backward")
root.addObject('RequiredPlugin', name="Sofa.Component.SolidMechanics.FEM.Elastic")
root.addObject('RequiredPlugin', name="Sofa.Component.StateContainer")
root.addObject('RequiredPlugin', name="Sofa.Component.Topology.Container.Grid")
root.addObject('RequiredPlugin', name="Sofa.Component.Visual")
root.addObject('RequiredPlugin', name="Sofa.GL.Component.Rendering3D")
root.addObject('DefaultAnimationLoop', )
root.addObject('VisualStyle', displayFlags="showVisual showBehaviorModels")
root.addObject('CollisionPipeline', name="DefaultCollisionPipeline", verbose="0", draw="0", depth="6")
root.addObject('BruteForceBroadPhase', )
root.addObject('BVHNarrowPhase', )
root.addObject('MinProximityIntersection', name="Proximity", alarmDistance="3", contactDistance="2")
root.addObject('CollisionResponse', name="Response", response="PenalityContactForceField")
object = root.addChild('Object', gravity="0 -9.81 0")
object.addObject('EulerImplicitSolver', name="Implicit Euler Solver", rayleighStiffness="0.1", rayleighMass="0.1")
object.addObject('CGLinearSolver', name="Conjugate Gradient", tolerance="1e-05", threshold="1e-05", iterations="5")
object.addObject('SparseGridTopology', name="grid", fileTopology="mesh/dragon.obj", n="7 6 5")
object.addObject('TransformPosition', name="transfo", method="fromFile", filename="transfo.tfm", input_position="@grid.position")
object.addObject('MechanicalObject', name="Particles", restScale="1", position="@transfo.output_position")
object.addObject('UniformMass', name="Mass", totalMass="1.0")
object.addObject('PlaneForceField', name="Plane", normal="0 0 1", d="-10")
object.addObject('HexahedronFEMForceField', name="FEM", youngModulus="200", poissonRatio="0.45")
visual_node = Object.addChild('VisualNode', gravity="0 -9.81 0")
visual_node.addObject('MeshOBJLoader', name="meshLoader_0", filename="mesh/dragon.obj", handleSeams="1")
visual_node.addObject('OglModel', name="Objective", src="@meshLoader_0")
visual_node.addObject('BarycentricMapping', name="Visual Mapping", output="@Objective")
floor = root.addChild('Floor')
floor.addObject('MeshOBJLoader', name="ObjLoader", filename="mesh/floor.obj")
floor.addObject('OglModel', name="VisualModel", src="@./ObjLoader", translation="0 0 -9", rotation="90 0 0")