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};
};
};
};
};