aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorVegaslon2013-07-06 12:53:20 -0400
committerRobert Adams2013-07-07 06:18:50 -0700
commitbbc40fab620dd61e500d8f74fa1b0d64ecc7c3b6 (patch)
tree190515280a6b4743c5f34b3a91b83016b2854c09 /OpenSim
parentBulletSim: fix jumping up and down of linksets when center-of-mass (diff)
downloadopensim-SC_OLD-bbc40fab620dd61e500d8f74fa1b0d64ecc7c3b6.zip
opensim-SC_OLD-bbc40fab620dd61e500d8f74fa1b0d64ecc7c3b6.tar.gz
opensim-SC_OLD-bbc40fab620dd61e500d8f74fa1b0d64ecc7c3b6.tar.bz2
opensim-SC_OLD-bbc40fab620dd61e500d8f74fa1b0d64ecc7c3b6.tar.xz
BulletSim: Different Implementation of Angular Deflection for vehicles, Activates it again and fixes problem with fighting with vertical attractor removing wobble of forward axis. Comments on testing welcome, May require adjustments of this force or other forces after this commit, exact tweaking to come after testing on other hardware.
Signed-off-by: Robert Adams <Robert.Adams@intel.com>
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs31
1 files changed, 16 insertions, 15 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
index c27d3f0..82fe267 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
@@ -144,7 +144,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
144 public void SetupVehicleDebugging() 144 public void SetupVehicleDebugging()
145 { 145 {
146 enableAngularVerticalAttraction = true; 146 enableAngularVerticalAttraction = true;
147 enableAngularDeflection = false; 147 enableAngularDeflection = true;
148 enableAngularBanking = true; 148 enableAngularBanking = true;
149 if (BSParam.VehicleDebuggingEnable) 149 if (BSParam.VehicleDebuggingEnable)
150 { 150 {
@@ -173,7 +173,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
173 switch (pParam) 173 switch (pParam)
174 { 174 {
175 case Vehicle.ANGULAR_DEFLECTION_EFFICIENCY: 175 case Vehicle.ANGULAR_DEFLECTION_EFFICIENCY:
176 m_angularDeflectionEfficiency = Math.Max(pValue, 0.01f); 176 m_angularDeflectionEfficiency = ClampInRange(0f, pValue, 1f);
177 break; 177 break;
178 case Vehicle.ANGULAR_DEFLECTION_TIMESCALE: 178 case Vehicle.ANGULAR_DEFLECTION_TIMESCALE:
179 m_angularDeflectionTimescale = Math.Max(pValue, 0.01f); 179 m_angularDeflectionTimescale = Math.Max(pValue, 0.01f);
@@ -1512,11 +1512,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1512 // in that direction. 1512 // in that direction.
1513 // TODO: implement reference frame. 1513 // TODO: implement reference frame.
1514 public void ComputeAngularDeflection() 1514 public void ComputeAngularDeflection()
1515 { 1515 {
1516 // Since angularMotorUp and angularDeflection are computed independently, they will calculate
1517 // approximately the same X or Y correction. When added together (when contributions are combined)
1518 // this creates an over-correction and then wabbling as the target is overshot.
1519 // TODO: rethink how the different correction computations inter-relate.
1520 1516
1521 if (enableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleForwardSpeed > 0.2) 1517 if (enableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleForwardSpeed > 0.2)
1522 { 1518 {
@@ -1531,10 +1527,14 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1531 1527
1532 // The direction the vehicle is pointing 1528 // The direction the vehicle is pointing
1533 Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation; 1529 Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation;
1534 pointingDirection.Normalize(); 1530 //Predict where the Vehicle will be pointing after AngularVelocity change is applied. This will keep
1531 // from overshooting and allow this correction to merge with the Vertical Attraction peacefully.
1532 Vector3 predictedPointingDirection = pointingDirection * Quaternion.CreateFromAxisAngle(VehicleRotationalVelocity, 0f);
1533 predictedPointingDirection.Normalize();
1535 1534
1536 // The difference between what is and what should be. 1535 // The difference between what is and what should be.
1537 Vector3 deflectionError = movingDirection - pointingDirection; 1536 // Vector3 deflectionError = movingDirection - predictedPointingDirection;
1537 Vector3 deflectionError = Vector3.Cross(movingDirection, predictedPointingDirection);
1538 1538
1539 // Don't try to correct very large errors (not our job) 1539 // Don't try to correct very large errors (not our job)
1540 // if (Math.Abs(deflectionError.X) > PIOverFour) deflectionError.X = PIOverTwo * Math.Sign(deflectionError.X); 1540 // if (Math.Abs(deflectionError.X) > PIOverFour) deflectionError.X = PIOverTwo * Math.Sign(deflectionError.X);
@@ -1547,15 +1547,16 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1547 // ret = m_angularDeflectionCorrectionMotor(1f, deflectionError); 1547 // ret = m_angularDeflectionCorrectionMotor(1f, deflectionError);
1548 1548
1549 // Scale the correction by recovery timescale and efficiency 1549 // Scale the correction by recovery timescale and efficiency
1550 deflectContributionV = (-deflectionError) * m_angularDeflectionEfficiency; 1550 // Not modeling a spring so clamp the scale to no more then the arc
1551 deflectContributionV /= m_angularDeflectionTimescale; 1551 deflectContributionV = (-deflectionError) * ClampInRange(0, m_angularDeflectionEfficiency/m_angularDeflectionTimescale,1f);
1552 1552 //deflectContributionV /= m_angularDeflectionTimescale;
1553 VehicleRotationalVelocity += deflectContributionV * VehicleOrientation;
1554 1553
1554 // VehicleRotationalVelocity += deflectContributionV * VehicleOrientation;
1555 VehicleRotationalVelocity += deflectContributionV;
1555 VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}", 1556 VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}",
1556 ControllingPrim.LocalID, movingDirection, pointingDirection, deflectionError, deflectContributionV); 1557 ControllingPrim.LocalID, movingDirection, pointingDirection, deflectionError, deflectContributionV);
1557 VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3}", 1558 VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3},PredictedPointingDir={4}",
1558 ControllingPrim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale); 1559 ControllingPrim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale, predictedPointingDirection);
1559 } 1560 }
1560 } 1561 }
1561 1562