[770c98]: / Tools / AnyMocap / ScalingLengthMassFat_TrunkWidthScaling.any

Download this file

361 lines (293 with data), 16.7 kB

/* -------------------------------------------------------------------------------------------
This file implements a scaling law based on segment length and mass. The y (length) direction
of each segment is scaled according to Anthro joint center distances. The cross sectional
directions, x and z, are scaled according to the segment mass, and so is the strength.

John Rasmussen & Mark de Zee, 2004.11.23
------------------------------------------------------------------------------------------- */

AnyFolder Scaling = {
  
  #include "<ANYBODY_PATH_BODY>/BodyModels/GenericBodyModel/BodyModel.StandardParameters.any"
  
  AnyFolder MassScaling = {
    AnyFolder Pelvis = { AnyVar MassScale = ..AnthroData.pelvis / ..StandardParameters.Pelvis.Mass; };
    AnyFolder Head = { AnyVar MassScale = (..AnthroData.head) / (..StandardParameters.Head.Mass); };
    AnyFolder Cervical = { AnyVar MassScale = .Head.MassScale;};
    AnyFolder Trunk = { AnyVar MassScale = ( ..AnthroData.thorax) / (..StandardParameters.Trunk.Mass  ); }; //Ratio of mass of thorax plus lumbar mass
    AnyFolder Lumbar = { AnyVar MassScale = (..AnthroData.lumbar) / (..StandardParameters.Lumbar.Mass); };//Ratio of mass of lumbar mass
    AnyFolder Clavicula = { AnyVar MassScale = (..AnthroData.Shoulder_r ) / (..StandardParameters.Clavicula.Mass + ..StandardParameters.Scapula.Mass); };   
    AnyFolder Scapula = { AnyVar MassScale = (..AnthroData.Shoulder_r ) / (..StandardParameters.Clavicula.Mass + ..StandardParameters.Scapula.Mass); };       
    AnyFolder Humerus = { AnyVar MassScale = ..AnthroData.upper_arm_r / ..StandardParameters.Humerus.Mass; };
    AnyFolder Ulna = { AnyVar MassScale = ..AnthroData.lower_arm_r / (2*..StandardParameters.Ulna.Mass); };
    AnyFolder Radius = { AnyVar MassScale = ..AnthroData.lower_arm_r / (2*..StandardParameters.Ulna.Mass);  };
    AnyFolder Hand = { AnyVar MassScale = ..AnthroData.hand_r / ..StandardParameters.Hand.Mass; };
    
    AnyFolder Right = 
    {
      AnyFolder Foot = { AnyVar MassScale = (...AnthroData.Right.foot + ...AnthroData.Right.ball) / ...StandardParameters.Right.Foot.Mass; };
      AnyFolder Talus = { AnyVar MassScale = ...AnthroData.Right.talus / ...StandardParameters.Right.Talus.Mass; };  
      AnyFolder Shank = { AnyVar MassScale = ...AnthroData.Right.lower_leg / ...StandardParameters.Right.Shank.Mass; };
      AnyFolder Thigh = { AnyVar MassScale = ...AnthroData.Right.thigh / ...StandardParameters.Right.Thigh.Mass; };  
    };
    AnyFolder Left = 
    {
      AnyFolder Foot = { AnyVar MassScale = (...AnthroData.Left.foot+...AnthroData.Left.ball) / ...StandardParameters.Left.Foot.Mass; };
      AnyFolder Talus = { AnyVar MassScale = ...AnthroData.Left.talus / ...StandardParameters.Left.Talus.Mass; };  
      AnyFolder Shank = { AnyVar MassScale = ...AnthroData.Left.lower_leg / ...StandardParameters.Left.Shank.Mass; };
      AnyFolder Thigh = { AnyVar MassScale = ...AnthroData.Left.thigh / ...StandardParameters.Left.Thigh.Mass; };  
    };
  };
  
  AnyFolder StrengthScaling = {    
    AnyVar Rother = 0.5;          // Mass fraction in the body of organs, blood, skeleton, etc.
    AnyVar Rfat = .FatPercent/100; // Fat ration in the entire body
    AnyVar Rfat0 = .StandardParameters.BodyParameters.FatPercent/100;
    AnyFolder Pelvis = { AnyVar StrengthScale = (..MassScaling.Pelvis.MassScale / ..GeometricalScaling.Pelvis.LengthScale) * ((1-.Rother-.Rfat)/(1-.Rother-.Rfat0)); };
    AnyFolder Spine = { AnyVar StrengthScale = (..MassScaling.Trunk.MassScale / ..GeometricalScaling.Trunk.LengthScale ) * ((1-.Rother-.Rfat)/(1-.Rother-.Rfat0)); };
    AnyFolder Humerus = { AnyVar StrengthScale = (..MassScaling.Humerus.MassScale / ..GeometricalScaling.Humerus.LengthScale ) * ((1-.Rother-.Rfat)/(1-.Rother-.Rfat0)); };
    AnyFolder Ulna = { AnyVar StrengthScale = (..MassScaling.Ulna.MassScale / ..GeometricalScaling.Ulna.LengthScale ) * ((1-.Rother-.Rfat)/(1-.Rother-.Rfat0)); };
    AnyFolder Hand = { AnyVar StrengthScale = (..MassScaling.Hand.MassScale / ..GeometricalScaling.Hand.ScaleFunction.LengthScale ) * ((1-.Rother-.Rfat)/(1-.Rother-.Rfat0)); };
    
    AnyFolder Right =
    { 
      AnyFolder Foot = { AnyVar StrengthScale = (...MassScaling.Right.Foot.MassScale ) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0)); };
      AnyFolder Shank = { AnyVar StrengthScale = (...MassScaling.Right.Shank.MassScale ) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0));};
      AnyFolder Thigh = { AnyVar StrengthScale = (...MassScaling.Right.Thigh.MassScale ) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0)); };
    };
    AnyFolder Left =
    { 
      AnyFolder Foot = { AnyVar StrengthScale = (...MassScaling.Left.Foot.MassScale ) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0)); };
      AnyFolder Shank = { AnyVar StrengthScale = (...MassScaling.Left.Shank.MassScale) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0));};
      AnyFolder Thigh = { AnyVar StrengthScale = (...MassScaling.Left.Thigh.MassScale) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0)); };
    };
  };
  
  AnyFolder FiberLengthScaling = {    
    AnyFolder Pelvis = { AnyVar FiberLengthScale = ..AnthroSegmentLengths.PelvisWidth / ..StandardParameters.Pelvis.Width; };
    
    AnyFolder Right =
    {
      AnyFolder Foot = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Right.FootLength / ...StandardParameters.Right.Foot.Length; };
      AnyFolder Shank = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Right.ShankLength / ...StandardParameters.Right.Shank.Length; };
      AnyFolder Thigh = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Right.ThighLength / ...StandardParameters.Right.Thigh.Length; };
    };
    AnyFolder Left =
    {
      AnyFolder Foot = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Left.FootLength / ...StandardParameters.Left.Foot.Length; };         
      AnyFolder Shank = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Left.ShankLength / ...StandardParameters.Left.Shank.Length; };
      AnyFolder Thigh = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Left.ThighLength / ...StandardParameters.Left.Thigh.Length; };
    };
    
  };
  
  AnyFolder GeometricalScaling = {
    
    AnyFolder Right ={
      // Talus segment will use the GeometricalScalfing function of the Foot segment, not the following one.
      AnyFolder Talus  = {
        AnyVar LengthScale = ...AnthroSegmentLengths.Right.TalusLength / ...StandardParameters.Right.Talus.Length;    
        AnyVar ms = ...MassScaling.Right.Talus.MassScale;
        AnyVar ls = LengthScale;
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat = {{.ls, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, (.ms/.ls)^0.5}};
          Offset = {0, 0, 0};
        };
      };
      
      AnyFolder Foot  = {
        AnyVar LengthScale = ...AnthroSegmentLengths.Right.FootLength / ...StandardParameters.Right.Foot.Length;    
        AnyVar ms =  ...MassScaling.Right.Foot.MassScale;
        AnyVar ls = LengthScale;
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat = {{.ls, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, (.ms/.ls)^0.5}};
          Offset = {0, 0, 0};            
        };
      };
      
      AnyFolder Shank = {
        AnyVar LengthScale  =...AnthroSegmentLengths.Right.ShankLength / ...StandardParameters.Right.Shank.Length;
        AnyVar ms = ...MassScaling.Right.Shank.MassScale;
        AnyVar ls = LengthScale;
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}} ;
          Offset = {0, 0, 0};
        };
        
      };
      
      AnyFolder Thigh = {
        AnyVar LengthScale  = ...AnthroSegmentLengths.Right.ThighLength / ...StandardParameters.Right.Thigh.Length;
        AnyVar ms = ...MassScaling.Right.Thigh.MassScale;
        AnyVar ls = LengthScale;
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}} ;
          Offset = {0, 0, 0};
        };
        
      };
    }; // Right
    
    AnyFolder Left ={
      // Talus segment will use the GeometricalScalfing function of the Foot segment, not the following one.
      AnyFolder Talus  = {
        AnyVar LengthScale  = ...AnthroSegmentLengths.Left.TalusLength / ...StandardParameters.Left.Talus.Length;    
        AnyVar ms = ...MassScaling.Left.Talus.MassScale;
        AnyVar ls = LengthScale;
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat = {{.ls, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, (.ms/.ls)^0.5}} ;
          Offset = {0, 0, 0};
        };
      };
      
      AnyFolder Foot  = {
        AnyVar LengthScale  = ...AnthroSegmentLengths.Left.FootLength / ...StandardParameters.Left.Foot.Length;    
        AnyVar ms = ...MassScaling.Left.Foot.MassScale;
        AnyVar ls = LengthScale;
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat = {{.ls, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, (.ms/.ls)^0.5}};
          Offset = {0, 0, 0};
        };
      };
      
      AnyFolder Shank = {
        AnyVar LengthScale  = ...AnthroSegmentLengths.Left.ShankLength / ...StandardParameters.Left.Shank.Length;
        AnyVar ms = ...MassScaling.Left.Shank.MassScale;
        AnyVar ls = LengthScale;
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}}';
          Offset = {0, 0, 0};
        };
      };
      
      AnyFolder Thigh = {
        AnyVar LengthScale  = ...AnthroSegmentLengths.Left.ThighLength / ...StandardParameters.Left.Thigh.Length;
        AnyVar ms = ...MassScaling.Left.Thigh.MassScale;
        AnyVar ls = LengthScale;
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}};
          Offset = {0, 0, 0};
        };
        
        
      };
    }; // Left
    
    // Common law for the upper body
    // *****************************
    
    AnyFolder Pelvis = {
      AnyVar LengthScale =  ..AnthroSegmentLengths.PelvisWidth / ..StandardParameters.Pelvis.Width;
      //AnyVar DepthScale =  ..AnthroSegmentLengths.PelvisDepth / ..StandardParameters.Pelvis.Depth;
      AnyVar ms = ..MassScaling.Pelvis.MassScale;
      AnyVar ls = LengthScale;
      //AnyVar ds = DepthScale;
      //      AnyFunTransform3DLin ScaleFunction = {
      //        ScaleMat = {{.ds, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, .ls}};
      //        Offset = {0, 0, 0};
      //      };
      
      AnyFunTransform3DLin ScaleFunction = 
      {
        ScaleMat = {{ (.ms/.ls)^0.5, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, .ls}};
//        ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, .ls}};
        Offset = {0, 0, 0};
      };      
    };
    
    AnyFolder Trunk = {
      AnyVar LengthScale = (..AnthroSegmentLengths.TrunkHeight / ..StandardParameters.Trunk.Height);
      AnyVar WidthScale = (..AnthroSegmentLengths.TrunkWidth / ..StandardParameters.Trunk.Width );
      // HackWorkAround to add the width to the standard parameters
      AnyFolder &stdpar = ..StandardParameters.Trunk;
      stdpar = {
        AnyVar Width = 0.332; // Distance beween the acromium in neutral position. 
      };
      AnyVar ms = ..MassScaling.Trunk.MassScale;
      AnyVar ls = LengthScale;
      AnyVar ws = WidthScale;
      AnyFunTransform3DLin ScaleFunction = {
        // This breaks the default concept of LengthMassFat scaling.
        ScaleMat = {{ .ws , 0, 0},{0, .ls, 0},{0, 0, .ws}};
        Offset = {0,0,0};
      };
    };
    
    AnyFolder Head = {
      AnyVar LengthScale = (..AnthroSegmentLengths.HeadHeight / ..StandardParameters.Head.Height);
      AnyVar ms = ..MassScaling.Head.MassScale;
      AnyVar ls = LengthScale;
      AnyFunTransform3DLin ScaleFunction = {
        ScaleMat = {{.ls, 0, 0},{0, .ls, 0},{0, 0, .ls}};
        Offset = {0,0,0};
      };
    };
    
    
    AnyFolder Cervical = {
      AnyVar LengthScale = (..AnthroSegmentLengths.NeckLength / ..StandardParameters.Neck.Length);
      // HackWorkAround to add the width to the standard parameters
      AnyFolder &stdpar = ..StandardParameters;
      stdpar = {
        AnyFolder Neck = {
           AnyVar Length = 0.1357; // Distance beween the C7T1 joint to C1C0 joint. 
        };
      };
      AnyVar ms = ..MassScaling.Cervical.MassScale;
      AnyVar ls = LengthScale;
      AnyFunTransform3DLin ScaleFunction = {
        // This breaks the default concept of LengthMassFat scaling.
        ScaleMat = {{ (.ms/.ls)^0.5 , 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}};
        Offset = {0,0,0};
      };
    
    };
    
    AnyFolder &PelvisSeg = Pelvis;    
    AnyFolder &SkullSeg = Head;
    AnyFolder &ThoraxSeg = Trunk;
    
    AnyFolder &C1Seg = Cervical;
    AnyFolder &C2Seg = Cervical;
    AnyFolder &C3Seg = Cervical;
    AnyFolder &C4Seg = Cervical;
    AnyFolder &C5Seg = Cervical;
    AnyFolder &C6Seg = Cervical;
    AnyFolder &C7Seg = Cervical;
    
    AnyFolder &L1Seg = Lumbar;
    AnyFolder &L2Seg = Lumbar;
    AnyFolder &L3Seg = Lumbar;
    AnyFolder &L4Seg = Lumbar;
    AnyFolder &L5Seg = Lumbar;
    AnyFolder &SacrumSeg = PelvisSeg;
    
    AnyFolder Lumbar = {
      AnyVar LengthScale = (..AnthroSegmentLengths.TrunkHeight / ..StandardParameters.Trunk.Height);
      AnyVar ms = ..MassScaling.Lumbar.MassScale;
      AnyVar ls = LengthScale;
      AnyFunTransform3DLin ScaleFunction = {
        ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}};
        Offset = {0,0,0};
      };
    };
    
    AnyFolder Clavicula = {
      AnyFunTransform3DLin ScaleFunction = {
        //        AnyMat33 ARel={{-0.280836, -0.004752, 0.959744}, {0.188095, 0.980323, 0.059893}, {-0.941144, 0.197343, -0.274416}};
        
        AnyMat33 ARel= {      {-0.280836,  0.188095, -0.941144},      {-0.004752,  0.980323, 0.197343},       { 0.959744, 0.059893,  -0.274416}}';
        
        
        ScaleMat = ARel*..Trunk.ScaleFunction.ScaleMat*(ARel');
        Offset = {0,0,0}*ARel';
      };
      
    };
    
    
    
    AnyFolder Scapula = {
      AnyFunTransform3DLin ScaleFunction = {
        //AnyMat33 ARel ={{0.588988, 0.186879, 0.786238}, {-0.159489, 0.980641, -0.113609}, {-0.792248, -0.058482, 0.607391}};
        AnyMat33 ARel ={{0.561294, -0.097357, -0.821870},    {0.151325, 0.988389, -0.013736},    {0.813664, -0.116660, 0.569509}}';
        
        
        ScaleMat = ARel*..Trunk.ScaleFunction.ScaleMat*(ARel');
        Offset = {0,0,0}*ARel';
      };
    };
    
    AnyFolder Humerus = {
      AnyVar LengthScale = (..AnthroSegmentLengths.UpperArmLength / ..StandardParameters.Humerus.Length);
      AnyVar ms = ..MassScaling.Humerus.MassScale;
      AnyVar ls = LengthScale;      
      AnyFunTransform3DLin ScaleFunction = {
        ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}};
        Offset = {0,0,0};
      };
    };
    
    AnyFolder Ulna = {
      AnyVar LengthScale = (..AnthroSegmentLengths.LowerArmLength / ..StandardParameters.Ulna.Length);
      AnyVar ms = ..MassScaling.Ulna.MassScale;
      AnyVar ls = LengthScale;
      AnyFunTransform3DLin ScaleFunction = {
        ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}};
        Offset = {0,0,0};
      };
    };
    
    AnyFolder Radius = {
      AnyFunTransform3DLin ScaleFunction = {
        //This Arel is used for mapping the scaling of ulna into the radius coordinate system 
        //which is rotated, Arel has been found for a neutral position
        AnyMat33 ARel = {{-0.145873, -0.989303, -0.000001}, {0.989303, -0.145873, 0.000001}, {-0.000001, -0.000000, 1.000000}};
        AnyMat33 ScaleXYZ = ..Ulna.ScaleFunction.ScaleMat;
        ScaleMat = ARel'*ScaleXYZ*ARel;
        Offset = {0,0,0}*ARel;      };
    };
    
    AnyFolder Hand = {
      AnyVar HandLength =..AnthroSegmentLengths.HandLength;
      AnyVar HandBreadth = ..AnthroSegmentLengths.HandBreadth;
      AnyFunTransform3DLin ScaleFunction = {
        AnyVar BreadthScale = .HandBreadth/...StandardParameters.Hand.HandBreadth;
        AnyVar LengthScale =  .HandLength/...StandardParameters.Hand.HandLength;
        
        ScaleMat ={{LengthScale,0,0},{0,BreadthScale,0},{0,0,BreadthScale}};
        
        Offset = {0,0,0};
      };
    };
    
  };
};