Proportional Transformation

Hi all,

Is there a way to move a part of a segment proportionally in relation to another segment 3D Slicer?
I have attached a photo to illustrate it something i did via Blender.

For example, when I move the mandible i want the skin to move with it but not 1 to 1 but proportionately. If the center of the chin move 0.8 of the movement of the mandible and as it goes away from the center of the chin (skin) the corresponding movement should be less like 0.7, 0.6 etc…

I am wondering if this is possible with the 3D slicer for surgical simulation.

You can use thin-plate spline transform for smooth warping, which usually pretty well simulates soft tissue motion (available in SlicerIGT extension / Fiducial registration wizard module) and might be acceptable for approximate visualization of surgical outcomes. You can of course also compute transforms automatically from other transforms, with 3-4 lines of Python scripts (add an observer to the affected transforms and compute interpolated/combined transform in the callback function).

There are many options for more realistic computations, too.

To model rigid bone motion, you would need to define some kind of a skeleton (bones and joints). There was a 3D Slicer-based project, Bender, which allowed to create highly realistic volumetric animations (not just realistic-looking outside surface motion as basic rigged models in Blender work). You could probably revive this application and rig a head model.

You could also export your segmentation, load it into FeBIO Studio, do FEM analysis, and import the displacements back to Slicer for visualization.

1 Like

Dear Prof @lassoan many thanks for your reply.

Do you mean in the Fiducial registration wizard module creating a transform and applying a warping transformation?

I tried that and the results don’t really make sense to me. so maybe you meant something else?

Can you please give me bit more information on how to do the thin-plate spline transform for smooth warping ? I am not sure I doing it right.

Also thank you for the information with Bender. Unfortunately, the binary files are not there and I will try to compile it to play with it and see.

Thank you


You can follow these steps to warp any nodes (volumes, segmentations, models, etc):

  • Create a markups fiducial node and place 10 control points distributed evenly over the skin surface and another 10 inside the volume. You will prescribe displacement at these positions: either to move it somewhere else or to keep it at the same place.
  • Clone the markups fiducial node (in Data module, right-click on the markups node), and name one of them “From points” and the other “To points”.
  • Lock “From points” to make sure those point positions are not modified (in Markups module / Control Points / Interaction in views -> click on the lock icon)
  • In Fiducial registration wizard:
    • From fiducials -> “From points”
    • To fiducials -> “To points”
    • Registration result transform -> Select a linear transform -> Create new transform
    • Result transform type -> Warping
  • Apply transform to the nodes if you want to see real-time update of the warping results (in Data module, right-click on transform icon and choose the created Transform node)
  • Drag-and-drop “To points” to warp the nodes
1 Like