--- a +++ b/Tools/AnyMocap/ScalingLengthMassFat_TrunkWidthScaling.any @@ -0,0 +1,360 @@ +/* ------------------------------------------------------------------------------------------- +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}; + }; + }; + + }; +}; + + + + + + + + + + + + + + +