[bfdf16]: / Body / AAUHuman / Scaling / ScalingUniform.any

Download this file

320 lines (257 with data), 16.8 kB


// Scaling law.
// Main.HumanModel.Scaling

  AnyFolder MassScaling = {
    AnyFolder Pelvis = { AnyVar MassScale = ...Anthropometrics.SegmentMasses.Pelvis / ..StandardParameters.Pelvis.Mass; };
    AnyFolder Head = { AnyVar MassScale = (...Anthropometrics.SegmentMasses.Head) / (..StandardParameters.Head.Mass); };
    AnyFolder Cervical = { AnyVar MassScale = .Head.MassScale;};
    AnyFolder Thorax = { AnyVar MassScale = ( ...Anthropometrics.SegmentMasses.Thorax) / (..StandardParameters.Trunk.Mass  ); }; //Ratio of mass of thorax plus lumbar mass
    AnyFolder Lumbar = { AnyVar MassScale = (...Anthropometrics.SegmentMasses.Lumbar) / (..StandardParameters.Lumbar.Mass); };//Ratio of mass of lumbar mass
    AnyFolder Right = 
    {
      AnyFolder Clavicula = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Right.Shoulder / (...StandardParameters.Clavicula.Mass + ...StandardParameters.Scapula.Mass); };   
      AnyFolder Scapula   = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Right.Shoulder / (...StandardParameters.Clavicula.Mass + ...StandardParameters.Scapula.Mass); };       
      AnyFolder Humerus   = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Right.UpperArm / ...StandardParameters.Humerus.Mass; };
      AnyFolder Ulna      = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Right.LowerArm / (...StandardParameters.Ulna.Mass+ ...StandardParameters.Radius.Mass); };
      AnyFolder Radius    = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Right.LowerArm / (...StandardParameters.Ulna.Mass+ ...StandardParameters.Radius.Mass);  };
      AnyFolder Hand      = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Right.Hand / ...StandardParameters.Hand.Mass; };    
      AnyFolder Foot      = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Right.Foot  / ...StandardParameters.Right.Foot.Mass; };
      AnyFolder Talus     = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Right.Talus / ...StandardParameters.Right.Talus.Mass; };  
      AnyFolder Shank     = { AnyVar MassScale = (....Anthropometrics.SegmentMasses.Right.Shank) / (...StandardParameters.Right.Shank.Mass+...StandardParameters.Right.Patella.Mass); };
      AnyFolder Thigh     = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Right.Thigh / ...StandardParameters.Right.Thigh.Mass; };  
    };
    AnyFolder Left = 
    {
      AnyFolder Clavicula = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Left.Shoulder / (...StandardParameters.Clavicula.Mass + ...StandardParameters.Scapula.Mass); };   
      AnyFolder Scapula   = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Left.Shoulder / (...StandardParameters.Clavicula.Mass + ...StandardParameters.Scapula.Mass); };       
      AnyFolder Humerus   = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Left.UpperArm / ...StandardParameters.Humerus.Mass; };
      AnyFolder Ulna      = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Left.LowerArm / (...StandardParameters.Ulna.Mass+ ...StandardParameters.Radius.Mass); };
      AnyFolder Radius    = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Left.LowerArm / (...StandardParameters.Ulna.Mass+ ...StandardParameters.Radius.Mass);  };
      AnyFolder Hand      = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Left.Hand / ...StandardParameters.Hand.Mass; };    
      AnyFolder Foot      = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Left.Foot  / ...StandardParameters.Left.Foot.Mass; };
      AnyFolder Talus     = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Left.Talus / ...StandardParameters.Left.Talus.Mass; };  
      AnyFolder Shank     = { AnyVar MassScale = (....Anthropometrics.SegmentMasses.Left.Shank) / (...StandardParameters.Right.Shank.Mass+...StandardParameters.Left.Patella.Mass); };
      AnyFolder Thigh     = { AnyVar MassScale = ....Anthropometrics.SegmentMasses.Left.Thigh / ...StandardParameters.Left.Thigh.Mass; };  
    };
  };
  
  AnyFolder StrengthScaling = {
    AnyVar p = (2/3); //Power
    AnyFolder Pelvis = { AnyVar StrengthScale = (...Anthropometrics.SegmentMasses.Pelvis/ ..StandardParameters.Pelvis.Mass)^.p; };   
    AnyFolder Spine = { AnyVar StrengthScale = ((...Anthropometrics.SegmentMasses.Thorax + ...Anthropometrics.SegmentMasses.Lumbar) / (..StandardParameters.Trunk.Mass + ..StandardParameters.Lumbar.Mass))^.p; };   
    
    AnyFolder Right =
    {
      AnyFolder Humerus = { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Right.UpperArm /    ...StandardParameters.Humerus.Mass)^..p; };
      AnyFolder Ulna    = { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Right.LowerArm / (2*...StandardParameters.Ulna.Mass) )^..p; };
      AnyFolder Hand    = { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Right.Hand      /    ...StandardParameters.Hand.Mass)^..p; };
      AnyFolder Shank = { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Right.Shank / ...StandardParameters.Right.Shank.Mass)^..p; };
      AnyFolder Thigh = { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Right.Thigh / ...StandardParameters.Right.Thigh.Mass)^..p; };
      AnyFolder Foot =  { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Right.Foot / ...StandardParameters.Right.Foot.Mass)^..p; };
    };
    AnyFolder Left =
    {
      AnyFolder Humerus = { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Left.UpperArm /    ...StandardParameters.Humerus.Mass)^..p; };
      AnyFolder Ulna    = { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Left.LowerArm / (2*...StandardParameters.Ulna.Mass) )^..p; };
      AnyFolder Hand    = { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Left.Hand      /    ...StandardParameters.Hand.Mass)^..p; };
      AnyFolder Shank = { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Left.Shank / ...StandardParameters.Left.Shank.Mass)^..p; };
      AnyFolder Thigh = { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Left.Thigh / ...StandardParameters.Left.Thigh.Mass)^..p; };
      AnyFolder Foot =  { AnyVar StrengthScale = (....Anthropometrics.SegmentMasses.Left.Foot / ...StandardParameters.Left.Foot.Mass)^..p; };
    };
  };
  
  AnyFolder FiberLengthScaling = {    
    AnyFolder Pelvis = { AnyVar FiberLengthScale = ...Anthropometrics.SegmentDimensions.PelvisWidth / ..StandardParameters.Pelvis.Width; };
    AnyFolder Right =
    {
      AnyFolder Shank = { AnyVar FiberLengthScale  = ....Anthropometrics.SegmentDimensions.Right.ShankLength / ...StandardParameters.Right.Shank.Length; };
      AnyFolder Thigh = { AnyVar FiberLengthScale  = ....Anthropometrics.SegmentDimensions.Right.ThighLength / ...StandardParameters.Right.Thigh.Length; };
      AnyFolder Foot = { AnyVar FiberLengthScale  = ....Anthropometrics.SegmentDimensions.Right.FootLength / ...StandardParameters.Right.Foot.Length; };
    };
    AnyFolder Left =
    {
      AnyFolder Shank = { AnyVar FiberLengthScale  = ....Anthropometrics.SegmentDimensions.Left.ShankLength / ...StandardParameters.Left.Shank.Length; };
      AnyFolder Thigh = { AnyVar FiberLengthScale  = ....Anthropometrics.SegmentDimensions.Left.ThighLength / ...StandardParameters.Left.Thigh.Length; };
      AnyFolder Foot = { AnyVar FiberLengthScale  = ....Anthropometrics.SegmentDimensions.Left.FootLength / ...StandardParameters.Left.Foot.Length; };         
    };
  };
  
  AnyFolder GeometricalScaling = {
    
    AnyFolder Right ={
      
      AnyFolder Clavicula = {
        AnyFunTransform3DLin ScaleFunction = {
          AnyMat33 ARel= {      {-0.280836,  0.188095, -0.941144},      {-0.004752,  0.980323, 0.197343},       { 0.959744, 0.059893,  -0.274416}}';
          ScaleMat = ARel*...Thorax.ScaleFunction.ScaleMat*(ARel');
          Offset = {0,0,0}*ARel';
        };
      };
      
      AnyFolder Scapula = {
        AnyFunTransform3DLin ScaleFunction = {
          AnyMat33 ARel ={{0.561294, -0.097357, -0.821870},    {0.151325, 0.988389, -0.013736},    {0.813664, -0.116660, 0.569509}}';
          ScaleMat = ARel*...Thorax.ScaleFunction.ScaleMat*(ARel');
          Offset = {0,0,0}*ARel';
        };
      };
      
      AnyFolder Humerus = {
        AnyVar GeomScale = (....Anthropometrics.SegmentDimensions.Right.UpperArmLength / ...StandardParameters.Humerus.Length);
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat ={{.GeomScale,0,0},{0,.GeomScale,0},{0,0,.GeomScale}};
          Offset = {0,0,0};
        };
      };
      
      AnyFolder Ulna = {
        AnyVar GeomScale = (....Anthropometrics.SegmentDimensions.Right.LowerArmLength / ...StandardParameters.Ulna.Length);
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat ={{.GeomScale,0,0},{0,.GeomScale,0},{0,0,.GeomScale}};
          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 = ....Anthropometrics.SegmentDimensions.Right.HandLength;
        AnyVar HandBreadth = ....Anthropometrics.SegmentDimensions.Right.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};
        };
      };
      
      AnyFolder Foot  = {
        AnyVar GeomScale = (....Anthropometrics.SegmentDimensions.Right.FootLength / ...StandardParameters.Right.Foot.Length);
        AnyFunTransform3DLin ScaleFunction = {
          
          ScaleMat ={{.GeomScale,0,0},{0,.GeomScale,0},{0,0,.GeomScale}};
          Offset = {0,0,0};
        };
      };
      
      AnyFolder Shank = {
        AnyVar GeomScale = (....Anthropometrics.SegmentDimensions.Right.ShankLength / ...StandardParameters.Right.Shank.Length);
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat ={{.GeomScale,0,0},{0,.GeomScale,0},{0,0,.GeomScale}};
          Offset = {0,0,0};
        };
      };
      
      AnyFolder Thigh = {
        AnyVar GeomScale = (....Anthropometrics.SegmentDimensions.Right.ThighLength / ...StandardParameters.Right.Thigh.Length);
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat ={{.GeomScale,0,0},{0,.GeomScale,0},{0,0,.GeomScale}};
          Offset = {0,0,0};
        };
      };
      
      // Talus uses the scaling function of the Foot segment
      AnyFolder &Talus = Foot;

      // Patella uses the scaling function of the Thigh segment.
      AnyFolder &Patella = Thigh;
      
    };//Right
    AnyFolder Left ={
        
      AnyFolder Clavicula = {
        AnyFunTransform3DLin ScaleFunction = {
          AnyMat33 ARel= {      {-0.280836,  -0.188095, -0.941144},      {0.004752,  0.980323, -0.197343},       { 0.959744, -0.059893,  -0.274416}}';
          ScaleMat = ARel*...Thorax.ScaleFunction.ScaleMat*(ARel');
          Offset = {0,0,0}*ARel';
        };
      };
      
      AnyFolder Scapula = {
        AnyFunTransform3DLin ScaleFunction = {
          AnyMat33 ARel ={{0.561294, 0.097357, -0.821870},    {-0.151325, 0.988389, 0.013736},    {0.813664, 0.116660, 0.569509}}';
          ScaleMat = ARel*...Thorax.ScaleFunction.ScaleMat*(ARel');
          Offset = {0,0,0}*ARel';
        };
      };
      
      AnyFolder Humerus = {
        AnyVar GeomScale = (....Anthropometrics.SegmentDimensions.Left.UpperArmLength / ...StandardParameters.Humerus.Length);
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat ={{.GeomScale,0,0},{0,.GeomScale,0},{0,0,.GeomScale}};
          Offset = {0,0,0};
        };
      };
      
      AnyFolder Ulna = {
        AnyVar GeomScale = (....Anthropometrics.SegmentDimensions.Left.LowerArmLength / ...StandardParameters.Ulna.Length);
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat ={{.GeomScale,0,0},{0,.GeomScale,0},{0,0,.GeomScale}};
          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 = ....Anthropometrics.SegmentDimensions.Left.HandLength;
        AnyVar HandBreadth = ....Anthropometrics.SegmentDimensions.Left.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};
        };
      };
        
      
      AnyFolder Foot  = {
        AnyVar    GeomScale = (....Anthropometrics.SegmentDimensions.Left.FootLength / ...StandardParameters.Left.Foot.Length);
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat ={{.GeomScale,0,0},{0,.GeomScale,0},{0,0,.GeomScale}};
          Offset = {0,0,0};
        };
      };
      
      AnyFolder Shank = {
        AnyVar GeomScale = (....Anthropometrics.SegmentDimensions.Left.ShankLength / ...StandardParameters.Left.Shank.Length);
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat ={{.GeomScale,0,0},{0,.GeomScale,0},{0,0,.GeomScale}};
          Offset = {0,0,0};
        };
      };
      
      AnyFolder Thigh = {
        AnyVar GeomScale = (....Anthropometrics.SegmentDimensions.Left.ThighLength / ...StandardParameters.Left.Thigh.Length);
        AnyFunTransform3DLin ScaleFunction = {
          ScaleMat ={{.GeomScale,0,0},{0,.GeomScale,0},{0,0,.GeomScale}};
          Offset = {0,0,0};
        };
      };
      
      // Talus uses the scaling function of the Foot segment
      AnyFolder &Talus = Foot;

      // Patella uses the scaling function of the Thigh segment.
      AnyFolder &Patella = Thigh;
      
    };//Left
    
    // Common law for the upper body
    // *****************************
    
    AnyFolder Pelvis = {
      AnyVar GeomScale = (...Anthropometrics.SegmentDimensions.PelvisWidth / ..StandardParameters.Pelvis.Width);
      AnyFunTransform3DLin ScaleFunction = {
        ScaleMat = diag({.GeomScale, .GeomScale, .GeomScale});
        AnyMatrix ScaleMatInverse = diag({1/.GeomScale, 1/.GeomScale, 1/.GeomScale});
        Offset = {0,0,0};
      };
    };
    AnyFolder Thorax = {
      AnyVar GeomScale = (...Anthropometrics.SegmentDimensions.TrunkHeight / ..StandardParameters.Trunk.Height);

      AnyFloat OriginUnscaled ??= warn(
        0, "To ensure continuity in the scaling law the thorax origin must be specified"
      );

      AnyFunTransform3DLin ScaleFunction = {
        ScaleMat = diag({.GeomScale, .GeomScale, .GeomScale});
        AnyMatrix ScaleMatInverse = diag({1/.GeomScale, 1/.GeomScale, 1/.GeomScale});
        Offset = (
          ..Pelvis.ScaleFunction(.OriginUnscaled) - (.OriginUnscaled * ScaleMat')
        ) * ScaleMatInverse;
      };
    };
    
    AnyFolder Head = {
      AnyVar GeomScale = (...Anthropometrics.SegmentDimensions.HeadHeight / ..StandardParameters.Head.Height);

      AnyFunTransform3DLin ScaleFunction = {
        ScaleMat = diag({.GeomScale, .GeomScale, .GeomScale});
        AnyMatrix ScaleMatInverse = diag({1/.GeomScale, 1/.GeomScale, 1/.GeomScale});
        Offset = {0,0,0};
      };
    };
    
    
    // uniform scaling is the same for cervical, thoracic and lumbar regions
    AnyFolder &Cervical = Thorax;    
    AnyFolder &Lumbar = Thorax;  

  };