165 lines (139 with data), 7.4 kB
AnyFolder InterfaceMorphingDef = {
#if ! BM_LEG_MODEL_IS_TLEM
AnyFunTransform3DIdentity IM_Leg_To_Trunk_Unscaled= {};
AnyFunTransform3DIdentity IM_Trunk_To_Leg_Unscaled= {};
#else
/// IM landmarks of the trunk's pelvis
AnyMatrix points_RBF_TrunkPelvis_Unscaled = .StdPar.points_RBF_unscaled;
#if BM_LEG_MODEL_IS_TLEM
/// IM landmarks of the leg's pelvis
AnyMatrix points_RBF_LegPelvis_Unscaled = ....LEG_MODEL_PARAM_DIRECTION.Leg.ModelParameters.Pelvis.points_RBF_unscaled;
#endif
#ifndef BM_LEG_TRUNK_INTERFACE
#define BM_LEG_TRUNK_INTERFACE _MORPH_NONE_
#endif
#if BM_LEG_TRUNK_INTERFACE == _MORPH_NONE_
///^ Interface morphing was switched off.
///^ Neither trunk nor leg pelvis are modified by the interface morphing.
AnyFunTransform3DIdentity IM_Trunk_To_Leg_Unscaled = {};
#if BM_LEG_MODEL_IS_TLEM
/// A rigid body transformation from the leg to the trunk
/// coordinate systems using the anatomical ref. frame as intermediate system.
/// No morphing is applied.
AnyFunTransform3D IM_Leg_To_Trunk_Unscaled = {
AnyFloat Trunk_Pelvis_AnatomicalFrame_s = MACRO_CONSTRUCT_ANATOMICAL_FRAME_s(..AnatomicalFrame.pUnscaled_Trunk_Pelvis, 1) ;
AnyFloat Trunk_Pelvis_AnatomicalFrame_A = MACRO_CONSTRUCT_ANATOMICAL_FRAME_A(..AnatomicalFrame.pUnscaled_Trunk_Pelvis, 1) ;
AnyFloat Leg_Pelvis_AnatomicalFrame_s = MACRO_CONSTRUCT_ANATOMICAL_FRAME_s(..AnatomicalFrame.pUnscaled_Leg_Pelvis, 1) ;
AnyFloat Leg_Pelvis_AnatomicalFrame_A = MACRO_CONSTRUCT_ANATOMICAL_FRAME_A(..AnatomicalFrame.pUnscaled_Leg_Pelvis, 1) ;
AnyFunTransform3DLin tr1 = {
ScaleMat = (.Leg_Pelvis_AnatomicalFrame_A)' ;
Offset = -.Leg_Pelvis_AnatomicalFrame_s ;
};
AnyFunTransform3DLin tr2 = {
ScaleMat = (.Trunk_Pelvis_AnatomicalFrame_A);
Offset = .Trunk_Pelvis_AnatomicalFrame_s * .Trunk_Pelvis_AnatomicalFrame_A ;
};
PreTransforms = {&tr1, &tr2 };
};
#endif
#endif
#if BM_LEG_TRUNK_INTERFACE == _MORPH_TRUNK_TO_LEG_
///^ Interface morphing for morphing trunk pelvis into the leg pelvis
/// An affine transformation to deform trunk pelvis into the leg pelvis
/// It serves a purpose of being a pretransform for the RBF transformation.
AnyFunTransform3DLin2 IM_Trunk_To_Leg_Affine = {
Points0 = .points_RBF_TrunkPelvis_Unscaled;
Points1 = .points_RBF_LegPelvis_Unscaled;
Mode = VTK_LANDMARK_AFFINE ;
};
/// An non-linear RBF deformation transformation to deform trunk pelvis into the leg pelvis
/// This will result in the trunk geomtries in coordinate system of the leg pelvis.
AnyFunTransform3DRBF IM_Trunk_To_Leg_RBF = {
PreTransforms = {&.IM_Trunk_To_Leg_Affine};
Points0 = .points_RBF_TrunkPelvis_Unscaled;
Points1 = .points_RBF_LegPelvis_Unscaled;
RBFDef.Type = RBF_MultiQuadratic;
RBFDef.Param = 0.4;
BoundingBox.ScaleXYZ = 5*{1, 1, 1};
BoundingBox.DivisionFactorXYZ = 2*{1, 1, 1};
BoundingBoxOnOff = On;
BoundingBox.Type = BB_Cartesian ;
};
/// A rigid body registration transformation from the leg pelvis into the
/// trunk pelvis coordinate system done in a least square manner using landmarks.
AnyFunTransform3DLin2 IM_Leg_To_Trunk_RigidBody = {
Points0 = .points_RBF_LegPelvis_Unscaled;
Points1 = .points_RBF_TrunkPelvis_Unscaled;
Mode = VTK_LANDMARK_RIGIDBODY;
};
/// A rigid body registration transformation from the trunk pelvis into the
/// leg pelvis coordinate system done in a least square manner using landmarks.
AnyFunTransform3DLin2 IM_Trunk_To_Leg_RigidBody = {
Points0 = .points_RBF_TrunkPelvis_Unscaled;
Points1 = .points_RBF_LegPelvis_Unscaled;
Mode = VTK_LANDMARK_RIGIDBODY;
};
/// Interface morphing function that morphs trunk pelvis into the leg pelvis
/// and registers back into the trunk coordinate system.
AnyFunTransform3D IM_Trunk_To_Leg_Unscaled = {
PreTransforms = {&.IM_Trunk_To_Leg_RBF, &.IM_Leg_To_Trunk_RigidBody};
};
/// Interface morphing function that morphs leg pelvis into the trunk pelvis
AnyFunTransform3DLin2 IM_Leg_To_Trunk_Unscaled = {
Points0 = .points_RBF_LegPelvis_Unscaled;
Points1 = .IM_Trunk_To_Leg_Unscaled(.points_RBF_TrunkPelvis_Unscaled);
Mode = VTK_LANDMARK_RIGIDBODY;
};
#endif
#if BM_LEG_TRUNK_INTERFACE == _MORPH_LEG_TO_TRUNK_
///^ Interface morphing for morphing trunk pelvis into the leg pelvis
/// An affine transformation to deform leg pelvis into the trunk pelvis
/// It serves a purpose of being a pretransform for the RBF transformation.
AnyFunTransform3DLin2 IM_Leg_To_Trunk_Affine = {
Points0 = .points_RBF_LegPelvis_Unscaled;
Points1 = .points_RBF_TrunkPelvis_Unscaled;
Mode = VTK_LANDMARK_AFFINE ;
};
/// An non-linear RBF deformation transformation to deform leg pelvis into the trunk pelvis
/// This will result in the trunk geomtries in coordinate system of the trunk pelvis.
AnyFunTransform3DRBF IM_Leg_To_Trunk_RBF = {
PreTransforms = {&.IM_Leg_To_Trunk_Affine};
Points0 = .points_RBF_LegPelvis_Unscaled;
Points1 = .points_RBF_TrunkPelvis_Unscaled;
RBFDef.Type = RBF_MultiQuadratic;
RBFDef.Param = 0.4;
BoundingBox.ScaleXYZ = 5*{1, 1, 1};
BoundingBox.DivisionFactorXYZ = 2*{1, 1, 1};
BoundingBoxOnOff = On;
BoundingBox.Type = BB_Cartesian ;
};
/// Interface morphing function that morphs leg pelvis into the trunk pelvis
AnyFunTransform3D IM_Leg_To_Trunk_Unscaled = {
PreTransforms = {&.IM_Leg_To_Trunk_RBF};
};
/// An identity transformation that implies usage of the trunk pelvis
AnyFunTransform3DIdentity IM_Trunk_To_Leg_Unscaled = {};
#endif
#endif
/// A combined transformation that prepares trunk pelvis geometry
/// prior to applying geometric scaling
AnyFunTransform3DIdentity IM_Trunk_To_Leg = {
PreTransforms = {&.IM_Trunk_To_Leg_Unscaled, &..GeomScale};
};
/// A combined transformation that prepares leg pelvis geometry
/// prior to applying geometric scaling
AnyFunTransform3DIdentity IM_Leg_To_Trunk = {
PreTransforms = {&.IM_Leg_To_Trunk_Unscaled, &..GeomScale};
};
/// Function to correct segments above the pelvis
/// These segments have an offset after the pelvis interface morphing
/// Here we find that offset in order to subtract it
AnyFunTransform3DLin IM_Trunk_To_Leg_AboveSacrum = {
ScaleMat = eye(3,3);
/// We find the joint point where sacrum joins L5
AnyFloat sacrum_unscaled = ....ModelParameters.Sacrum.SacrumL5JntNode_pos;
AnyFloat sacrum_im = .IM_Trunk_To_Leg_Unscaled(sacrum_unscaled);
/// The offset is the difference from unscaled to IM scaled of the point
Offset = sacrum_im - sacrum_unscaled;
};
};