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