--- a +++ b/Tools/GRFPrediction/ContactSurfaceDistanceAndVelocityDepLinPush.any @@ -0,0 +1,624 @@ +AnyFolder Push ={ + + AnyKinLinear LinS={ + Ref=0; + AnyRefFrame &BaseObject=..BaseObject; + AnyRefFrame &StrengthObject=..StrengthObject; + }; + + LinS.StrengthObject ={ + AnyDrawSphere DrwSphere ={ + ScaleXYZ =0.01*{1,1,1}; + Opacity =...ContactStrengthSmoothed/....Strength; + }; + }; + + AnyKinMeasureOrg LinMeasureOrg0 ={ + AnyKinLinear &ref=.LinS; + MeasureOrganizer={..Direction[0]}; + }; + + AnyKinMeasureOrg LinMeasureOrg1 ={ + AnyKinLinear &ref=.LinS; + MeasureOrganizer={..Direction[1]}; + }; + + AnyKinMeasureOrg LinMeasureOrg2 ={ + AnyKinLinear &ref=.LinS; + MeasureOrganizer={..Direction[2]}; + }; + + + AnyVar UserDefinedDistMeasure=LinMeasureOrg0.Pos[0]; + AnyVar RadiusMeasure=sqrt(LinMeasureOrg1.Pos[0]^2+LinMeasureOrg2.Pos[0]^2); + AnyVar UserDefinedVelMeasure = vnorm(LinS.Vel-.UserDefinedGroundVel,2); + + AnyFloatVar LowerThanHighDistLimit = ltfun(UserDefinedDistMeasure,.UserDefinedDistLimitHigh); + AnyFloatVar GreaterThanLowDistLimit = gtfun(UserDefinedDistMeasure,.UserDefinedDistLimitLow); + AnyFloatVar LowerThanRadiusLimit = ltfun(RadiusMeasure,.UserDefinedRadiusLimit); + AnyFloatVar LowerThanHighVelLimit = ltfun(UserDefinedVelMeasure,.UserDefinedVelLimitHigh); + AnyVar UserDefinedStrengthFunction= .Strength; + + AnyVar VelSize = UserDefinedVelMeasure;//vnorm(LinS.Vel, 2); + AnyVar VelRatio = VelSize /.UserDefinedVelLimitHigh ; + + AnyFloatVar ContactDisCheck = andfun(andfun(LowerThanHighDistLimit,GreaterThanLowDistLimit),LowerThanRadiusLimit); + AnyFloatVar HeightRatio = iffun(gteqfun(UserDefinedDistMeasure, 0.0), + UserDefinedDistMeasure/.UserDefinedDistLimitHigh, + iffun(lteqfun(abs(UserDefinedDistMeasure/.UserDefinedDistLimitLow), 1.0), 0.0, 1.0)); + AnyFloatVar RadiusRatio = RadiusMeasure/.UserDefinedRadiusLimit; + + AnyFloatVar FirstControlVel = .UserDefinedVelLimitHigh * FirstControlVelRatio ; + AnyFloatVar SecondControlVel = .UserDefinedVelLimitHigh * SecondControlVelRatio ; + + AnyIntVar FirstControlVelCheck = lteqfun(VelRatio, FirstControlVelRatio ); + AnyIntVar SecondControlVelCheck = lteqfun(VelRatio, SecondControlVelRatio ); + + AnyIntVar FirstControlHeightCheck = lteqfun(HeightRatio, FirstControlHeightRatio); + AnyIntVar SecondControlHeightCheck = lteqfun(HeightRatio, SecondControlHeightRatio); + + AnyIntVar FirstControlRadiusCheck = lteqfun(RadiusRatio, FirstControlRadiusRatio); + AnyIntVar SecondControlRadiusCheck = lteqfun(RadiusRatio, SecondControlRadiusRatio); + + AnyFunPolynomial VelFactorFun_Lin = + { + AnyVar v1 = .FirstControlVelRatio; + AnyVar v2 = .SecondControlVelRatio ; + PolyCoef = (1.0/(v2-v1))*{-v1, 1.0}; + }; + + AnyFunPolynomial HeightFactorFun_Lin = + { + AnyVar h1 = .FirstControlHeightRatio; + AnyVar h2 = .SecondControlHeightRatio ; + PolyCoef = (1.0/(h2-h1))*{-h1, 1.0}; + }; + + AnyFunPolynomial RadiusFactorFun_Lin = + { + AnyVar r1 = .FirstControlRadiusRatio; + AnyVar r2 = .SecondControlRadiusRatio ; + PolyCoef = (1.0/(r2-r1))*{-r1, 1.0}; + }; + + AnyFunSquareWave VelFactorFun_SW = + { + AnyVar v1 = .FirstControlVelRatio; + AnyVar v2 = .SecondControlVelRatio ; + InitialValues = {1.0}; + Ts = {v1}; + Values = {{0.0}}; + dT = {abs(v1-v2)}; + }; + + AnyFunSquareWave HeightFactorFun_SW = + { + AnyVar h1 = .FirstControlHeightRatio; + AnyVar h2 = .SecondControlHeightRatio ; + InitialValues = {1.0}; + Ts = {h1}; + Values = {{0.0}}; + dT = {abs(h1-h2)}; + }; + + AnyFunSquareWave RadiusFactorFun_SW = + { + AnyVar r1 = .FirstControlRadiusRatio; + AnyVar r2 = .SecondControlRadiusRatio ; + InitialValues = {1.0}; + Ts = {r1}; + Values = {{0.0}}; + dT = {abs(r1-r2)}; + }; + + AnyFunInterpol VelFactorFun_BSpline4 = + { + AnyVar v1 = .FirstControlVelRatio; + AnyVar v2 = .SecondControlVelRatio; + AnyVar delta = abs(v1-v2); + + AnyVar SlopeControl = 25/100; + + Type = Bspline; + BsplineOrder = 4; + T = { v2-delta*100/100, v2-delta*50/100, v2-delta*SlopeControl, + v2, + v2+delta*SlopeControl, + (v2+v1)*50/100, + v1-delta*SlopeControl, + v1, + v1+delta*SlopeControl, v1+delta*50/100, v1+delta*100/100}; + Data = {{1.0, 1.0, 1.0, + 1.0, //v2 + 1.0, + 0.5, // average of v2 and v1 + 0.0, + 0.0, //v1 + 0.0, 0.0, 0.0}}; + }; + + AnyFunInterpol HeightFactorFun_BSpline4 = + { + AnyVar h1 = .FirstControlHeightRatio; + AnyVar h2 = .SecondControlHeightRatio ; + AnyVar delta = abs(h1-h2); + + AnyVar SlopeControl = 25/100; + + Type = Bspline; + BsplineOrder = 4; + T = { h2-delta*100/100, h2-delta*50/100, h2-delta*SlopeControl, + h2, + h2+delta*SlopeControl, + (h2+h1)*50/100, + h1-delta*SlopeControl, + h1, + h1+delta*SlopeControl, h1+delta*50/100, h1+delta*100/100}; + Data = {{1.0, 1.0, 1.0, + 1.0, //h2 + 1.0, + 0.5, // average of h2 and h1 + 0.0, + 0.0, //h1 + 0.0, 0.0, 0.0}}; + }; + + AnyFunInterpol RadiusFactorFun_BSpline4 = + { + AnyVar r1 = .FirstControlRadiusRatio; + AnyVar r2 = .SecondControlRadiusRatio ; + AnyVar delta = abs(r1-r2); + + AnyVar SlopeControl = 25/100; + + Type = Bspline; + BsplineOrder = 4; + T = { r2-delta*100/100*10, r2-delta*50/100, r2-delta*SlopeControl, + r2, + r2+delta*SlopeControl, + (r2+r1)*50/100, + r1-delta*SlopeControl, + r1, + r1+delta*SlopeControl, r1+delta*50/100, r1+delta*100/100*10}; + Data = {{1.0, 1.0, 1.0, + 1.0, //r2 + 1.0, + 0.5, // average of r2 and r1 + 0.0, + 0.0, //r1 + 0.0, 0.0, 0.0}}; + }; + + + #ifdef _SMOOTHING_FUNCTION_PROFILE_ + #undef _SMOOTHING_FUNCTION_PROFILE_ + #endif + + //#define _SMOOTHING_FUNCTION_PROFILE_ "FUNC_PROFILE_SW" + //#define _SMOOTHING_FUNCTION_PROFILE_ "FUNC_PROFILE_BSPLINE" + //#define _SMOOTHING_FUNCTION_PROFILE_ "FUNC_PROFILE_COSINE" + #define _SMOOTHING_FUNCTION_PROFILE_ "FUNC_PROFILE_LINEAR" + //#define _SMOOTHING_FUNCTION_PROFILE_ "FUNC_PROFILE_TEST" + + #if _SMOOTHING_FUNCTION_PROFILE_ == "FUNC_PROFILE_SW" + AnyVar FirstControlHeightRatio = 1.0; + AnyVar SecondControlHeightRatio = 0.1; + AnyVar FirstControlRadiusRatio = 1.0; + AnyVar SecondControlRadiusRatio = 0.9; + AnyVar FirstControlVelRatio = 1.0; + AnyVar SecondControlVelRatio = 0.1; + + AnyVar HeightFactorFun = iffun(FirstControlHeightCheck, HeightFactorFun_SW(HeightRatio)[0], 0.0); + AnyVar RadiusFactorFun = iffun(FirstControlRadiusCheck, RadiusFactorFun_SW(RadiusRatio)[0], 0.0); + AnyVar VelFactorFun = iffun(FirstControlVelCheck, VelFactorFun_SW(VelRatio)[0], 0.0); + #endif + + #if _SMOOTHING_FUNCTION_PROFILE_ == "FUNC_PROFILE_BSPLINE" + AnyVar FirstControlHeightRatio = 1.0; + AnyVar SecondControlHeightRatio = 0.1; + AnyVar FirstControlRadiusRatio = 1.0; + AnyVar SecondControlRadiusRatio = 0.9; + AnyVar FirstControlVelRatio = 1.0; + AnyVar SecondControlVelRatio = 0.1; + + //Ensure the heightratio is not outside the interpol fun + AnyVar HeightRatioMaxInSplineFun =max(HeightFactorFun_BSpline4.T)-0.0001; //find max "T" in spline function subtract tol + AnyVar HeightRatioMinInSplineFun =min(HeightFactorFun_BSpline4.T)+0.0001;//find min "T" in spline function add tol + AnyVar HeightRatioCapped_max = iffun(gtfun(HeightRatio,HeightRatioMaxInSplineFun),HeightRatioMaxInSplineFun,HeightRatio) ; //cap ratio + AnyVar HeightRatioCapped = iffun(ltfun(HeightRatioCapped_max,HeightRatioMinInSplineFun),HeightRatioMinInSplineFun,HeightRatioCapped_max) ; + + //Ensure the radiusratio is not outside the interpol fun + AnyVar RadiusRatioMaxInSplineFun =max(RadiusFactorFun_BSpline4.T)-0.0001; //find max "T" in spline function subtract tol + AnyVar RadiusRatioMinInSplineFun =min(RadiusFactorFun_BSpline4.T)+0.0001;//find min "T" in spline function add tol + AnyVar RadiusRatioCapped_max = iffun(gtfun(RadiusRatio,RadiusRatioMaxInSplineFun),RadiusRatioMaxInSplineFun,RadiusRatio) ; //cap ratio + AnyVar RadiusRatioCapped = iffun(ltfun(RadiusRatioCapped_max,RadiusRatioMinInSplineFun),RadiusRatioMinInSplineFun,RadiusRatioCapped_max) ; + + //Ensure the Velatio is not outside the interpol fun + AnyVar VelRatioMaxInSplineFun =max(VelFactorFun_BSpline4.T)-0.0001; //find max "T" in spline function subtract tol + AnyVar VelRatioMinInSplineFun =min(VelFactorFun_BSpline4.T)+0.0001;//find min "T" in spline function add tol + AnyVar VelRatioCapped_max = iffun(gtfun(VelRatio,VelRatioMaxInSplineFun),VelRatioMaxInSplineFun,VelRatio) ; //cap ratio + AnyVar VelRatioCapped = iffun(ltfun(VelRatioCapped_max,VelRatioMinInSplineFun),VelRatioMinInSplineFun,VelRatioCapped_max) ; + + + AnyVar HeightFactorFun = iffun(lteqfun(HeightRatio, FirstControlHeightRatio), + // iffun(ltfun(HeightRatio, SecondControlHeightRatio), 1.0, HeightFactorFun_BSpline4(HeightRatio)[0]), + iffun(ltfun(HeightRatio, SecondControlHeightRatio), 1.0, HeightFactorFun_BSpline4(HeightRatioCapped)[0]), + + 0.0); + AnyVar RadiusFactorFun = iffun(lteqfun(RadiusRatio, FirstControlRadiusRatio), + //iffun(ltfun(RadiusRatio, SecondControlRadiusRatio), 1.0, RadiusFactorFun_BSpline4(RadiusRatio)[0]), + iffun(ltfun(RadiusRatio, SecondControlRadiusRatio), 1.0, RadiusFactorFun_BSpline4(RadiusRatioCapped)[0]), + + 0.0); + AnyVar VelFactorFun = iffun(lteqfun(VelRatio, FirstControlVelRatio), +// iffun(ltfun(VelRatio, SecondControlVelRatio), 1.0, VelFactorFun_BSpline4(VelRatio)[0]), + iffun(ltfun(VelRatio, SecondControlVelRatio), 1.0, VelFactorFun_BSpline4(VelRatioCapped)[0]), + 0.0); + #endif + + #if _SMOOTHING_FUNCTION_PROFILE_ == "FUNC_PROFILE_COSINE" + AnyVar FirstControlHeightRatio = 1.0; + AnyVar SecondControlHeightRatio = 0.8; + AnyVar FirstControlRadiusRatio = 1.0; + AnyVar SecondControlRadiusRatio = 0.9; + AnyVar FirstControlVelRatio = 1.0; + AnyVar SecondControlVelRatio = 0.15; + + AnyVar HeightFactorFun = iffun(lteqfun(HeightRatio, FirstControlHeightRatio), + iffun(ltfun(HeightRatio, SecondControlHeightRatio), 1.0, + (cos((HeightRatio-SecondControlHeightRatio)/(FirstControlHeightRatio-SecondControlHeightRatio)*pi)+1)*0.5), + 0.0); + AnyVar RadiusFactorFun = iffun(lteqfun(RadiusRatio, FirstControlRadiusRatio), + iffun(ltfun(RadiusRatio, SecondControlRadiusRatio), 1.0, + (cos((RadiusRatio-SecondControlRadiusRatio)/(FirstControlRadiusRatio-SecondControlRadiusRatio)*pi)+1)*0.5), + 0.0); + AnyVar VelFactorFun = iffun(lteqfun(VelRatio, FirstControlVelRatio), + iffun(ltfun(VelRatio, SecondControlVelRatio), 1.0, + (cos((VelRatio-SecondControlVelRatio)/(FirstControlVelRatio-SecondControlVelRatio)*pi)+1)*0.5), + 0.0); + #endif + + #if _SMOOTHING_FUNCTION_PROFILE_ == "FUNC_PROFILE_LINEAR" + AnyVar FirstControlHeightRatio = 1.0; + AnyVar SecondControlHeightRatio = 0.8; + AnyVar FirstControlRadiusRatio = 1.0; + AnyVar SecondControlRadiusRatio = 0.9; + AnyVar FirstControlVelRatio = 1.0; + AnyVar SecondControlVelRatio = 0.15; + + AnyVar HeightFactorFun = iffun(lteqfun(HeightRatio, FirstControlHeightRatio), + iffun(ltfun(HeightRatio, SecondControlHeightRatio), 1.0, HeightFactorFun_Lin(HeightRatio)), + 0.0); + AnyVar RadiusFactorFun = iffun(lteqfun(RadiusRatio, FirstControlRadiusRatio), + iffun(ltfun(RadiusRatio, SecondControlRadiusRatio), 1.0, RadiusFactorFun_Lin(RadiusRatio)), + 0.0); + AnyVar VelFactorFun = iffun(lteqfun(VelRatio, FirstControlVelRatio), + iffun(ltfun(VelRatio, SecondControlVelRatio), 1.0, VelFactorFun_Lin(VelRatio)), + 0.0); + #endif + + #if _SMOOTHING_FUNCTION_PROFILE_ == "FUNC_PROFILE_TEST" + AnyVar FirstControlHeightRatio = 1.0; + AnyVar SecondControlHeightRatio = 0.8; + AnyVar FirstControlRadiusRatio = 1.0; + AnyVar SecondControlRadiusRatio = 0.9; + AnyVar FirstControlVelRatio = 1.0; + AnyVar SecondControlVelRatio = 0.15; + + AnyVar HeightFactorFun = iffun(FirstControlHeightCheck, + iffun(SecondControlHeightCheck, 1.0, HeightFactorFun_Lin(HeightRatio)), + 0.0); + AnyVar RadiusFactorFun = iffun(FirstControlRadiusCheck, + iffun(SecondControlRadiusCheck, 1.0, RadiusFactorFun_Lin(RadiusRatio)), + 0.0); +// AnyVar VelFactorFun = iffun(FirstControlVelCheck, +// iffun(SecondControlVelCheck, 1.0, VelFactorFun_BSpline4(VelRatio)[0]), +// 0.0); +// AnyVar VelFactorFun = iffun(FirstControlVelCheck, +// VelFactorFun_SW(VelRatio)[0], +// 0.0); + + AnyVar VelFactorFun = iffun(FirstControlVelCheck, + iffun(SecondControlVelCheck , 1.0, + (cos((VelRatio-SecondControlVelRatio)/(FirstControlVelRatio-SecondControlVelRatio)*pi)+1)*0.5), + 0.0); + #endif + + #undef _SMOOTHING_FUNCTION_PROFILE_ + + AnyVar DisFactorFun = HeightFactorFun * RadiusFactorFun; + AnyVar SmoothingFunction = DisFactorFun * VelFactorFun; + + AnyVar ContactStrengthSmoothed = SmoothingFunction * .Strength; + AnyVar ContactStrengthDisAndVel = iffun(andfun(andfun(andfun(LowerThanHighDistLimit,GreaterThanLowDistLimit),LowerThanRadiusLimit),LowerThanHighVelLimit), .Strength, 0.0); + AnyVar ContactStrengthOriginal = iffun( andfun(andfun(LowerThanHighDistLimit,GreaterThanLowDistLimit),LowerThanRadiusLimit),.Strength,0.0); + //<--Test + + AnyVec3 NormalVector={ + iffun(.Direction[0]-0,0,1), + iffun(.Direction[0]-1,0,1), + iffun(.Direction[0]-2,0,1)}; + + AnyVec3 FrictionVector1={ + iffun(.Direction[1]-0,0,1), + iffun(.Direction[1]-1,0,1), + iffun(.Direction[1]-2,0,1)}; + + AnyVec3 FrictionVector2={ + iffun(.Direction[2]-0,0,1), + iffun(.Direction[2]-1,0,1), + iffun(.Direction[2]-2,0,1)}; + + + + + AnyKinLinear Lin={ + AnyRefFrame &Box =..BaseObject; + AnyRefFrame &Hand = ..TargetObject; + Ref=0; + }; + + + + AnyFolder Direction0Muscle ={ + AnyRecruitedActuator NormalDirectionMuscle={ + AnyKinMeasureOrg NormalDir={ + AnyKinLinear &ref=...Lin; + MeasureOrganizer={....Direction[0]}; //always pick first element + }; + Strength = ..ContactStrengthSmoothed; + Type = NonNegative; + //AnyVar StrengthTestVal = + SET_DEFAULT_ACTUATOR_VOLUME; + + }; + }; + + + + AnyFolder Direction01Muscle={ + AnyFolder Push={ + AnyKinMeasureOrg NormalDir={ + AnyKinLinear &ref=...Lin; + MeasureOrganizer={....Direction[0]}; //always pick first element + }; + AnyKinMeasureOrg FrictionDir={ + AnyKinLinear &ref=...Lin; + MeasureOrganizer={....Direction[1]}; // pick second element + }; + AnyKinMeasureLinComb LinCombinationMeasure ={ + AnyKinMeasure& u1=.NormalDir; + AnyKinMeasure& u2=.FrictionDir; + Coef={ + {1,....StaticFrictionCoefficient} + }; + OutDim = 1; + }; + + AnyRecruitedActuator FrictionMuscle={ + // AnyKinMeasure& ref1=.FrictionDir; + AnyKinMeasureLinComb &ref1=.LinCombinationMeasure; + Strength = ...ContactStrengthSmoothed; + Type = NonNegative; + SET_DEFAULT_ACTUATOR_VOLUME; + }; + + };//Push + + AnyFolder Pull={ + AnyKinMeasureOrg NormalDir={ + AnyKinLinear &ref=...Lin; + MeasureOrganizer={....Direction[0]}; //always pick first element + }; + AnyKinMeasureOrg FrictionDir={ + AnyKinLinear &ref=...Lin; + MeasureOrganizer={....Direction[1]}; // pick second element + }; + AnyKinMeasureLinComb LinCombinationMeasure ={ + AnyKinMeasure& u1=.NormalDir; + AnyKinMeasure& u2=.FrictionDir; + Coef={ + {-1,....StaticFrictionCoefficient} + }; + OutDim = 1; + }; + + AnyRecruitedActuator FrictionMuscle={ + AnyKinMeasureLinComb &ref1=.LinCombinationMeasure; + // AnyKinMeasure& ref1=.FrictionDir; + Strength = ...ContactStrengthSmoothed; + Type = NonPositive; + SET_DEFAULT_ACTUATOR_VOLUME; + }; + + };//Pull + + }; + + + + AnyFolder Direction02Muscle={ + AnyFolder Push={ + AnyKinMeasureOrg NormalDir={ + AnyKinLinear &ref=...Lin; + MeasureOrganizer={....Direction[0]}; //always pick first element + }; + AnyKinMeasureOrg FrictionDir={ + AnyKinLinear &ref=...Lin; + MeasureOrganizer={....Direction[2]}; // pick last element + }; + AnyKinMeasureLinComb LinCombinationMeasure ={ + AnyKinMeasure& u1=.NormalDir; + AnyKinMeasure& u2=.FrictionDir; + Coef={ + {1,....StaticFrictionCoefficient} + }; + OutDim = 1; + }; + + AnyRecruitedActuator FrictionMuscle={ + AnyKinMeasureLinComb &ref1=.LinCombinationMeasure; + // AnyKinMeasure& ref1=.FrictionDir; + + Strength = ...ContactStrengthSmoothed; + Type = NonNegative; + SET_DEFAULT_ACTUATOR_VOLUME; + }; + + };//Push + + AnyFolder Pull={ + AnyKinMeasureOrg NormalDir={ + AnyKinLinear &ref=...Lin; + MeasureOrganizer={....Direction[0]}; //always pick first element + }; + AnyKinMeasureOrg FrictionDir={ + AnyKinLinear &ref=...Lin; + MeasureOrganizer={....Direction[2]}; // pick last element + }; + AnyKinMeasureLinComb LinCombinationMeasure ={ + AnyKinMeasure& u1=.NormalDir; + AnyKinMeasure& u2=.FrictionDir; + Coef={ + {-1,....StaticFrictionCoefficient} + }; + OutDim = 1; + }; + + AnyRecruitedActuator FrictionMuscle={ + AnyKinMeasureLinComb &ref1=.LinCombinationMeasure; + // AnyKinMeasure& ref1=.FrictionDir; + Strength = ...ContactStrengthSmoothed; + Type = NonPositive; + SET_DEFAULT_ACTUATOR_VOLUME; + }; + + };//Pull + + }; + + AnyFolder RefMuscles = + { + AnyRecruitedForce& ref0 = .Direction0Muscle.NormalDirectionMuscle; + AnyRecruitedForce& ref1 = .Direction01Muscle.Push.FrictionMuscle; + AnyRecruitedForce& ref2 = .Direction01Muscle.Pull.FrictionMuscle; + AnyRecruitedForce& ref3 = .Direction02Muscle.Push.FrictionMuscle; + AnyRecruitedForce& ref4 = .Direction02Muscle.Pull.FrictionMuscle; + }; + +// AnyForceMomentMeasure ForceMomentMeasure = +// { +// AnyForceBase& ref0 = .Direction0Muscle.NormalDirectionMuscle; +// AnyForceBase& ref1 = .Direction01Muscle.Push.FrictionMuscle; +// AnyForceBase& ref2 = .Direction01Muscle.Pull.FrictionMuscle; +// AnyForceBase& ref3 = .Direction02Muscle.Push.FrictionMuscle; +// AnyForceBase& ref4 = .Direction02Muscle.Pull.FrictionMuscle; +// +// AnyRefFrame& base = ..BaseObject; +// +// AnyVec3 Flocal = F * base.Axes; +// AnyVec3 Mlocal = M * base.Axes; +// }; + + AnyDrawVector DrawNormalForce = + { + AnyRefFrame &ref=..TargetObject; + AnyVar Strength= max({.ContactStrengthSmoothed, 0.00001}); + Vec =..ScaleFactor*..DrawRef.DrawSettingsSupport.Lin.ScaleFactor*( + abs(.NormalVector*.Direction0Muscle.NormalDirectionMuscle.Fout[0])*..BaseObject.Axes' + + abs(.NormalVector*.Direction01Muscle.Push.FrictionMuscle.Fout[0])*..BaseObject.Axes' + + abs(.NormalVector*.Direction02Muscle.Push.FrictionMuscle.Fout[0])*..BaseObject.Axes' + + abs(.NormalVector*.Direction01Muscle.Pull.FrictionMuscle.Fout[0])*..BaseObject.Axes' + + abs(.NormalVector*.Direction02Muscle.Pull.FrictionMuscle.Fout[0])*..BaseObject.Axes'); + AnyVar length=Strength*(2-(1-Strength/sqrt(Strength^2))); + + PointAway = Off; + DrawCoord = Off; + + Line.RGB = ..DrawRef.DrawSettingsSupport.Lin.RGB; + Line.Thickness = ..DrawRef.DrawSettingsSupport.Lin.Thickness; + Line.End.Thickness = 2*..DrawRef.DrawSettingsSupport.Lin.Thickness; + Line.End.Length = 4*..DrawRef.DrawSettingsSupport.Lin.Thickness; + + }; + + AnyFolder NormalForceValue = + { + AnyRefFrame &ref=..TargetObject; + AnyVar Strength= max({.ContactStrengthSmoothed,0.00001}); + AnyVec3 NormalForceVector =..ScaleFactor*..DrawRef.DrawSettingsSupport.Lin.ScaleFactor*( + abs(.NormalVector*.Direction0Muscle.NormalDirectionMuscle.Fout[0])*..BaseObject.Axes' + +abs(.NormalVector*.Direction01Muscle.Push.FrictionMuscle.Fout[0])*..BaseObject.Axes' + +abs(.NormalVector*.Direction02Muscle.Push.FrictionMuscle.Fout[0])*..BaseObject.Axes' + +abs(.NormalVector*.Direction01Muscle.Pull.FrictionMuscle.Fout[0])*..BaseObject.Axes' + +abs(.NormalVector*.Direction02Muscle.Pull.FrictionMuscle.Fout[0])*..BaseObject.Axes'); + AnyVar length=Strength*(2-(1-Strength/sqrt(Strength^2))); + }; + + AnyDrawVector DrawFrictionForce = + { + AnyRefFrame &ref=..TargetObject; + + Vec =..ScaleFactor*..DrawRef.DrawSettingsSupport.Lin.ScaleFactor*..StaticFrictionCoefficient*( + abs(.FrictionVector1*.Direction01Muscle.Push.FrictionMuscle.Fout[0]) + -abs(.FrictionVector1*.Direction01Muscle.Pull.FrictionMuscle.Fout[0]) + +abs(.FrictionVector2*.Direction02Muscle.Push.FrictionMuscle.Fout[0]) + -abs(.FrictionVector2*.Direction02Muscle.Pull.FrictionMuscle.Fout[0]))*..BaseObject.Axes'; + + PointAway = Off; + DrawCoord = Off; + + Line.RGB = ..DrawRef.DrawSettingsSupport.Lin.RGB; + Line.Thickness = ..DrawRef.DrawSettingsSupport.Lin.Thickness; + Line.End.Thickness = 2*..DrawRef.DrawSettingsSupport.Lin.Thickness; + Line.End.Length = 4*..DrawRef.DrawSettingsSupport.Lin.Thickness; + }; + + + //resultann force given in global ref system + AnyVec3 NormalForceVec = NormalForceValue.NormalForceVector/(.ScaleFactor*.DrawRef.DrawSettingsSupport.Lin.ScaleFactor); + AnyVar NormalForceScalar = (NormalForceVec[0]^2+NormalForceVec[1]^2+NormalForceVec[2]^2)^0.5; + + AnyVec3 NormalForceVec2 = NormalForceValue.NormalForceVector/(.ScaleFactor*.DrawRef.DrawSettingsSupport.Lin.ScaleFactor); + AnyVar NormalForceScalar2 = (NormalForceVec2[0]^2+NormalForceVec2[1]^2+NormalForceVec2[2]^2)^0.5; + + AnyVec3 FrictionForceVec = DrawFrictionForce.Vec/(.ScaleFactor*.DrawRef.DrawSettingsSupport.Lin.ScaleFactor); + AnyVar FrictionForceScalar = (FrictionForceVec[0]^2+FrictionForceVec[1]^2+FrictionForceVec[2]^2)^0.5; + + //AnyVar TotalForceScalar = (TotalForceVec[0]^2+TotalForceVec[1]^2+TotalForceVec[2]^2)^0.5; + + /* + AnyDrawVector DrawFrictionForce1 = { + + AnyRefFrame &ref=..TargetObject; + + Vec =0.001*..StaticFrictionCoefficient*( + abs(.FrictionVector1*.Direction01Muscle.Push.FrictionMuscle.Fout[0])*..BaseObject.Axes')+ + -abs(.FrictionVector1*.Direction01Muscle.Pull.FrictionMuscle.Fout[0])*..BaseObject.Axes'); + + PointAway = Off; + DrawCoord = Off; + Line.RGB = {0,1,0}; + Line.Thickness = 0.015; + Line.End.Thickness = 2*0.015; + Line.End.Length = 4*0.015; + }; + + AnyDrawVector DrawFrictionForce2 = { + + AnyRefFrame &ref=..TargetObject; + + Vec =0.001*..StaticFrictionCoefficient*( + abs(.FrictionVector2*.Direction02Muscle.Push.FrictionMuscle.Fout[0])*..BaseObject.Axes')+ + -abs(.FrictionVector2*.Direction02Muscle.Pull.FrictionMuscle.Fout[0])*..BaseObject.Axes'); + + PointAway = Off; + DrawCoord = Off; + Line.RGB = {1,0,0}; + Line.Thickness = 0.015; + Line.End.Thickness = 2*0.015; + Line.End.Length = 4*0.015; + }; + */ +}; +