463 lines (372 with data), 14.8 kB
//prepared for using different filenames for each bone...
AnyStringVar answer2 = iffun(eqfun(FingerNR,2),"2","");
AnyStringVar answer3 = iffun(eqfun(FingerNR,3),"3","");
AnyStringVar answer4 = iffun(eqfun(FingerNR,4),"4","");
AnyStringVar answer5 = iffun(eqfun(FingerNR,5),"5","");
AnyString MetacarpalString="MetacarpalBase"+answer2+answer3+answer4+answer5;
AnyString ProximalPhalanxString="ProximalPhalanxBase";//+answer2+answer3+answer4+answer5;
AnyString MiddlePhalanxString="MiddlePhalanxBase";//+answer2+answer3+answer4+answer5;
AnyString DistalPhalanxString="DistalPhalanxBase";//+answer2+answer3+answer4+answer5;
AnyFolder Seg={
AnySeg DistalPhalanx={
Mass=..Mass4;
Jii={0,0,0};
// r0= .ProximalPhalanx.DistalJointNode.sRel*.ProximalPhalanx.Axes0'+.ProximalPhalanx.r0-ProximalJointNode.sRel*Axes0';
// Axes0 =.ProximalPhalanx.Axes0*
// ProximalJointNode.ARel*
// RotMat((pi/180)*..JntPos.PIPFlexion,z)*
// ProximalJointNode.ARel';
r0= .MiddlePhalanx.DistalJointNode.sRel*.MiddlePhalanx.Axes0'+.MiddlePhalanx.r0-ProximalJointNode.sRel*Axes0';
Axes0 =.MiddlePhalanx.Axes0*
ProximalJointNode.ARel*
RotMat((pi/180)*..JntPos.DIPFlexion,z)*
ProximalJointNode.ARel';
AnyDrawSurf BoneSurf = {
RGB=Main.DrawSettings.Colors.Segments;
FileName = ...DistalPhalanxString;
ScaleXYZ=.Scale*{1,1,......Sign*1};
Opacity = ......BonesOpacity.Hand;
};
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}; };
};
AnyVar StdSegmentLength= 0.022;// unscaled segment length
AnyVar Scale= ..Lengths[3]/StdSegmentLength;
//O2
AnyRefNode ProximalJointNode={
sRel=.Scale*{0.0,0.012+0,0};
//AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//O1
AnyRefNode ProximalJointSurfaceNode={
sRel=.Scale*{0.0,0.008,0};
//AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//Na
AnyRefNode DistalJointSurfaceNode={
sRel=.Scale*{0.0,-0.01,0};
//AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
}; //DistalPhalanx3
AnySeg MiddlePhalanx={
Mass=..Mass3;
Jii={0,0,0};
// r0=.ProximalPhalanx.r0+.ProximalPhalanx.DistalJointNode.sRel-ProximalJointNode.sRel;
r0=.ProximalPhalanx.DistalJointNode.sRel*.ProximalPhalanx.Axes0'+.ProximalPhalanx.r0-ProximalJointNode.sRel*Axes0';
Axes0 =.ProximalPhalanx.Axes0*
ProximalJointNode.ARel*
RotMat((pi/180)*..JntPos.PIPFlexion,z)*
ProximalJointNode.ARel';
// r0= .ProximalPhalanx.DistalJointNode.sRel*.ProximalPhalanx.Axes0'+.ProximalPhalanx.r0-ProximalJointNode.sRel*Axes0';
// Axes0 =HumanModel.BodyModel.Hand.Carpals.Axes0*
// ..InsertationNode.ARel*
// RotMat((pi/180)*..JntPos.CMCDeviation,x)*
// RotMat((pi/180)*..JntPos.CMCFlexion,z)*
// ProximalJointNode.ARel';
//
//
AnyVar StdSegmentLength= 0.03;// unscaled segment length
AnyVar Scale= ..Lengths[2]/StdSegmentLength;
AnyDrawSurf BoneSurf = {
RGB=Main.DrawSettings.Colors.Segments;
FileName = ...MiddlePhalanxString;
ScaleXYZ=.Scale*{1,1,......Sign*1};
Opacity = ......BonesOpacity.Hand;
};
AnyRefNode EllipsoidNode={
AnySurfEllipsoid Ellipsoid={
AnyVar BoneLength= vnorm(..ProximalJointSurfaceNode.sRel-..DistalJointNode.sRel,2);
Radius =..Scale*....MiddlePhalanxParameters.Radius*{1,0,1}+{0,a,0}; //the bonelength is already scaled..
//definition of focus points for the ellipsoid these are used for defining contact
AnyVar a =BoneLength*....MiddlePhalanxParameters.BoneLengthCoef;
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 O2O3 = vnorm(ProximalJointSurfaceNode.sRel-DistalJointNode.sRel,2);
//O4
AnyRefNode ProximalJointNode={
sRel=.Scale*{0,0.02,0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//O3
AnyRefNode ProximalJointSurfaceNode={
sRel=.Scale*{0.0,0.01,0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//O2
AnyRefNode DistalJointNode={
sRel=.Scale*{0.0,-0.01,0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
}; //MiddlePhalanx
//
AnySeg ProximalPhalanx={
Mass=..Mass2;
Jii={0,0,0};
r0= .Metacarpal.DistalJointNode.sRel*.Metacarpal.Axes0'+.Metacarpal.r0-ProximalJointNode.sRel*Axes0';
Axes0 =.Metacarpal.Axes0*
ProximalJointNode.ARel*
RotMat((pi/180)*..JntPos.MCPFlexion,z)*
ProximalJointNode.ARel';
AnyVar StdSegmentLength= 0.0521;// unscaled segment length
AnyVar Scale= ..Lengths[1]/ StdSegmentLength;
AnyDrawSurf BoneSurf = {
RGB=Main.DrawSettings.Colors.Segments;
FileName = ...ProximalPhalanxString;
ScaleXYZ=.Scale*{1,1,......Sign*1};
Opacity = ......BonesOpacity.Hand;
};
AnyRefNode EllipsoidNode={
AnySurfEllipsoid Ellipsoid={
AnyVar BoneLength= vnorm(..ProximalJointSurfaceNode.sRel-..DistalJointNode.sRel,2);
Radius =..Scale*....ProximalPhalanxParameters.Radius*{1,0,1}+{0,a,0}; //the bonelength is already scaled..
//definition of focus points for the ellipsoid these are used for defining contact
AnyVar a =BoneLength*....ProximalPhalanxParameters.BoneLengthCoef;
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 Length=.MiddlePhalanx.O2O3*1.608;
//O6
AnyRefNode ProximalJointNode={
sRel=.Scale*{0.0,0.0321,0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//O5
AnyRefNode ProximalJointSurfaceNode={
sRel=.Scale*{0.0,0.02,0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//O4
AnyRefNode DistalJointNode={
sRel=.Scale*{0.00,-0.02,0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
}; //ProximalPhalanx
AnySeg Metacarpal={
Mass=..Mass1;
Jii={0,0,0};
#include "../DrawSettings/Nodes.any"
r0= ..InsertationNode.sRel*...Carpals.Axes0'+ ...Carpals.r0-ProximalJointNode.sRel*Axes0';
Axes0 = ...Carpals.Axes0* ..InsertationNode.ARel*
// RotMat((pi/180)*..JntPos.CMCFlexion,z)*
ProximalJointNode.ARel';
AnyVar StdSegmentLength= 0.07;// unscaled segment length
AnyVar Scale= ..Lengths[0]/StdSegmentLength;
AnyDrawSurf BoneSurf = { RGB=Main.DrawSettings.Colors.Segments;
FileName = ...MetacarpalString;
ScaleXYZ=.Scale*{1,1,......Sign*1};
Opacity = ......BonesOpacity.Hand;
};
AnyRefNode EllipsoidNode={
sRel= ...MetacarpalParameters.Offset;
ARel= RotMat(...MetacarpalParameters.RotAngle,z);
AnySurfEllipsoid Ellipsoid={
AnyVar BoneLength= vnorm(..ProximalJointSurfaceNode.sRel-..DistalJointNode.sRel,2);
Radius =..Scale*....MetacarpalParameters.Radius*{1,0,1}+{0,a,0}; //the bonelength is already scaled..
//definition of focus points for the ellipsoid these are used for defining contact
AnyVar a =BoneLength*....MetacarpalParameters.BoneLengthCoef;
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}; };
};
AnyRefNode ProximalJointNode={
sRel=.Scale*{0.00,0.035+0.005,0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
AnyRefNode ProximalJointSurfaceNode={
sRel=.Scale*{0.00,0.035,0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
//06
AnyRefNode DistalJointNode={
sRel=.Scale*{0.00,-0.03,0};
// AnyDrawRefFrame drw={ ScaleXYZ={0.05,0.05,0.05}; RGB={1,0,0}; };
};
}; //Metacarpal
}; //Segs
AnyFolder Jnt ={
//
// //Carpometacarpal joint
AnyUniversalJoint CMC={
AnyRefNode &ref1=..InsertationNode;
AnyRefNode &ref2=..Seg.Metacarpal.ProximalJointNode;
Axis1=z;
Axis2=x;
};
//
// //Drive the CMC joint so that it points at MCP joint
AnyFolder CMCDriver ={
AnyKinEqSimpleDriver Driver ={
AnyKinLinear Lin={
Ref=0;
AnyRefNode &ref1=....Seg.Metacarpal.DistalJointNode;
// ref1={AnyDrawRefFrame drw2={RGB={1,1,1};};};
AnyRefNode &ref2= ....MCPNode;
};
MeasureOrganizer={0,2}; //x and z, y is longitudinal
DriverPos={0,0};
DriverVel={0,0};
Reaction.Type ={Off,Off};
};
};
//Metacarpophalangeal joint
AnyRevoluteJoint MCP={
AnyRefNode &ref1=..Seg.Metacarpal.DistalJointNode;
AnyRefNode &ref2=..Seg.ProximalPhalanx.ProximalJointNode;
Axis=z;
#include "DrawJointAxisZ.any"
};
//Proximalinterphalangeal joint
AnyRevoluteJoint PIP={
AnyRefNode &ref1=..Seg.ProximalPhalanx.DistalJointNode;
AnyRefNode &ref2=..Seg.MiddlePhalanx.ProximalJointNode;
Axis=z;
#include "DrawJointAxisZ.any"
};
//Distalinterphalangeal joint
AnyRevoluteJoint DIP={
AnyRefNode &ref1=..Seg.MiddlePhalanx.DistalJointNode;
AnyRefNode &ref2=..Seg.DistalPhalanx.ProximalJointNode;
Axis=z;
#include "DrawJointAxisZ.any"
};
//Make a linear combination measure which links DIP motion with PIP motion
//Rijpkema1991
//Hans Rijpkema and Michael Girad
//Computer animation of knowledge-based human grasping
//Computer grahics Vol. 25, no. 4, July 1991
// AnyKinEq PIPJointDIPJointLink={
// AnyKinMeasureLinComb PIPDIP={
//
// //Proximalinterphalangeal joint
// AnyRevoluteJoint &ref1=..DIP;
//
// //Proximalinterphalangeal joint
// AnyRevoluteJoint &ref2=..PIP;
//
// Coef={{1,-2/3}};
//
//
// };
// };
}; // End Jnt definition
// Muscles Definition of the fingers:
AnyFolder JntMus = {
//Four muscles for the CMC joint - Flexion/Extension & Adduction/Abduction motion (base of thumb):
AnyMuscleGeneric CMCflexion = {
AnyMuscleModel MusMdl = {
F0 = ...CMCMusForceFlex;
Vol0 = 1e-6;
};
AnyKinMeasureOrg Org = {
AnyUniversalJoint &jnt = ...Jnt.CMC;
MeasureOrganizer = {0};
};
Type = NonNegative;
};
AnyMuscleGeneric CMCextesion = {
AnyMuscleModel MusMdl = {
F0 = ...CMCMusForceExten;
Vol0 = 1e-6;
};
AnyKinMeasureOrg Org = {
AnyUniversalJoint &jnt = ...Jnt.CMC;
MeasureOrganizer = {0};
};
Type = NonPositive;
};
AnyMuscleGeneric CMCAdduction = {
AnyMuscleModel MusMdl = {
F0 = ...CMCMusForceAdduc;
Vol0 = 1e-6;
};
AnyKinMeasureOrg Org = {
AnyUniversalJoint &jnt = ...Jnt.CMC;
MeasureOrganizer = {1};
};
Type = NonNegative;
};
AnyMuscleGeneric CMCAbduction = {
AnyMuscleModel MusMdl = {
F0 = ...CMCMusForceAbduc;
Vol0 = 1e-6;
};
AnyKinMeasureOrg Org = {
AnyUniversalJoint &jnt = ...Jnt.CMC;
MeasureOrganizer = {1};
};
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.MCP;
Type = NonNegative;
};
AnyMuscleGeneric MCPextension = {
AnyMuscleModel MusMdl = {
F0 = ...MCPMusForceExten;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.MCP;
Type = NonPositive;
};
//Two muscles for the PIP joint - Flexion/Extension motion (middle of thumb):
AnyMuscleGeneric PIPflexion = {
AnyMuscleModel MusMdl = {
F0 = ...PIPMusForceFlex;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.PIP;
Type = NonNegative;
};
AnyMuscleGeneric PIPextension = {
AnyMuscleModel MusMdl = {
F0 = ...PIPMusForceExten;
Vol0 = 1e-6;
};
AnyRevoluteJoint &jnt = ..Jnt.PIP;
Type = NonPositive;
};
//Two muscles for the DIP joint - Flexion/Extension motion (tip 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 Jnt Mus definition