[38ba34]: / Body / AAUHuman / Arm / Seg.any

Download this file

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