diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index 51207f1..07e87d1 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -707,7 +707,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
707 | private Vector3 m_knownRotationalVelocity; | 707 | private Vector3 m_knownRotationalVelocity; |
708 | private Vector3 m_knownRotationalForce; | 708 | private Vector3 m_knownRotationalForce; |
709 | private Vector3 m_knownRotationalImpulse; | 709 | private Vector3 m_knownRotationalImpulse; |
710 | private Vector3 m_knownForwardVelocity; // vehicle relative forward speed | ||
711 | 710 | ||
712 | private const int m_knownChangedPosition = 1 << 0; | 711 | private const int m_knownChangedPosition = 1 << 0; |
713 | private const int m_knownChangedVelocity = 1 << 1; | 712 | private const int m_knownChangedVelocity = 1 << 1; |
@@ -719,7 +718,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
719 | private const int m_knownChangedRotationalImpulse = 1 << 7; | 718 | private const int m_knownChangedRotationalImpulse = 1 << 7; |
720 | private const int m_knownChangedTerrainHeight = 1 << 8; | 719 | private const int m_knownChangedTerrainHeight = 1 << 8; |
721 | private const int m_knownChangedWaterLevel = 1 << 9; | 720 | private const int m_knownChangedWaterLevel = 1 << 9; |
722 | private const int m_knownChangedForwardVelocity = 1 <<10; | ||
723 | 721 | ||
724 | public void ForgetKnownVehicleProperties() | 722 | public void ForgetKnownVehicleProperties() |
725 | { | 723 | { |
@@ -923,12 +921,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
923 | { | 921 | { |
924 | get | 922 | get |
925 | { | 923 | { |
926 | if ((m_knownHas & m_knownChangedForwardVelocity) == 0) | 924 | return VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation)); |
927 | { | ||
928 | m_knownForwardVelocity = VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation)); | ||
929 | m_knownHas |= m_knownChangedForwardVelocity; | ||
930 | } | ||
931 | return m_knownForwardVelocity; | ||
932 | } | 925 | } |
933 | } | 926 | } |
934 | private float VehicleForwardSpeed | 927 | private float VehicleForwardSpeed |
@@ -981,6 +974,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
981 | { | 974 | { |
982 | ComputeLinearVelocity(pTimestep); | 975 | ComputeLinearVelocity(pTimestep); |
983 | 976 | ||
977 | ComputeLinearDeflection(pTimestep); | ||
978 | |||
984 | ComputeLinearTerrainHeightCorrection(pTimestep); | 979 | ComputeLinearTerrainHeightCorrection(pTimestep); |
985 | 980 | ||
986 | ComputeLinearHover(pTimestep); | 981 | ComputeLinearHover(pTimestep); |
@@ -1026,14 +1021,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1026 | { | 1021 | { |
1027 | // Step the motor from the current value. Get the correction needed this step. | 1022 | // Step the motor from the current value. Get the correction needed this step. |
1028 | Vector3 origVelW = VehicleVelocity; // DEBUG | 1023 | Vector3 origVelW = VehicleVelocity; // DEBUG |
1029 | Vector3 currentVelV = VehicleVelocity * Quaternion.Inverse(VehicleOrientation); | 1024 | Vector3 currentVelV = VehicleForwardVelocity; |
1030 | Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVelV); | 1025 | Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVelV); |
1031 | 1026 | ||
1032 | //Compute Linear deflection. | 1027 | // Friction reduces vehicle motion based on absolute speed. Slow vehicle down by friction. |
1033 | Vector3 linearDeflectionFactorV = ComputeLinearDeflection(m_linearDeflectionEfficiency, currentVelV, pTimestep); | ||
1034 | linearMotorCorrectionV += linearDeflectionFactorV; | ||
1035 | |||
1036 | // Friction reduces vehicle motion | ||
1037 | Vector3 frictionFactorV = ComputeFrictionFactor(m_linearFrictionTimescale, pTimestep); | 1028 | Vector3 frictionFactorV = ComputeFrictionFactor(m_linearFrictionTimescale, pTimestep); |
1038 | linearMotorCorrectionV -= (currentVelV * frictionFactorV); | 1029 | linearMotorCorrectionV -= (currentVelV * frictionFactorV); |
1039 | 1030 | ||
@@ -1050,11 +1041,38 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1050 | // Add this correction to the velocity to make it faster/slower. | 1041 | // Add this correction to the velocity to make it faster/slower. |
1051 | VehicleVelocity += linearMotorVelocityW; | 1042 | VehicleVelocity += linearMotorVelocityW; |
1052 | 1043 | ||
1044 | VDetailLog("{0}, MoveLinear,velocity,origVelW={1},velV={2},correctV={3},correctW={4},newVelW={5},fricFact={6}", | ||
1045 | ControllingPrim.LocalID, origVelW, currentVelV, linearMotorCorrectionV, | ||
1046 | linearMotorVelocityW, VehicleVelocity, frictionFactorV); | ||
1047 | } | ||
1053 | 1048 | ||
1049 | //Given a Deflection Effiency and a Velocity, Returns a Velocity that is Partially Deflected onto the X Axis | ||
1050 | //Clamped so that a DeflectionTimescale of less then 1 does not increase force over original velocity | ||
1051 | private void ComputeLinearDeflection(float pTimestep) | ||
1052 | { | ||
1053 | Vector3 linearDeflectionV = Vector3.Zero; | ||
1054 | Vector3 velocityV = VehicleForwardVelocity; | ||
1054 | 1055 | ||
1055 | VDetailLog("{0}, MoveLinear,velocity,origVelW={1},velV={2},correctV={3},correctW={4},newVelW={5},fricFact={6},LinearDeflec={7}", | 1056 | // Velocity in Y and Z dimensions is movement to the side or turning. |
1056 | ControllingPrim.LocalID, origVelW, currentVelV, linearMotorCorrectionV, | 1057 | // Compute deflection factor from the to the side and rotational velocity |
1057 | linearMotorVelocityW, VehicleVelocity, frictionFactorV, linearDeflectionFactorV); | 1058 | linearDeflectionV.Y = SortedClampInRange(0, (velocityV.Y * m_linearDeflectionEfficiency) / m_linearDeflectionTimescale, velocityV.Y); |
1059 | linearDeflectionV.Z = SortedClampInRange(0, (velocityV.Z * m_linearDeflectionEfficiency) / m_linearDeflectionTimescale, velocityV.Z); | ||
1060 | |||
1061 | // Velocity to the side and around is corrected and moved into the forward direction | ||
1062 | linearDeflectionV.X += Math.Abs(linearDeflectionV.Y); | ||
1063 | linearDeflectionV.X += Math.Abs(linearDeflectionV.Z); | ||
1064 | |||
1065 | // Scale the deflection to the fractional simulation time | ||
1066 | linearDeflectionV *= pTimestep; | ||
1067 | |||
1068 | // Subtract the sideways and rotational velocity deflection factors while adding the correction forward | ||
1069 | linearDeflectionV *= new Vector3(1,-1,-1); | ||
1070 | |||
1071 | // Correciont is vehicle relative. Convert to world coordinates and add to the velocity | ||
1072 | VehicleVelocity += linearDeflectionV * VehicleOrientation; | ||
1073 | |||
1074 | VDetailLog("{0}, MoveLinear,LinearDeflection,linDefEff={1},linDefTS={2},linDeflectionV={3}", | ||
1075 | ControllingPrim.LocalID, m_linearDeflectionEfficiency, m_linearDeflectionTimescale, linearDeflectionV); | ||
1058 | } | 1076 | } |
1059 | 1077 | ||
1060 | public void ComputeLinearTerrainHeightCorrection(float pTimestep) | 1078 | public void ComputeLinearTerrainHeightCorrection(float pTimestep) |
@@ -1655,19 +1673,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1655 | } | 1673 | } |
1656 | return frictionFactor; | 1674 | return frictionFactor; |
1657 | } | 1675 | } |
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 | 1676 | ||
1670 | } | ||
1671 | private float SortedClampInRange(float clampa, float val, float clampb) | 1677 | private float SortedClampInRange(float clampa, float val, float clampb) |
1672 | { | 1678 | { |
1673 | if (clampa > clampb) | 1679 | if (clampa > clampb) |