Skip to content

VoronoiToMeshEngine

Generate flat faces between adjacent regions of an image

Templates:

  • ImageUC
  • ImageUI

Target: image

namespace: sofa::component::engine

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
image Voronoi image 0 0 0 0 0
background Optional Voronoi image of the background to surface details 0 0 0 0 0
transform 0 0 0 0 0 0 1 1 1 0 1 0
position output positions
edges output edges
triangles output triangles
minLength minimum edge length in pixels 2
Visualization
showMesh show reconstructed mesh 0
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

VoronoiToMeshEngine.scn

<?xml version="1.0"?>
<Node   name="root" gravity="0 0 0" dt="1"  >
    <Node name="plugins">
        <RequiredPlugin name="Sofa.Component.IO.Mesh"/> <!-- Needed to use components [MeshOBJLoader] -->
        <RequiredPlugin name="Sofa.Component.Setting"/> <!-- Needed to use components [BackgroundSetting] -->
        <RequiredPlugin name="Sofa.GL.Component.Rendering3D"/> <!-- Needed to use components [OglModel] -->
        <RequiredPlugin name="image"/> <!-- Needed to use components [ImageContainer ImageSampler MeshToImageEngine TransferFunction VoronoiToMeshEngine] -->
    </Node>
 <BackgroundSetting color="1 1 1"/>


<!--Simple flat outer shape (no need to sample the background)-->
<Node name="box" >
     <MeshOBJLoader  filename="mesh/cube.obj"  triangulate="1"  name="mesh" scale3d="3 0.5 3" translation="10 0 0" />
     <MeshToImageEngine  template="ImageUC"  name="rasterizer"  position="@mesh.position"  triangles="@mesh.triangles"  value="1"  voxelSize="0.1"  padSize="2"  />
     <ImageContainer  template="ImageUC"  name="image"  src="@rasterizer"/>
<!--     <ImageViewer  template="ImageUC"  src="@image"/>-->

     <ImageSampler  name="sampler"  template="ImageUC"  src="@image"  method="1"  param="50"  showSamplesScale="10"  clearData="0"/>
<!--     <ImageViewer  template="ImageUI"  transform="@image.transform"  image="@sampler.voronoi"  plane="-1 10 -1"/>-->

     <VoronoiToMeshEngine  name="VoronoiToMesh"  template="ImageUI"  transform="@image.transform"  image="@sampler.voronoi"  showMesh="0" minLength="0.5" printLog="1"/>

     <OglModel position="@VoronoiToMesh.position" edges="@VoronoiToMesh.edges" color="red" lineWidth="1" lineSmooth="1"/>
     <OglModel position="@VoronoiToMesh.position" triangles="@VoronoiToMesh.triangles" color="5e-1 5e-1 10e-1 1e-1" lineWidth="1"/>

</Node>

<!--more complex outer shape -->
<Node name="gear" >
     <MeshOBJLoader  filename="mesh/gear0.obj"  triangulate="1"  name="mesh"  />
     <MeshToImageEngine  template="ImageUC"  name="rasterizer"  position="@mesh.position"  triangles="@mesh.triangles"  value="1"  voxelSize="0.12"  padSize="2"  />
     <ImageContainer  template="ImageUC"  name="image"  src="@rasterizer"/>
<!--     <ImageViewer  template="ImageUC"  src="@image"/>-->

     <TransferFunction  template="ImageUC,ImageUC" name="tf" inputImage="@image.image" param="0 1 1 0"   />
     <ImageContainer  template="ImageUC"  name="background"  image="@tf.outputImage" transform="@image.transform"/>
    <!-- <ImageViewer  template="ImageUC"  src="@background"/>-->

     <ImageSampler  name="sampler"  template="ImageUC"  src="@image"  method="1"  param="40"  showSamplesScale="10"  clearData="0"/>
