568 lines (443 with data), 19.5 kB
AnyFolder Seg={
AnySeg DistalPhalanx={
Mass=..Mass4;
Jii={0,0,0};
r0= .ProximalPhalanx.IPFlexionExtensionAxis.sRel*.ProximalPhalanx.Axes0'+.ProximalPhalanx.r0-IPFlexionExtensionAxis.sRel*Axes0';
Axes0 =.ProximalPhalanx.Axes0*
IPFlexionExtensionAxis.ARel*
RotMat((pi/180)*..JntPos.DIPFlexion,z)*
IPFlexionExtensionAxis.ARel';
AnyRefNode EllipsoidNode={
AnySurfEllipsoid Ellipsoid={
AnyVar BoneLength= vnorm(..ProximalJointSurfaceNode.sRel-..DistalJointSurfaceNode.sRel,2);
Radius =..Scale*{0.005,0,0.005}+{0,a,0}; //the bonelength is already scaled..
//definition of focus points for the ellipsoid these are used for defining contact
AnyVar a =BoneLength/2;
AnyVar c = sqrt(Radius[1]^2-Radius[0]^2); //distance for center of ellipsoid to focus point
//AnyDrawParamSurf drw ={ RGB=...BoneSurf.RGB; Opacity = ........BonesOpacity.Hand;};
};
//definition of focus points
AnyRefNode F1 ={ sRel={0,.Ellipsoid.c,0}; };
AnyRefNode F2 ={ sRel={0,-.Ellipsoid.c,0}; };
};
AnyDrawSurf BoneSurf = {
RGB=Main.DrawSettings.Colors.Segments;
FileName = "DistalPhalanx1";
ScaleXYZ=.Scale*{1,1,......Sign*1};
Opacity = ......BonesOpacity.Hand;
};
AnyVar StdSegmentLength= 0.0308;// unscaled segment length
AnyVar Scale= ...SegmentLengthTable[0][3]/StdSegmentLength;
AnyRefNode ProximalJointNode={
sRel=.Scale*{0.0,0.012+0,......Sign*0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
AnyRefNode ProximalJointSurfaceNode={
sRel=.Scale*{0.0,0.008,......Sign*0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//Na
AnyRefNode DistalJointSurfaceNode={
sRel=.Scale*{0.0,-0.01,......Sign*0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//Flexion extension axis for Interphalangeal joint
AnyRefNode IPFlexionExtensionAxis={
sRel=.Scale*{0,0.0132,......Sign*0};
ARel=RotMat(......Sign*-(90-83)*pi/180,x);
// AnyDrawRefFrame drw={};
};
}; //DistalPhalanx3 Seg definition (Finger's tip)
AnySeg ProximalPhalanx={
Mass=..Mass2;
Jii={0,0,0};
// AnyDrawRefFrame drw={};
r0=.MCPJointSeg.r0+.MCPJointSeg.AbductionAdductionAxis.sRel*.MCPJointSeg.Axes0'-MCPAbductionAdductionAxis.sRel*Axes0';
Axes0=.MCPJointSeg.Axes0*.MCPJointSeg.AbductionAdductionAxis.ARel*
RotMat((.....Sign*pi/180)*..JntPos.MCPDeviation,x)*MCPAbductionAdductionAxis.ARel';
AnyRefNode EllipsoidNode={
AnySurfEllipsoid Ellipsoid={
AnyVar BoneLength= vnorm(..ProximalJointSurfaceNode.sRel-..DistalJointNode.sRel,2);
Radius =..Scale*{0.006,0,0.006}+{0,a,0}; //the bonelength is already scaled..
//definition of focus points for the ellipsoid these are used for defining contact
AnyVar a =BoneLength/2;
AnyVar c = sqrt(Radius[1]^2-Radius[0]^2); //distance for center of ellipsoid to focus point
//AnyDrawParamSurf drw ={ RGB=...BoneSurf.RGB; Opacity = ........BonesOpacity.Hand;};
};
//definition of focus points
AnyRefNode F1 ={ sRel={0,.Ellipsoid.c,0}; };
AnyRefNode F2 ={ sRel={0,-.Ellipsoid.c,0}; };
};
AnyVar StdSegmentLength= 0.0489;// unscaled segment length
AnyVar Scale= ...SegmentLengthTable[0][1]/ StdSegmentLength;
AnyDrawSurf BoneSurf = {
RGB=Main.DrawSettings.Colors.Segments;
FileName = "ProximalPhalanx1";
ScaleXYZ=.Scale*{1,1,......Sign*1};
Opacity = ......BonesOpacity.Hand;
};
//AnyVar Length=0.1;//.MiddlePhalanx.O2O3*1.608;
//O6
AnyRefNode ProximalJointNode={
sRel=.Scale*{0.0,0.019,......Sign*0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//O5
AnyRefNode ProximalJointSurfaceNode={
sRel=.Scale*{0.0,0.015,......Sign*0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//O4
AnyRefNode DistalJointNode={
sRel=.Scale*{0.00,-0.015,......Sign*0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
AnyRefNode DistalJointSurfaceNode={
sRel=.Scale*{0.00,-0.017,......Sign*0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//This is the Abduction adduction axis for the MCP joint
AnyRefNode MCPAbductionAdductionAxis={
sRel=.Scale*{0.00,0.02172,......Sign*0.000};
ARel=RotMat(-0.175,z)*RotMat(......Sign*-0.087,y); //these numbers are taken from measures...
//AnyDrawRefFrame drw={RGB={1,1,1};ScaleXYZ={0.13,0.131,0.13};};
};
//Bone lenght
AnyVar BL=ProximalJointSurfaceNode.sRel[1]-DistalJointSurfaceNode.sRel[1];
//Flexion extension axis for Interphalangeal joint
AnyRefNode IPFlexionExtensionAxis={
sRel=.ProximalJointSurfaceNode.sRel-{0,0.9*.BL,......Sign*0};
ARel=RotMat(......Sign*-(90-83)*pi/180,x);
// AnyDrawRefFrame drw={};
};
}; //ProximalPhalanx Seg definition (Thumb Middle part)
AnySeg Metacarpal={
Mass=..Mass1;
Jii={0,0,0};
// AnyDrawRefFrame drw={ScaleXYZ={1,1,1}*0.15;};
r0=.CMCJointSeg.r0 +.CMCJointSeg.AbductionAdductionJointNode.sRel*.CMCJointSeg.Axes0'+-CMCAbductionAdductionAxis.sRel*Axes0';
// Axes0=.CMCJointSeg.Axes0'*.CMCJointSeg.AbductionAdductionJointNode.ARel*
// RotMat((....Sign*pi/180)*..JntPos.CMCDeviation,x)*CMCAbductionAdductionAxis.ARel';
Axes0 = ...Carpals.Axes0*...Carpals.CMC1.ARel* RotMat((pi/180)*..JntPos.CMCFlexion,z)*RotMat((.....Sign*pi/180)*..JntPos.CMCDeviation,x);
AnyRefNode EllipsoidNode={
AnySurfEllipsoid Ellipsoid={
AnyVar BoneLength= vnorm(..ProximalJointNode.sRel-..DistalJointNode.sRel,2);
Radius =..Scale*{0.006,0,0.006}+{0,a,0}; //the bonelength is already scaled..
//definition of focus points for the ellipsoid these are used for defining contact
AnyVar a =BoneLength/2;
AnyVar c = sqrt(Radius[1]^2-Radius[0]^2); //distance for center of ellipsoid to focus point
//AnyDrawParamSurf drw ={ RGB=...BoneSurf.RGB; Opacity = ........BonesOpacity.Hand;};
};
//definition of focus points
AnyRefNode F1 ={ sRel={0,.Ellipsoid.c,0}; };
AnyRefNode F2 ={ sRel={0,-.Ellipsoid.c,0}; };
};
AnyVar StdSegmentLength= 0.023;// unscaled segment length
AnyVar Scale= ...SegmentLengthTable[0][0]/StdSegmentLength;
AnyDrawSurf BoneSurf = {
RGB=Main.DrawSettings.Colors.Segments;
FileName = "MetacarpalBase1";
ScaleXYZ=.Scale*{1,1,......Sign*1};
Opacity = ......BonesOpacity.Hand;
};
AnyRefNode ProximalJointNode={
sRel=.Scale*{0.00,0.023+0.005,......Sign*0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
AnyRefNode ProximalSurfaceNode={
sRel=.Scale*{-0.004,0.023,......Sign*0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//node on the ulna side of the bone used onluy for the location of the abduction/adduction axis
AnyRefNode ProximalSurfaceUlnaSide={
sRel=.Scale*{-0.00,0.02,......Sign*-0.006};
// AnyDrawRefFrame drw={ ScaleXYZ={0.015,0.015,0.015}; RGB={1,0,0}; };
};
//node on the ulna side of the bone used onluy for the location of the abduction/adduction axis
AnyRefNode ProximalSurfaceRadialSide={
sRel=.Scale*{-0.00,0.02,......Sign*0.006};
// AnyDrawRefFrame drw={ ScaleXYZ={0.015,0.015,0.015}; RGB={1,0,0}; };
};
//06
AnyRefNode DistalJointNode={
sRel=.Scale*{0.00,-0.021,......Sign*0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,1,0}; };
};
AnyRefNode DistalSurfaceNode={
sRel=.Scale*{0.00,-0.025,......Sign*0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.15,0.15,0.15}; RGB={1,1,0}; };
};
//BoneLength
AnyVar BL=vnorm((DistalSurfaceNode.sRel[1]-ProximalSurfaceNode.sRel[1]),2);
//BoneWidth
AnyVar T=vnorm((ProximalSurfaceRadialSide.sRel[2]-ProximalSurfaceUlnaSide.sRel[2]),2);
AnyRefNode CMCAbductionAdductionAxis={
sRel=.ProximalSurfaceNode.sRel-{0,0.12*.BL,......Sign*0.595*.T+.ProximalSurfaceUlnaSide.sRel[2]};//hollister1992 fig. 5
ARel=RotMat((-90+86)*pi/180,z)*RotMat(......Sign*(90-78.3)*pi/180,y); //Hollister1992 fig.5
// AnyDrawRefFrame drw={
// ScaleXYZ={0.15,0.15,0.15}; RGB={1,1,1};
// };
};
//Definition of MCP Flexion extension axis using Hollister1995 fig 2b
AnyRefNode DistalDorsalNode = {
sRel=.DistalSurfaceNode.sRel+.Scale*{-0.005,0,......Sign*0};
//AnyDrawRefFrame drw={};
};
AnyRefNode DistalVolarNode = {
sRel=.DistalSurfaceNode.sRel+.Scale*{0.006,0,......Sign*0};
//AnyDrawRefFrame drw={};
};
AnyVar TDistal=vnorm(DistalVolarNode.sRel-DistalDorsalNode.sRel,2);
AnyRefNode MCPFlexionExtensionAxis={
sRel={.DistalDorsalNode.sRel[0]+0.44*.TDistal,0.10*.BL+.DistalSurfaceNode.sRel[1],......Sign*0};//hollister1992 fig. 2b and table 1
ARel=RotMat(......Sign*(-90+101)*pi/180,x); //Hollister1995 fig.2b
//AnyDrawRefFrame drw={
// ScaleXYZ={0.05,0.05,0.05}; RGB={1,1,1};
// };
};
}; //Metacarpal seg definition (Thumb's base)
//this is segment connects the flexion and the abduction/adduction axis in the CMC joint.
AnySeg CMCJointSeg ={
//AnyDrawRefFrame drw={ScaleXYZ={0.19,0.19,0.19};RGB={1,0,0};};
// AnyDrawRefFrame drws = {RGB= {1,0,0};ScaleXYZ={1,1,1}*0.15;};
r0= ...Carpals.CMC1.sRel* ...Carpals.Axes0'+...Carpals.r0;
Axes0 = ...Carpals.Axes0*...Carpals.CMC1.ARel* RotMat((pi/180)*..JntPos.CMCFlexion,z);
// r0= .Metacarpal.r0- .Metacarpal.MCPFlexionExtensionAxis.sRel*.Metacarpal.Axes0';
// Axes0 =.Metacarpal.Axes0*.Metacarpal.MCPFlexionExtensionAxis.ARel;
//
Mass=1e-5;
Jii={0,0,0};
AnyRefNode FlexionExtensionJointNode={
};
AnyRefNode AbductionAdductionJointNode={
sRel=..Metacarpal.Scale*{-0.004000001, -0.01076, ......Sign*-0.00114};
ARel=RotMat(-0.06981316,z)*RotMat(......Sign*0.2042035,y);
// AnyDrawRefFrame drw={ScaleXYZ={0.1,0.1,0.1};};
};
};
// These two folling measured was used to obtain the position and orientation of the
// AbductionAdductionJointNode for a neutral position
// AnyKinLinear lin={
// Ref=0;
// AnyRefNode &ref1=.CMCJointSeg.FlexionExtensionJointNode;
//
// AnyRefNode &ref2=.Metacarpal.CMCAbductionAdductionAxis;
//
// };
// AnyKinRotational rot={
// Ref=0;
// AnyRefNode &ref1=.CMCJointSeg.FlexionExtensionJointNode;
//
// AnyRefNode &ref2=.Metacarpal.CMCAbductionAdductionAxis;
// Type=RotAxesAngles;
// };
//This is segment connects the flexion and the abduction/adduction axis in the CMC joint
//Definition of MCP abduction adduction axis using Hollister1995 fig 2c
//this axis is positioned wrt to metacarpal bone but moves with proximal phalanx
//the positioning is done with the MCP flexion extenion in neutral posiotion
AnySeg MCPJointSeg ={
r0= .Metacarpal.r0+.Metacarpal.MCPFlexionExtensionAxis.sRel*.Metacarpal.Axes0'-FlexionExtensionAxis.sRel;
Axes0 =.Metacarpal.Axes0*.Metacarpal.MCPFlexionExtensionAxis.ARel*
RotMat((pi/180)*..JntPos.MCPFlexion,z)*FlexionExtensionAxis.ARel';
Mass=1e-5;
Jii={0,0,0};
AnyRefNode FlexionExtensionAxis={
ARel=RotMat(......Sign*(-90+101)*pi/180,x); //Hollister1995 fig.2b Rotate back again so the finger remains straight
//this means that with flexion extension in neutral posiotion the coordinate system of this segment is
//allignet with metacarpal bone
};
AnyRefNode AbductionAdductionAxis={
//for the y position subtract the y position used by the flexion extension axis
sRel=..Metacarpal.Scale*{0,(0.87-0.83),0}*..Metacarpal.BL+{0,0,......Sign*0};//hollister1995 fig. 2a and 2b and table 1
ARel=RotMat(-(90-80)*pi/180,z)*RotMat(......Sign*-5*pi/180,y); //Hollister1995 fig.c
//AnyDrawRefFrame drw={
// ScaleXYZ={0.05,0.05,0.05}; RGB={0,0,0};
//};
};
};
// // These two folling measured was used to obtain the position and orientation of the
// // AbductionAdductionJointNode for a neutral position
// AnyKinLinear lin={
// Ref=0;
// AnyRefNode &ref2=.ProximalPhalanx;
//
// AnyRefNode &ref1=.MCPJointSeg.AbductionAdductionAxis;
//
// };
// AnyKinRotational rot={
// Ref=0;
// AnyRefNode &ref2=.ProximalPhalanx;
//
// AnyRefNode &ref1=.MCPJointSeg.AbductionAdductionAxis;
// Type=RotAxesAngles;
// };
// //
//
// These two folling measured was used to obtain the position and orientation of the
// AbductionAdductionJointNode for a neutral position
AnyKinLinear lin={
Ref=0;
AnySeg &ref2=.DistalPhalanx;
AnyRefNode &ref1=.ProximalPhalanx.IPFlexionExtensionAxis;
};
AnyKinRotational rot={
AnySeg &ref2=.ProximalPhalanx;
AnyRefNode &ref1=.ProximalPhalanx.IPFlexionExtensionAxis;
Type=RotAxesAngles;
};
}; //Segs
AnyFolder Jnt ={
// //Carpometacarpal Flexion joint
// AnyUniversalJoint CMC={
//
// AnyRefNode &ref1=...Carpals.CMC1;
// AnyRefNode &ref2=..Seg.Metacarpal.ProximalJointNode;
// Axis1=z;
// Axis2=x;
//
// };
// AnyKinEqSimpleDriver CMCdriver ={
// AnyRevoluteJoint &ref=.CMCFlexion;
// DriverPos={0};
// DriverVel={0};
//
//
// };
AnyRevoluteJoint CMCFlexion={
AnyRefNode &ref1=...Carpals.CMC1;
AnyRefNode &ref2=..Seg.CMCJointSeg.FlexionExtensionJointNode;
//
// ref1={AnyDrawRefFrame drw= {};};
// ref2={AnyDrawRefFrame drw= {};};
Axis=z;
#include "DrawJointAxisZ.any"
};
// Carpometacarpal abduction adduction joint
AnyRevoluteJoint CMCAbduction={
AnyRefNode &ref1=..Seg.CMCJointSeg.AbductionAdductionJointNode; //oMetacarpal.ProximalJointNode;
AnyRefNode &ref2=..Seg.Metacarpal.CMCAbductionAdductionAxis;
//ref1={AnyDrawRefFrame drw3={RGB={1,0,1};};};
//ref2={AnyDrawRefFrame drw= {};};
Axis=x;
#include "DrawJointAxisX.any"
};
// //Metacarpophalangeal joint
// AnyRevoluteJoint MCP={
// AnyRefNode &ref1=..Seg.Metacarpal.DistalJointNode;
// AnyRefNode &ref2=..Seg.ProximalPhalanx.ProximalJointNode;
// Axis=z;
// };
//
//Metacarpophalangeal joint flexion extension (along the blue axis)
AnyRevoluteJoint MCPFlexion={
AnyRefNode &ref1=..Seg.Metacarpal.MCPFlexionExtensionAxis;
AnyRefNode &ref2=..Seg.MCPJointSeg.FlexionExtensionAxis;
Axis=z;
#include "DrawJointAxisZ.any"
//ref1={AnyDrawRefFrame drw= {};};
// ref2={AnyDrawRefFrame drw= {};};
};
//Metacarpophalangeal joint abduction adduction (along the black axis)
//MCP joint is at the middle of thumb
AnyRevoluteJoint MCPAbduction={
AnyRefNode &ref1=..Seg.MCPJointSeg.AbductionAdductionAxis;
AnyRefNode &ref2=..Seg.ProximalPhalanx.MCPAbductionAdductionAxis;
Axis=x;
#include "DrawJointAxisX.any"
};
//Distalinterphalangeal joint
AnyRevoluteJoint DIP={
AnyRefNode &ref1=..Seg.ProximalPhalanx.IPFlexionExtensionAxis;
AnyRefNode &ref2=..Seg.DistalPhalanx.IPFlexionExtensionAxis;
Axis=z;
#include "DrawJointAxisZ.any"
};
}; //jnt
// Muscles Definition of the Thumb:
AnyFolder JntMus = {
//Two muscles for the CMC joint - Flexion/Extension motion (base of thumb):
AnyMuscleGeneric CMCflexion = {
AnyMuscleModel MusMdl = {
F0 = ...CMCMusForceFlex;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.CMCFlexion;
Type = NonNegative;
};
AnyMuscleGeneric CMCextension = {
AnyMuscleModel MusMdl = {
F0 = ...CMCMusForceExten;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.CMCFlexion;
Type = NonPositive;
};
//Two muscles for the CMC joint - Abduction/Adduction motion (base of thumb):
AnyMuscleGeneric CMCAdduction = {
AnyMuscleModel MusMdl = {
F0 = ...CMCMusForceAdduc;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.CMCAbduction;
Type = NonNegative;
};
AnyMuscleGeneric CMCAbduction = {
AnyMuscleModel MusMdl = {
F0 = ...CMCMusForceAbduc;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.CMCAbduction;
Type = NonPositive;
};
//Two muscles for the MCP joint - Flexion/Extension motion (base of thumb):
AnyMuscleGeneric MCPflexion = {
AnyMuscleModel MusMdl = {
F0 = ...MCPMusForceFlex;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.MCPFlexion;
Type = NonNegative;
};
AnyMuscleGeneric MCPextension = {
AnyMuscleModel MusMdl = {
F0 = ...MCPMusForceExten;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.MCPFlexion;
Type = NonPositive;
};
//Two muscles for the MCP joint - Abduction/Adduction motion (middle of thumb):
AnyMuscleGeneric MCPAdduction = {
AnyMuscleModel MusMdl = {
F0 = ...MCPMusForceAdduc;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.MCPAbduction;
Type = NonNegative;
};
AnyMuscleGeneric MCPAbduction = {
AnyMuscleModel MusMdl = {
F0 = ...MCPMusForceAbduc;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.MCPAbduction;
Type = NonPositive;
};
//Two muscles for the DIP joint - Flexion/Extension motion (base of thumb):
AnyMuscleGeneric DIPflexion = {
AnyMuscleModel MusMdl = {
F0 = ...DIPMusForceFlex;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.DIP;
Type = NonNegative;
};
AnyMuscleGeneric DIPextension = {
AnyMuscleModel MusMdl = {
F0 = ...DIPMusForceExten;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.DIP;
Type = NonPositive;
};
}; // End muscles definition