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>cpu-performance
							parent
							
								
									bbeff4b8ca
								
							
						
					
					
						commit
						a5de4f692b
					
				|  | @ -209,7 +209,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | ||||||
|                     m_VhoverTimescale = Math.Max(pValue, 0.01f); |                     m_VhoverTimescale = Math.Max(pValue, 0.01f); | ||||||
|                     break; |                     break; | ||||||
|                 case Vehicle.LINEAR_DEFLECTION_EFFICIENCY: |                 case Vehicle.LINEAR_DEFLECTION_EFFICIENCY: | ||||||
|                     m_linearDeflectionEfficiency = Math.Max(pValue, 0.01f); |                     m_linearDeflectionEfficiency = ClampInRange(0f, pValue, 1f); | ||||||
|                     break; |                     break; | ||||||
|                 case Vehicle.LINEAR_DEFLECTION_TIMESCALE: |                 case Vehicle.LINEAR_DEFLECTION_TIMESCALE: | ||||||
|                     m_linearDeflectionTimescale = Math.Max(pValue, 0.01f); |                     m_linearDeflectionTimescale = Math.Max(pValue, 0.01f); | ||||||
|  | @ -1029,9 +1029,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin | ||||||
|             Vector3 currentVelV = VehicleVelocity * Quaternion.Inverse(VehicleOrientation); |             Vector3 currentVelV = VehicleVelocity * Quaternion.Inverse(VehicleOrientation); | ||||||
|             Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVelV); |             Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVelV); | ||||||
| 
 | 
 | ||||||
|  |             //Compute Linear deflection. | ||||||
|  |             Vector3 linearDeflectionFactorV = ComputeLinearDeflection(m_linearDeflectionEfficiency, currentVelV, pTimestep); | ||||||
|  |             linearMotorCorrectionV += linearDeflectionFactorV; | ||||||
|  | 
 | ||||||
|             // Friction reduces vehicle motion |             // Friction reduces vehicle motion | ||||||
|             Vector3 frictionFactorW = ComputeFrictionFactor(m_linearFrictionTimescale, pTimestep); |             Vector3 frictionFactorV = ComputeFrictionFactor(m_linearFrictionTimescale, pTimestep); | ||||||
|             linearMotorCorrectionV -= (currentVelV * frictionFactorW); |             linearMotorCorrectionV -= (currentVelV * frictionFactorV); | ||||||
| 
 | 
 | ||||||
|             // Motor is vehicle coordinates. Rotate it to world coordinates |             // Motor is vehicle coordinates. Rotate it to world coordinates | ||||||
|             Vector3 linearMotorVelocityW = linearMotorCorrectionV * VehicleOrientation; |             Vector3 linearMotorVelocityW = linearMotorCorrectionV * VehicleOrientation; | ||||||
|  | @ -1048,9 +1052,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|             VDetailLog("{0},  MoveLinear,velocity,origVelW={1},velV={2},correctV={3},correctW={4},newVelW={5},fricFact={6}", |             VDetailLog("{0},  MoveLinear,velocity,origVelW={1},velV={2},correctV={3},correctW={4},newVelW={5},fricFact={6},LinearDeflec={7}", | ||||||
|                         ControllingPrim.LocalID, origVelW, currentVelV, linearMotorCorrectionV, |                         ControllingPrim.LocalID, origVelW, currentVelV, linearMotorCorrectionV, | ||||||
|                         linearMotorVelocityW, VehicleVelocity, frictionFactorW); |                         linearMotorVelocityW, VehicleVelocity, frictionFactorV, linearDeflectionFactorV); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void ComputeLinearTerrainHeightCorrection(float pTimestep) |         public void ComputeLinearTerrainHeightCorrection(float pTimestep) | ||||||
|  | @ -1651,6 +1655,30 @@ namespace OpenSim.Region.Physics.BulletSPlugin | ||||||
|             } |             } | ||||||
|             return frictionFactor; |             return frictionFactor; | ||||||
|         } |         } | ||||||
|  |         //Given a Deflection Effiency and a Velocity, Returns a Velocity that is Partially Deflected onto the X Axis | ||||||
|  |           //Clamped so that a DeflectionTimescale of less then 1 does not increase force over original velocity | ||||||
|  |         private Vector3 ComputeLinearDeflection(float DeflectionEfficiency,Vector3 Velocity,float pTimestep) | ||||||
|  |         { | ||||||
|  |             Vector3 LinearDeflection = Vector3.Zero; | ||||||
|  |             LinearDeflection.Y = SortedClampInRange(0, (Velocity.Y * DeflectionEfficiency) / m_linearDeflectionTimescale, Velocity.Y); | ||||||
|  |             LinearDeflection.Z = SortedClampInRange(0, (Velocity.Z * DeflectionEfficiency) / m_linearDeflectionTimescale, Velocity.Z); | ||||||
|  |             LinearDeflection.X += Math.Abs(LinearDeflection.Y); | ||||||
|  |             LinearDeflection.X += Math.Abs(LinearDeflection.Z); | ||||||
|  |             LinearDeflection *= pTimestep; | ||||||
|  |                 return LinearDeflection*=new Vector3(1,-1,-1); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |         private float SortedClampInRange(float clampa, float val, float clampb) | ||||||
|  |         { | ||||||
|  |             if (clampa > clampb) | ||||||
|  |             { | ||||||
|  |                 float temp = clampa; | ||||||
|  |                 clampa = clampb; | ||||||
|  |                 clampb = temp; | ||||||
|  |             } | ||||||
|  |            return ClampInRange(clampa, val, clampb); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         private float ClampInRange(float low, float val, float high) |         private float ClampInRange(float low, float val, float high) | ||||||
|         { |         { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Vegaslon
						Vegaslon