From 87029295c130bb3213847de37e355306da06dcd5 Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Sat, 22 Jul 2023 19:10:15 +0100 Subject: [PATCH] src/FDM/YASim/: added optional quadratic term `spring2` to gear spring equation. In YASim XML , `spring2` is a new dimensionless term. Default value zero is backwards compatible. The new spring force equation is: force = _spring * compression * (_frac + spring2 * _frac**2) This is intended to help with https://sourceforge.net/p/flightgear/codetickets/1509. --- src/FDM/YASim/FGFDM.cpp | 1 + src/FDM/YASim/Gear.cpp | 7 ++++++- src/FDM/YASim/Gear.hpp | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/FDM/YASim/FGFDM.cpp b/src/FDM/YASim/FGFDM.cpp index 7d071d4d1..858f3f3a9 100644 --- a/src/FDM/YASim/FGFDM.cpp +++ b/src/FDM/YASim/FGFDM.cpp @@ -1090,6 +1090,7 @@ void FGFDM::parseGear(const XMLAttributes* a) g->setStaticFriction(attrf(a, "sfric", 0.8)); g->setDynamicFriction(attrf(a, "dfric", 0.7)); g->setSpring(attrf(a, "spring", 1)); + g->setSpring2(attrf(a, "spring2", 0)); g->setDamping(attrf(a, "damp", 1)); if(a->hasAttribute("on-water")) g->setOnWater(attrb(a,"on-water")); if(a->hasAttribute("on-solid")) g->setOnSolid(attrb(a,"on-solid")); diff --git a/src/FDM/YASim/Gear.cpp b/src/FDM/YASim/Gear.cpp index c4c855f5f..ad48993d7 100644 --- a/src/FDM/YASim/Gear.cpp +++ b/src/FDM/YASim/Gear.cpp @@ -53,6 +53,7 @@ Gear::Gear() for(i=0; i<3; i++) _pos[i] = _stuck[i] = 0; _spring = 1; + _spring2 = 0; _damp = 0; _sfric = 0.8f; _dfric = 0.7f; @@ -501,7 +502,11 @@ void Gear::calcForce(Ground *g_cb, RigidBody* body, State *s, float* v, float* r frac_with_initial_load = (_frac+_initialLoad) *_frac*_frac*3*25-_frac*_frac*_frac*2*125; - float fmag = frac_with_initial_load*clen*_spring; + float fmag = clen * _spring * + ( + frac_with_initial_load + + _spring2 * pow( frac_with_initial_load, 2) + ); if (_speed_planing>0) { float v = Math::mag3(cv); diff --git a/src/FDM/YASim/Gear.hpp b/src/FDM/YASim/Gear.hpp index 7c2370a6a..96ce0588d 100644 --- a/src/FDM/YASim/Gear.hpp +++ b/src/FDM/YASim/Gear.hpp @@ -67,6 +67,7 @@ public: void setSpring(float spring) { _spring = spring; } float getSpring() { return _spring; } + void setSpring2(float spring2) { _spring2 = spring2; } void setDamping(float damping) { _damp = damping; } float getDamping() {return _damp; } void setStaticFriction(float sfric) { _sfric = sfric; } @@ -142,6 +143,7 @@ private: double _stuck[3] = {0}; GearVector _cmpr; float _spring = 0; + float _spring2 = 0; float _damp = 0; float _sfric = 0; float _dfric = 0;