512 lines (355 with data), 15.5 kB
// This file contains segment inertia properties and geometry used for muscle wrapping.
// The file includes a number of segment files which contains muscles attachment points and
// bonylandmarks.
///Clavicula segment definition
AnySeg Clavicula ={
AnyFolder &Data = ..ModelParameters.Clavicula;
AnyMat33 Mirror={{1,0,0},{0,..Sign*1,0},{0,0,1}};
AnyFunTransform3D& Scale = ..Scaling.Clavicula.ScaleFunction;
AnyRefNode AnatomicalFrame = {};
AnyRefNode& MoCapMarkerFrameAMMR24 = AnatomicalFrame;///< For backwards Compatibility with AMMR 2.4 MoCap Marker protocols
AnyRefNode& ScalingNode = AnatomicalFrame;
AnyFunTransform3D& GeomScale = Scale;
AnyFolder NeutralPositionOnPelvis = {
AnyVec3 StandardsRel =.Data.NeutralPositionOnPelvis_pos;
//sRel=.Scale(StandardsRel*.Mirror);
AnyMat33 Clavicula_Axes = {
{.Data.Clavicula_Axes[0][0],...Sign*.Data.Clavicula_Axes[0][1],.Data.Clavicula_Axes[0][2]},
{.Data.Clavicula_Axes[1][0],...Sign*.Data.Clavicula_Axes[1][1],.Data.Clavicula_Axes[1][2]},
{...Sign*.Data.Clavicula_Axes[2][0],.Data.Clavicula_Axes[2][1],...Sign*.Data.Clavicula_Axes[2][2]}
};
AnyMat33 Pelvis_Axes = {{1.000000, 0.000000, 0.000000}, {0.000000, 1.000000, 0.000000}, {0.000000, 0.000000, 1.000000}};
AnyMat33 ARel=Clavicula_Axes'*Pelvis_Axes;
};
#if _LEFT_RIGHT_ == "RIGHT"
AnyFolder &TrunkIJRef = ....Trunk.SegmentsRibCage.SternumSeg.ij;
#else
AnyFolder &TrunkIJRef = ....Trunk.SegmentsRibCage.SternumSeg.iji;
#endif
r0 = ....Trunk.SegmentsRibCage.SternumSeg.r0
+ (TrunkIJRef.sRel + TrunkIJRef.scj.sRel * TrunkIJRef.ARel')*....Trunk.SegmentsRibCage.SternumSeg.Axes0'
- scj.sRel*Axes0';
Axes0= ....Trunk.SegmentsRibCage.SternumSeg.Axes0*NeutralPositionOnPelvis.ARel';
#include "../DrawSettings/Nodes.any"
AnyVar MassS = ..MassScaling.Clavicula.MassScale;
AnyVar MassStandard = ..StandardParameters.Clavicula.Mass;
Mass = MassS*MassStandard;
//AnyVar LengthStandard = 0.168874;
//Note stc issue for scaling
AnyVar Length = vnorm(ac.sRel-scj.sRel); // Find the length using bonylandmark x coordinates!
AnyVar Radius = (Mass/(pi*Length*..StandardParameters.Clavicula.Density))^0.5;
AnyVar Iyy = 0.25*Mass*Radius*Radius + 1/12*Mass*Length*Length;
AnyVar Ixx = 0.5*Mass*Radius*Radius;
AnyVar Izz = Iyy;
Jii = {Ixx,Iyy,Izz};
sCoM = Scale((Data.ac_pos+Data.scj_pos)/2*Mirror); // midpoint between acromioclavicular joint and scapuloclavicular
JaboutCoMOnOff = On;
AnyRefNode ac = {sRel = .Scale(.Data.ac_pos*.Mirror);};
AnyRefNode acj = {
sRel = .Scale(.Data.acj_pos*.Mirror);
#include "../DrawSettings/JointAxesDistal.any"
};
AnyRefNode scj = {
sRel = .Scale(.Data.scj_pos*.Mirror);
#include "../DrawSettings/JointAxesProximal.any"
};
AnyVec3 ConoidStd=Data.conoid_pos;
AnyRefNode conoid = {sRel = .Scale(.Data.conoid_pos*.Mirror);};
AnyRefNode trapezoid = {sRel = .Scale(.Data.trapezoid_pos*.Mirror);};
AnyDrawSurf DrwSurf = {
FileName = ...STL.FileNameClavicula;
RGB=...ColorRef.Segments;
ScaleXYZ={1,1,1}*.Mirror;
AnyFunTransform3D& Scale = .Scale;
Opacity = ...BonesOpacity.Clavicula;
};
};
///Scapula segment definition
AnySeg Scapula ={
AnyFolder &Data = ..ModelParameters.Scapula;
AnyMat33 Mirror={{1,0,0},{0,1*..Sign,0},{0,0,1}};
AnyFunTransform3D &Scale=..Scaling.Scapula.ScaleFunction;
AnyRefNode AnatomicalFrame = {};
AnyRefNode& MoCapMarkerFrameAMMR24 = AnatomicalFrame;///< For backwards Compatibility with AMMR 2.4 MoCap Marker protocols
AnyRefNode& ScalingNode = AnatomicalFrame;
AnyFunTransform3D& GeomScale = Scale;
AnyFolder NeutralPositionOnPelvis = {
AnyVec3 StandardsRel= .Data.NeutralPositionOnPelvis_pos;
//sRel = .Scale( StandardsRel*.Mirror);
AnyMat33 Scapula_Axes = {
{.Data.Scapula_Axes[0][0],...Sign*.Data.Scapula_Axes[0][1],.Data.Scapula_Axes[0][2]},
{.Data.Scapula_Axes[1][0],...Sign*.Data.Scapula_Axes[1][1],.Data.Scapula_Axes[1][2]},
{...Sign*.Data.Scapula_Axes[2][0],.Data.Scapula_Axes[2][1],...Sign*.Data.Scapula_Axes[2][2]}
};
AnyMat33 Pelvis_Axes = {
{1.000000, 0.000000, 0.000000},
{0.000000, 1.000000, 0.000000},
{0.000000, 0.000000, 1.000000}};
AnyMat33 ARel=Scapula_Axes'*Pelvis_Axes;
};
r0 = .Clavicula.acj.sRel*.Clavicula.Axes0'+.Clavicula.r0 - acj.sRel*Axes0';
Axes0= ....Trunk.SegmentsRibCage.SternumSeg.Axes0*NeutralPositionOnPelvis.ARel';
AnyMat33 As= ....Trunk.SegmentsThorax.T1Seg.Axes0*NeutralPositionOnPelvis.ARel';
AnyVec3 RThorax = ....Trunk.SegmentsThorax.T1Seg.r0;
#include "../DrawSettings/Nodes.any"
#include "../DrawSettings/SegmentAxes.any"
AnyVar MassS = ..MassScaling.Scapula.MassScale;
AnyVar MassStandard = ..StandardParameters.Scapula.Mass;
Mass = MassS*MassStandard;
AnyVar Length = 0.01; // Guesstimate the thickness.
//Note stc issue for scaling
AnyVar Radius = (Mass/(pi*Length*..StandardParameters.Scapula.Density))^0.5;
AnyVar Iyy = 0.25*Mass*Radius*Radius + 1/12*Mass*Length*Length;
AnyVar Izz = 0.5*Mass*Radius*Radius;
AnyVar Ixx = Iyy;
Jii = {Ixx,Iyy,Izz};
sCoM=Scale(Data.sCoM_pos*Mirror);
JaboutCoMOnOff = On;
AnyDrawSurf DrwSurf = {
FileName = ...STL.FileNameScapula;
RGB=...ColorRef.Segments;
ScaleXYZ={1,1,1}*.Mirror;
AnyFunTransform3D& Scale = .Scale;
Opacity = ...BonesOpacity.Scapula;
};
AnyRefNode MuscleConnectorPlaneNode ={ sRel= .Scale(.Data.MuscleConnectorPlaneNode_pos*.Mirror);};
AnyRefNode ac = {
sRel = .Scale(.Data.ac_pos*.Mirror);
#include "../DrawSettings/BML.any"
#include "../DrawSettings/JointAxesProximal.any"
};
AnyRefNode acj = {sRel = .Scale(.Data.acj_pos*.Mirror);};
/// Used for scapula sliding on the thorax
/// when BM_ARM_THORAX_SCAPULA_CONTACT == _ELLIPSOID_CONTACT_
AnyRefNode ScapulaSlidingTS = {
sRel = .Scale((.Data.ts_pos+ {0,0,-0.015})*.Mirror);
#include "../DrawSettings/BML.any"
};
AnyRefNode ScapulaSlidingAI = {
sRel = .Scale((.Data.ai_pos +{-0.00,0.000,-0.008})*.Mirror);
#include "../DrawSettings/BML.any"
};
AnyRefNode ts = {
sRel = .Scale(.Data.ts_pos*.Mirror);
#include "../DrawSettings/BML.any"
};
AnyRefNode ai= {
sRel = .Scale(.Data.ai_pos*.Mirror);
#include "../DrawSettings/BML.any"
};
AnyRefNode aa = {
sRel = .Scale(.Data.aa_pos*.Mirror);
#include "../DrawSettings/BML.any"
};
#if BM_ARM_DELTOID_WRAPPING
AnyRefNode coronoid= {
//^ Node used for the anterior deltoid wrapping surface scaling
sRel = .Scale(.Data.coronoid_pos*.Mirror);
#include "../DrawSettings/BML.any"
};
#endif
AnyRefNode gh = {
sRel = .Scale(.Data.gh_pos*.Mirror);
//AnyDrawRefFrame drw={};
#include "../DrawSettings/BML.any"
#include "../DrawSettings/JointAxesDistal.any"
};
AnyVec3 ConoidStd=Data.conoid_pos;
AnyRefNode conoid = {sRel = .Scale(.Data.conoid_pos*.Mirror);};
AnyRefNode trapezoid = {sRel = .Scale(.Data.trapezoid_pos*.Mirror);};
}; //Scapula
///Humerus segment definition
AnySeg Humerus ={
AnyFolder &Data = ..ModelParameters.Humerus;
AnyMat33 Mirror={{..Sign,0,0},{0,1,0},{0,0,1}};
r0=.Scapula.gh.sRel*.Scapula.Axes0'+.Scapula.r0;
AnyFunTransform3D &Scale=..Scaling.Humerus.ScaleFunction;
#include "../DrawSettings/Nodes.any"
AnyVar MassS = ..MassScaling.Humerus.MassScale;
AnyVar MassStandard = ..StandardParameters.Humerus.Mass;
Mass = MassS*MassStandard;
//Note stc issue for scaling
AnyVar Length = ((gh.sRel[1]-fe.sRel[1])^2)^0.5; // Find the length using bonylandmark x coordinates! !!! TODO: possibly needs a vnorm instead?!
AnyVar Radius = (Mass/(pi*Length*..StandardParameters.Humerus.Density))^0.5;
AnyVar Ixx = 0.25*Mass*Radius*Radius + 1/12*Mass*Length*Length;
AnyVar Iyy = 0.5*Mass*Radius*Radius;
AnyVar Izz = Ixx;
Jii = {Ixx,Iyy,Izz};
sCoM=Scale(Data.sCoM_pos*Mirror);
JaboutCoMOnOff = On;
AnyRefNode AnatomicalFrame = {};
AnyRefNode& MoCapMarkerFrameAMMR24 = AnatomicalFrame;///< For backwards Compatibility with AMMR 2.4 MoCap Marker protocols
AnyRefNode& ScalingNode = AnatomicalFrame;
AnyFunTransform3D& GeomScale = Scale;
AnyDrawSurf DrwSurf = {
FileName = ...STL.FileNameHumerus;
RGB =...ColorRef.Segments;
ScaleXYZ={1,1,1}*.Mirror;
AnyFunTransform3D& Scale = .Scale;
Opacity = ...BonesOpacity.Humerus;
};
#if BM_ARM_DELTOID_WRAPPING == _DELTOID_WRAPPING_RAKE_
AnyRefNode DeltoidConnectorCenter = {sRel=.art_tub_minus_tub_majus.sRel;};
#endif
AnyRefNode gh = {
sRel = .Scale(.Data.gh_pos*.Mirror);
#include "../DrawSettings/BML.any"
#include "../DrawSettings/JointAxesProximal.any"
};
AnyRefNode em = {sRel = .Scale(.Data.em_pos*.Mirror);
#include "../DrawSettings/BML.any"
};
AnyRefNode el = {sRel = .Scale(.Data.el_pos*.Mirror);
#include "../DrawSettings/BML.any"
};
//Axis for flexion extension joint data
AnyRefNode fe = {
sRel = .Scale(.Data.fe_pos*.Mirror);
ARel = {
{...Sign*-1,...Sign*-0,0.0},
{0,1,...Sign*0.0},
{-0.000000,0.0,...Sign*-1}};
#include "../DrawSettings/JointAxesDistal.any"
};
}; // Humerus
AnySeg Ulna ={
AnyFolder &Data = ..ModelParameters.Ulna;
AnyMat33 Mirror={{1,0,0},{0,..Sign,0},{0,0,1}};
AnyFunTransform3D &Scale=..Scaling.Ulna.ScaleFunction;
r0=.Humerus.fe.sRel*.Humerus.Axes0'+.Humerus.r0;
#include "../DrawSettings/Nodes.any"
AnyVar MassS = ..MassScaling.Ulna.MassScale;
AnyVar MassStandard =..StandardParameters.Ulna.Mass; // Veeger1997 subject no.4.
Mass = MassS*MassStandard;
//Note stc issue for scaling
AnyVar Length = ((us.sRel[1]-ol.sRel[1])^2)^0.5; // Find the length using bonylandmark x coordinates!
AnyVar Radius = (Mass/(pi*Length*..StandardParameters.Ulna.Density))^0.5;
AnyVar Ixx = 0.25*Mass*Radius*Radius + 1/12*Mass*Length*Length;
AnyVar Iyy = 0.5*Mass*Radius*Radius;
AnyVar Izz = Ixx;
Jii = {Ixx,Iyy,Izz};
sCoM=Scale(Data.sCoM_pos*Mirror);
JaboutCoMOnOff = On;
AnyRefNode AnatomicalFrame = {};
AnyRefNode& MoCapMarkerFrameAMMR24 = AnatomicalFrame; ///< For backwards Compatibility with AMMR 2.4 MoCap Marker protocols
AnyRefNode& ScalingNode = AnatomicalFrame;
AnyFunTransform3D& GeomScale = Scale;
AnyRefNode fe = { sRel=.Scale(.Data.fe_pos*.Mirror);
#include "../DrawSettings/JointAxesProximal.any"
};
//Node used for defining proximal ps joint
AnyRefNode ps2 = {
sRel=.Scale(.Data.ps2_pos*.Mirror);
ARel=RotMat(sRel,.us.sRel,.ol.sRel)*RotMat(pi,y)*RotMat(pi/2,z);
};
AnyRefNode ps2_usRot = {
sRel = .Scale(.Data.ps2_usRot_pos*.Mirror);
ARel = .ps2.ARel;
};
AnyRefNode ps2Reac = {
sRel = .Scale(.Data.ps2Reac_pos*.Mirror);
ARel = .ps2.ARel;
};
AnyDrawSurf DrwSurf = {
FileName = ...STL.FileNameUlna;
RGB =...ColorRef.Segments;
ScaleXYZ={1,1,1}*.Mirror;
AnyFunTransform3D& Scale = .Scale;
Opacity = ...BonesOpacity.Ulna;
};
AnyRefNode us = {
sRel = .Scale(.Data.us_pos*.Mirror);
#include "../DrawSettings/BML.any"
};
AnyRefNode ol = {
sRel = .Scale(.Data.ol_pos*.Mirror);
#include "../DrawSettings/BML.any"
};
//This is the nodes which are used for the definiton of the pronation supination axis.
AnyRefNode ps = {
sRel = .Scale(.Data.ps_pos*.Mirror);
};
}; // Ulna
AnySeg Radius ={
AnyFolder &Data = ..ModelParameters.Radius;
AnyMat33 Mirror={{1,0,0},{0,..Sign,0},{0,0,1}};
AnyFunTransform3D &Scale=..Scaling.Radius.ScaleFunction;
r0=.Ulna.ps.sRel*.Ulna.Axes0'+.Ulna.r0;
//This node is used for scaling of radius together with ulna
//using the scaling matrix of ulna
//For a neutral position this node will be located in the origo of
//Ulna
//Arel is used to map the scaling of ulna into the rotated coordinate system
//of radius
AnyRefNode NeutralPositionOnUlna = {
sRel = .Scale(.Data.NeutralPositionOnUlna_pos*.Mirror);
ARel = .Data.NeutralPositionOnUlna_rot;
};
#include "../DrawSettings/Nodes.any"
AnyVar MassS = ..MassScaling.Radius.MassScale;
AnyVar MassStandard =..StandardParameters.Radius.Mass; // Veeger1997 subject no.4.
Mass = MassS*MassStandard;
//AnyVar LengthStandard = 0.275575;
//NOte stc issue for scaling
AnyVar Length = .Ulna.Length;
AnyVar Radius = (Mass/(pi*Length*..StandardParameters.Radius.Density))^0.5;
AnyVar Iyy = 0.25*Mass*Radius*Radius + 1/12*Mass*Length*Length;
AnyVar Ixx = 0.5*Mass*Radius*Radius;
AnyVar Izz = Iyy;
Jii = {Ixx,Iyy,Izz};
sCoM=Scale(Data.sCoM_pos*Mirror);
JaboutCoMOnOff = On;
AnyRefNode AnatomicalFrame = {};
AnyRefNode& MoCapMarkerFrameAMMR24 = AnatomicalFrame; ///< For backwards Compatibility with AMMR 2.4 MoCap Marker protocols
AnyRefNode& ScalingNode = AnatomicalFrame;
AnyFunTransform3D& GeomScale = Scale;
AnyRefNode PointPS2 = {
#include "../DrawSettings/JointAxesProximal.any"
sRel = .Scale(.Data.PointPS2_pos*.Mirror);
};
AnyRefNode PointHumeralRadialJoint = {
#include "../DrawSettings/JointAxesProximal.any"
sRel = .Scale(.Data.PointHumeroRadialJoint_pos*.Mirror);
ARel = .PS2Reac.ARel;
};
AnyRefNode PS2Reac = {
sRel = .Scale(.Data.PS2Reac_pos*.Mirror);
ARel = RotMat(.PointPS2.sRel, .PS.sRel, .rs.sRel);
};
AnyDrawSurf DrwSurf = {
FileName = ...STL.FileNameRadius;
RGB = ...ColorRef.Segments;
ScaleXYZ={1,1,1}*.Mirror;
AnyFunTransform3D& Scale = .Scale;
Opacity = ...BonesOpacity.Radius;
};
// Radius stylno bml
//Not used!
AnyRefNode rs = {
sRel = .Scale(.Data.rs_pos*.Mirror);
#include "../DrawSettings/BML.any"
};
AnyRefNode wj = {
ARel=RotMat(...Sign*.Data.wj_rot,z);
sRel = .Scale(.Data.wj_pos*.Mirror);
#include "../DrawSettings/BML.any"
};
// This is the RefNode which is used for the pronation supination axis
AnyRefNode PS = {
#include "../DrawSettings/JointAxesProximal.any"
sRel = .Scale(.Data.PS_pos*.Mirror);
#include "../DrawSettings/BML.any"
};
}; // Radius
//this seg is introduced because the flexion extension axis in the wrist is not coincident with the radial ulnar deviation axis
AnySeg WristJointSeg ={
Mass=1e-5;
Jii={0,0,0};
r0=.Radius.wj.sRel*.Radius.Axes0'+.Radius.r0;
// Axes0={
// {.Hand.Axes0[0][0],.Hand.Axes0[0][1],.Hand.Axes0[0][2]},
// {.Hand.Axes0[1][0],.Hand.Axes0[1][1],.Hand.Axes0[1][2]},
// {.Hand.Axes0[2][0],.Hand.Axes0[2][1],.Hand.Axes0[2][2]}}*RotMat(0.5*(1-..Sign)*pi,x);
AnyRefNode FlexionExtensionAxis={sRel={0.00,0,0};};
AnyRefNode RadialUlnarDeviation={sRel={-0.005,0,0};};
};