<!--     <ImageViewer  template="ImageUI"  transform="@image.transform"  image="@sampler.voronoi"  plane="-1 10 -1"/>-->
     <ImageSampler  name="sampler_background"  template="ImageUC"  src="@background"  method="1"  param="150"  clearData="0"/>

     <VoronoiToMeshEngine  name="VoronoiToMesh"  template="ImageUI"  transform="@image.transform"  image="@sampler.voronoi"  background="@sampler_background.voronoi"  showMesh="0" minLength="0.5" printLog="1"/>

     <OglModel position="@VoronoiToMesh.position" edges="@VoronoiToMesh.edges" color="red" lineWidth="1" lineSmooth="1"/>
     <OglModel position="@VoronoiToMesh.position" triangles="@VoronoiToMesh.triangles" color="5e-1 5e-1 10e-1 1e-1" lineWidth="1"/>
</Node>

<!--      <ClipPlane normal="0 1 0" position="0 0 0"/>-->

</Node>
def createScene(root_node):

   root = root_node.addChild('root', gravity="0 0 0", dt="1")

   plugins = root.addChild('plugins')

   plugins.addObject('RequiredPlugin', name="Sofa.Component.IO.Mesh")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.Setting")
   plugins.addObject('RequiredPlugin', name="Sofa.GL.Component.Rendering3D")
   plugins.addObject('RequiredPlugin', name="image")

   root.addObject('BackgroundSetting', color="1 1 1")

   box = root.addChild('box')

   box.addObject('MeshOBJLoader', filename="mesh/cube.obj", triangulate="1", name="mesh", scale3d="3 0.5 3", translation="10 0 0")
   box.addObject('MeshToImageEngine', template="ImageUC", name="rasterizer", position="@mesh.position", triangles="@mesh.triangles", value="1", voxelSize="0.1", padSize="2")
   box.addObject('ImageContainer', template="ImageUC", name="image", src="@rasterizer")
   box.addObject('ImageSampler', name="sampler", template="ImageUC", src="@image", method="1", param="50", showSamplesScale="10", clearData="0")
   box.addObject('VoronoiToMeshEngine', name="VoronoiToMesh", template="ImageUI", transform="@image.transform", image="@sampler.voronoi", showMesh="0", minLength="0.5", printLog="1")
   box.addObject('OglModel', position="@VoronoiToMesh.position", edges="@VoronoiToMesh.edges", color="red", lineWidth="1", lineSmooth="1")
   box.addObject('OglModel', position="@VoronoiToMesh.position", triangles="@VoronoiToMesh.triangles", color="5e-1 5e-1 10e-1 1e-1", lineWidth="1")

   gear = root.addChild('gear')

   gear.addObject('MeshOBJLoader', filename="mesh/gear0.obj", triangulate="1", name="mesh")
   gear.addObject('MeshToImageEngine', template="ImageUC", name="rasterizer", position="@mesh.position", triangles="@mesh.triangles", value="1", voxelSize="0.12", padSize="2")
   gear.addObject('ImageContainer', template="ImageUC", name="image", src="@rasterizer")
   gear.addObject('TransferFunction', template="ImageUC,ImageUC", name="tf", inputImage="@image.image", param="0 1 1 0")
   gear.addObject('ImageContainer', template="ImageUC", name="background", image="@tf.outputImage", transform="@image.transform")
   gear.addObject('ImageSampler', name="sampler", template="ImageUC", src="@image", method="1", param="40", showSamplesScale="10", clearData="0")
   gear.addObject('ImageSampler', name="sampler_background", template="ImageUC", src="@background", method="1", param="150", clearData="0")
   gear.addObject('VoronoiToMeshEngine', name="VoronoiToMesh", template="ImageUI", transform="@image.transform", image="@sampler.voronoi", background="@sampler_background.voronoi", showMesh="0", minLength="0.5", printLog="1")
   gear.addObject('OglModel', position="@VoronoiToMesh.position", edges="@VoronoiToMesh.edges", color="red", lineWidth="1", lineSmooth="1")
   gear.addObject('OglModel', position="@VoronoiToMesh.position", triangles="@VoronoiToMesh.triangles", color="5e-1 5e-1 10e-1 1e-1", lineWidth="1")