aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorVegaslon2013-06-15 17:23:43 -0400
committerRobert Adams2013-06-20 19:02:15 -0700
commita5de4f692bd0de5faccdcf32a923a72949bb3cca (patch)
treef0aee1266b1bf94d44641a404c0529fbceac1103 /OpenSim
parentBulletSim: rework velocity updating when not colliding and not flying (diff)
downloadopensim-SC_OLD-a5de4f692bd0de5faccdcf32a923a72949bb3cca.zip
opensim-SC_OLD-a5de4f692bd0de5faccdcf32a923a72949bb3cca.tar.gz
opensim-SC_OLD-a5de4f692bd0de5faccdcf32a923a72949bb3cca.tar.bz2
opensim-SC_OLD-a5de4f692bd0de5faccdcf32a923a72949bb3cca.tar.xz
BulletSim: Implementation of Linear Deflection, it is a partial help for the vehicle tuning diffrence between Opensim and Second life.
Signed-off-by: Robert Adams <Robert.Adams@intel.com>
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs38
1 files changed, 33 insertions, 5 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
index 311cf4f..51207f1 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
@@ -209,7 +209,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
209 m_VhoverTimescale = Math.Max(pValue, 0.01f); 209 m_VhoverTimescale = Math.Max(pValue, 0.01f);
210 break; 210 break;
211 case Vehicle.LINEAR_DEFLECTION_EFFICIENCY: 211 case Vehicle.LINEAR_DEFLECTION_EFFICIENCY:
212 m_linearDeflectionEfficiency = Math.Max(pValue, 0.01f); 212 m_linearDeflectionEfficiency = ClampInRange(0f, pValue, 1f);
213 break; 213 break;
214 case Vehicle.LINEAR_DEFLECTION_TIMESCALE: 214 case Vehicle.LINEAR_DEFLECTION_TIMESCALE:
215 m_linearDeflectionTimescale = Math.Max(pValue, 0.01f); 215 m_linearDeflectionTimescale = Math.Max(pValue, 0.01f);
@@ -1029,9 +1029,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1029 Vector3 currentVelV = VehicleVelocity * Quaternion.Inverse(VehicleOrientation); 1029 Vector3 currentVelV = VehicleVelocity * Quaternion.Inverse(VehicleOrientation);
1030 Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVelV); 1030 Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVelV);
1031 1031
1032 //Compute Linear deflection.
1033 Vector3 linearDeflectionFactorV = ComputeLinearDeflection(m_linearDeflectionEfficiency, currentVelV, pTimestep);
1034 linearMotorCorrectionV += linearDeflectionFactorV;
1035
1032 // Friction reduces vehicle motion 1036 // Friction reduces vehicle motion
1033 Vector3 frictionFactorW = ComputeFrictionFactor(m_linearFrictionTimescale, pTimestep); 1037 Vector3 frictionFactorV = ComputeFrictionFactor(m_linearFrictionTimescale, pTimestep);
1034 linearMotorCorrectionV -= (currentVelV * frictionFactorW); 1038 linearMotorCorrectionV -= (currentVelV * frictionFactorV);
1035 1039
1036 // Motor is vehicle coordinates. Rotate it to world coordinates 1040 // Motor is vehicle coordinates. Rotate it to world coordinates
1037 Vector3 linearMotorVelocityW = linearMotorCorrectionV * VehicleOrientation; 1041 Vector3 linearMotorVelocityW = linearMotorCorrectionV * VehicleOrientation;
@@ -1048,9 +1052,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1048 1052
1049 1053
1050 1054
1051 VDetailLog("{0}, MoveLinear,velocity,origVelW={1},velV={2},correctV={3},correctW={4},newVelW={5},fricFact={6}", 1055 VDetailLog("{0}, MoveLinear,velocity,origVelW={1},velV={2},correctV={3},correctW={4},newVelW={5},fricFact={6},LinearDeflec={7}",
1052 ControllingPrim.LocalID, origVelW, currentVelV, linearMotorCorrectionV, 1056 ControllingPrim.LocalID, origVelW, currentVelV, linearMotorCorrectionV,
1053 linearMotorVelocityW, VehicleVelocity, frictionFactorW); 1057 linearMotorVelocityW, VehicleVelocity, frictionFactorV, linearDeflectionFactorV);
1054 } 1058 }
1055 1059
1056 public void ComputeLinearTerrainHeightCorrection(float pTimestep) 1060 public void ComputeLinearTerrainHeightCorrection(float pTimestep)
@@ -1651,6 +1655,30 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1651 } 1655 }
1652 return frictionFactor; 1656 return frictionFactor;
1653 } 1657 }
1658 //Given a Deflection Effiency and a Velocity, Returns a Velocity that is Partially Deflected onto the X Axis
1659 //Clamped so that a DeflectionTimescale of less then 1 does not increase force over original velocity
1660 private Vector3 ComputeLinearDeflection(float DeflectionEfficiency,Vector3 Velocity,float pTimestep)
1661 {
1662 Vector3 LinearDeflection = Vector3.Zero;
1663 LinearDeflection.Y = SortedClampInRange(0, (Velocity.Y * DeflectionEfficiency) / m_linearDeflectionTimescale, Velocity.Y);
1664 LinearDeflection.Z = SortedClampInRange(0, (Velocity.Z * DeflectionEfficiency) / m_linearDeflectionTimescale, Velocity.Z);
1665 LinearDeflection.X += Math.Abs(LinearDeflection.Y);
1666 LinearDeflection.X += Math.Abs(LinearDeflection.Z);
1667 LinearDeflection *= pTimestep;
1668 return LinearDeflection*=new Vector3(1,-1,-1);
1669
1670 }
1671 private float SortedClampInRange(float clampa, float val, float clampb)
1672 {
1673 if (clampa > clampb)
1674 {
1675 float temp = clampa;
1676 clampa = clampb;
1677 clampb = temp;
1678 }
1679 return ClampInRange(clampa, val, clampb);
1680
1681 }
1654 1682
1655 private float ClampInRange(float low, float val, float high) 1683 private float ClampInRange(float low, float val, float high)
1656 { 1684 {