--- a +++ b/Tools/ModelUtilities/FrictionContactMuscles/ConditionalContactFootPlaneClass.any @@ -0,0 +1,125 @@ + + + + #class_template ConditionalContactFootPlaneClass (AnyRefFrame &BaseObject, AnyFolder &Foot, DisplayTriggerVolume, DisplayTargetNode) + { + + AnyRefFrame &TargetObject1 = Foot.ToeLateralContactNode; + AnyRefFrame &TargetObject2 = Foot.ToeMedialContactNode; + AnyRefFrame &TargetObject3 = Foot.HeelJoint; + + //low limit for the strength measure function, if the distance measured along Direction[0] is below this val. the strength will be zero (negative) + #var AnyVar UserDefinedLimitLow; + //high limit for the strength measure function, if the distance measured along Direction[0] is above this val. the strength will be zero + #var AnyVar UserDefinedLimitHigh; + //high limit for the strength measure function, if the radius measured along the plane with Direction[0] as normal is above this val. the strength will be zero + #var AnyVar UserDefinedRadiusLimit; + + #var AnyVar StaticFrictionCoefficient; //Friction coefficient + #var AnyVar Strength =3000; //strength of muscles + #var AnyVar ScaleFactor =1; //scale factor for draw vectors it can be set differently than by the drawsettings + + #var AnyInt NormalDirection; + #var AnyInt FrictionDirection1; + #var AnyInt FrictionDirection2; + + AnyInt X = 0; + AnyInt Y = 1; + AnyInt Z = 2; + + AnyVar GlobalRotCoef = iffun(2-NormalDirection,1,0); // 0 if z is normal, if not 1 + AnyVar RotCoefY = iffun(NormalDirection,0,1); + AnyVar RotCoefX = iffun(NormalDirection,-1,0); + + #if (DisplayTriggerVolume) + BaseObject = { + AnyRefNode CylRotNode = { + AnyDrawRefFrame drw = { + #var ScaleXYZ = 0.3*{1,1,1}; + }; + sRel = {0,0,0}; + ARel = RotMat(..RotCoefY*..GlobalRotCoef*pi/2,y)*RotMat(..RotCoefX*..GlobalRotCoef*pi/2,x); + AnyRefNode CylNode = { + sRel = {0,0,...UserDefinedLimitLow}; + AnySurfCylinder TriggerCyl = + { + Radius = ....UserDefinedRadiusLimit; + Length = - ....UserDefinedLimitLow + ....UserDefinedLimitHigh; + CapRatio = 0.001; + AnyDrawParamSurf Draw = + { + Opacity = 0.5; + }; + }; + }; + }; + }; + #endif + + #if (DisplayTargetNode) + TargetObject1 = { + AnyDrawNode DrawContactTarget = { + ScaleXYZ = {1,1,1}*0.015; + }; + }; + + TargetObject2 = { + AnyDrawNode DrawContactTarget = { + ScaleXYZ = {1,1,1}*0.015; + }; + }; + + TargetObject3 = { + AnyDrawNode DrawContactTarget = { + ScaleXYZ = {1,1,1}*0.015; + }; + }; + #endif + + + ConditionalContactClass Contac1 (BaseObject = .BaseObject, TargetObject = .TargetObject1, DisplayTriggerVolume = 0, DisplayTargetNode = 0)= + { + StaticFrictionCoefficient = .StaticFrictionCoefficient; + Strength = .Strength; + ScaleFactor = .ScaleFactor; + + UserDefinedLimitLow = .UserDefinedLimitLow; + UserDefinedLimitHigh = .UserDefinedLimitHigh; + UserDefinedRadiusLimit = .UserDefinedRadiusLimit; + + NormalDirection = .NormalDirection; + FrictionDirection1 = .FrictionDirection1; + FrictionDirection2 = .FrictionDirection2; + }; + + ConditionalContactClass Contac2 (BaseObject = .BaseObject, TargetObject = .TargetObject2, DisplayTriggerVolume = 0, DisplayTargetNode = 0)= + { + StaticFrictionCoefficient = .StaticFrictionCoefficient; + Strength = .Strength; + ScaleFactor = .ScaleFactor; + + UserDefinedLimitLow = .UserDefinedLimitLow; + UserDefinedLimitHigh = .UserDefinedLimitHigh; + UserDefinedRadiusLimit = .UserDefinedRadiusLimit; + + NormalDirection = .NormalDirection; + FrictionDirection1 = .FrictionDirection1; + FrictionDirection2 = .FrictionDirection2; + }; + + ConditionalContactClass Contac3 (BaseObject = .BaseObject, TargetObject = .TargetObject3, DisplayTriggerVolume = 0, DisplayTargetNode = 0)= + { + StaticFrictionCoefficient = .StaticFrictionCoefficient; + Strength = .Strength; + ScaleFactor = .ScaleFactor; + + UserDefinedLimitLow = .UserDefinedLimitLow; + UserDefinedLimitHigh = .UserDefinedLimitHigh; + UserDefinedRadiusLimit = .UserDefinedRadiusLimit; + + NormalDirection = .NormalDirection; + FrictionDirection1 = .FrictionDirection1; + FrictionDirection2 = .FrictionDirection2; + }; + }; + \ No newline at end of file