BulletSim: fix vehicles going underground when unsat. Problem was that, when doing unsit, the order of operations on the prims and the vehicle is very chaotic and not in a good order so the root prim was being left physical and thus it fell for a bit. Also changed default of velocity scaling to be closer to the movement standard.

0.7.5-pf-bulletsim
Robert Adams 2012-12-17 13:22:04 -08:00
parent 021623a17d
commit 11532a4390
4 changed files with 32 additions and 29 deletions

View File

@ -87,7 +87,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
private float m_angularMotorTimescale = 0; // motor angular velocity ramp up rate private float m_angularMotorTimescale = 0; // motor angular velocity ramp up rate
private float m_angularMotorDecayTimescale = 0; // motor angular velocity decay rate private float m_angularMotorDecayTimescale = 0; // motor angular velocity decay rate
private Vector3 m_angularFrictionTimescale = Vector3.Zero; // body angular velocity decay rate private Vector3 m_angularFrictionTimescale = Vector3.Zero; // body angular velocity decay rate
private Vector3 m_lastAngularCorrection = Vector3.Zero; private Vector3 m_lastAngularVelocity = Vector3.Zero;
private Vector3 m_lastVertAttractor = Vector3.Zero; // what VA was last applied to body private Vector3 m_lastVertAttractor = Vector3.Zero; // what VA was last applied to body
//Deflection properties //Deflection properties
@ -128,7 +128,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// Return 'true' if this vehicle is doing vehicle things // Return 'true' if this vehicle is doing vehicle things
public bool IsActive public bool IsActive
{ {
get { return Type != Vehicle.TYPE_NONE; } get { return Type != Vehicle.TYPE_NONE && Prim.IsPhysical; }
} }
internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue) internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue)
@ -664,6 +664,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// an UpdateProperties event to send the changes up to the simulator. // an UpdateProperties event to send the changes up to the simulator.
BulletSimAPI.PushUpdate2(Prim.PhysBody.ptr); BulletSimAPI.PushUpdate2(Prim.PhysBody.ptr);
} }
m_knownChanged = 0;
} }
// Since the computation of terrain height can be a little involved, this routine // Since the computation of terrain height can be a little involved, this routine
@ -993,11 +994,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
public Vector3 ComputeLinearMotorUp(float pTimestep) public Vector3 ComputeLinearMotorUp(float pTimestep)
{ {
Vector3 ret = Vector3.Zero; Vector3 ret = Vector3.Zero;
float distanceAboveGround = 0f;
if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0) if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0)
{ {
float targetHeight = Type == Vehicle.TYPE_BOAT ? GetWaterLevel(VehiclePosition) : GetTerrainHeight(VehiclePosition); float targetHeight = Type == Vehicle.TYPE_BOAT ? GetWaterLevel(VehiclePosition) : GetTerrainHeight(VehiclePosition);
float distanceAboveGround = VehiclePosition.Z - targetHeight; distanceAboveGround = VehiclePosition.Z - targetHeight;
// Not colliding if the vehicle is off the ground // Not colliding if the vehicle is off the ground
if (!Prim.IsColliding) if (!Prim.IsColliding)
{ {
@ -1010,9 +1012,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// has a decay factor. This says this force should // has a decay factor. This says this force should
// be computed with a motor. // be computed with a motor.
// TODO: add interaction with banking. // TODO: add interaction with banking.
}
VDetailLog("{0}, MoveLinear,limitMotorUp,distAbove={1},colliding={2},ret={3}", VDetailLog("{0}, MoveLinear,limitMotorUp,distAbove={1},colliding={2},ret={3}",
Prim.LocalID, distanceAboveGround, Prim.IsColliding, ret); Prim.LocalID, distanceAboveGround, Prim.IsColliding, ret);
}
return ret; return ret;
} }
@ -1049,8 +1051,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// ================================================================== // ==================================================================
m_lastVertAttractor = verticalAttractionContribution; m_lastVertAttractor = verticalAttractionContribution;
// DEBUG DEBUG DEBUG: optionally scale the angular velocity. Debugging SL vs ODE turning functions.
Vector3 originalAngularMotorContrib = angularMotorContribution;
if (PhysicsScene.VehicleScaleAngularVelocityByTimestep)
angularMotorContribution *= pTimestep;
// Sum corrections // Sum corrections
m_lastAngularCorrection = angularMotorContribution m_lastAngularVelocity = angularMotorContribution
+ verticalAttractionContribution + verticalAttractionContribution
+ deflectionContribution + deflectionContribution
+ bankingContribution; + bankingContribution;
@ -1058,19 +1065,15 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// ================================================================== // ==================================================================
// Apply the correction velocity. // Apply the correction velocity.
// TODO: Should this be applied as an angular force (torque)? // TODO: Should this be applied as an angular force (torque)?
if (!m_lastAngularCorrection.ApproxEquals(Vector3.Zero, 0.01f)) if (!m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f))
{ {
// DEBUG DEBUG DEBUG: optionally scale the angular velocity. Debugging SL vs ODE turning functions. VehicleRotationalVelocity = m_lastAngularVelocity;
Vector3 scaledCorrection = m_lastAngularCorrection;
if (PhysicsScene.VehicleScaleAngularVelocityByTimestep)
scaledCorrection *= pTimestep;
VehicleRotationalVelocity = scaledCorrection;
VDetailLog("{0}, MoveAngular,done,nonZero,angMotorContrib={1},vertAttrContrib={2},bankContrib={3},deflectContrib={4},totalContrib={5},scaledCorr={6}", VDetailLog("{0}, MoveAngular,done,nonZero,angMotorContrib={1},vertAttrContrib={2},bankContrib={3},deflectContrib={4},totalContrib={5}",
Prim.LocalID, Prim.LocalID,
angularMotorContribution, verticalAttractionContribution, angularMotorContribution, verticalAttractionContribution,
bankingContribution, deflectionContribution, bankingContribution, deflectionContribution,
m_lastAngularCorrection, scaledCorrection m_lastAngularVelocity
); );
} }
else else
@ -1124,17 +1127,17 @@ namespace OpenSim.Region.Physics.BulletSPlugin
{ {
Vector3 ret = Vector3.Zero; Vector3 ret = Vector3.Zero;
// If vertical attaction timescale is reasonable and we applied an angular force last time... // If vertical attaction timescale is reasonable
if (m_verticalAttractionTimescale < m_verticalAttractionCutoff) if (m_verticalAttractionTimescale < m_verticalAttractionCutoff)
{ {
// Take a vector pointing up and convert it from world to vehicle relative coords. // Take a vector pointing up and convert it from world to vehicle relative coords.
Vector3 verticalError = Vector3.UnitZ * VehicleOrientation; Vector3 verticalError = Vector3.UnitZ * VehicleOrientation;
verticalError.Normalize();
// If vertical attraction correction is needed, the vector that was pointing up (UnitZ) // If vertical attraction correction is needed, the vector that was pointing up (UnitZ)
// is now leaning to one side (rotated around the X axis) and the Y value will // is now:
// go from zero (nearly straight up) to one (completely to the side) or leaning // leaning to one side: rotated around the X axis with the Y value going
// front-to-back (rotated around the Y axis) and the value of X will be between // from zero (nearly straight up) to one (completely to the side)) or
// leaning front-to-back: rotated around the Y axis with the value of X being between
// zero and one. // zero and one.
// The value of Z is how far the rotation is off with 1 meaning none and 0 being 90 degrees. // The value of Z is how far the rotation is off with 1 meaning none and 0 being 90 degrees.

View File

@ -94,10 +94,10 @@ public sealed class BSLinksetCompound : BSLinkset
} }
// Schedule a refresh to happen after all the other taint processing. // Schedule a refresh to happen after all the other taint processing.
private void ScheduleRebuild() private void ScheduleRebuild(BSPhysObject requestor)
{ {
DetailLog("{0},BSLinksetCompound.Refresh,schedulingRefresh,rebuilding={1}", DetailLog("{0},BSLinksetCompound.Refresh,schedulingRefresh,rebuilding={1}",
LinksetRoot.LocalID, Rebuilding); requestor.LocalID, Rebuilding);
// When rebuilding, it is possible to set properties that would normally require a rebuild. // When rebuilding, it is possible to set properties that would normally require a rebuild.
// If already rebuilding, don't request another rebuild. // If already rebuilding, don't request another rebuild.
if (!Rebuilding) if (!Rebuilding)
@ -124,7 +124,7 @@ public sealed class BSLinksetCompound : BSLinkset
{ {
// The root is going dynamic. Make sure mass is properly set. // The root is going dynamic. Make sure mass is properly set.
m_mass = ComputeLinksetMass(); m_mass = ComputeLinksetMass();
ScheduleRebuild(); ScheduleRebuild(LinksetRoot);
} }
else else
{ {
@ -153,7 +153,7 @@ public sealed class BSLinksetCompound : BSLinkset
DetailLog("{0},BSLinksetCompound.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child)); DetailLog("{0},BSLinksetCompound.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child));
if (IsRoot(child)) if (IsRoot(child))
{ {
ScheduleRebuild(); ScheduleRebuild(LinksetRoot);
} }
else else
{ {
@ -182,7 +182,7 @@ public sealed class BSLinksetCompound : BSLinkset
&& PhysicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition)) && PhysicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition))
{ {
updated.LinksetInfo = null; updated.LinksetInfo = null;
ScheduleRebuild(); ScheduleRebuild(updated);
} }
} }
@ -266,7 +266,7 @@ public sealed class BSLinksetCompound : BSLinkset
DetailLog("{0},BSLinksetCompound.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID); DetailLog("{0},BSLinksetCompound.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID);
// Rebuild the compound shape with the new child shape included // Rebuild the compound shape with the new child shape included
ScheduleRebuild(); ScheduleRebuild(child);
} }
return; return;
} }
@ -294,7 +294,7 @@ public sealed class BSLinksetCompound : BSLinkset
else else
{ {
// Rebuild the compound shape with the child removed // Rebuild the compound shape with the child removed
ScheduleRebuild(); ScheduleRebuild(child);
} }
} }
return; return;

View File

@ -1240,7 +1240,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
(s) => { return s.m_params[0].vehicleAngularDamping; }, (s) => { return s.m_params[0].vehicleAngularDamping; },
(s,p,l,v) => { s.m_params[0].vehicleAngularDamping = v; } ), (s,p,l,v) => { s.m_params[0].vehicleAngularDamping = v; } ),
new ParameterDefn("VehicleScaleAngularVelocityByTimestep", "If true, scale angular turning by timestep", new ParameterDefn("VehicleScaleAngularVelocityByTimestep", "If true, scale angular turning by timestep",
ConfigurationParameters.numericFalse, ConfigurationParameters.numericTrue,
(s,cf,p,v) => { s.VehicleScaleAngularVelocityByTimestep = cf.GetBoolean(p, s.BoolNumeric(v)); }, (s,cf,p,v) => { s.VehicleScaleAngularVelocityByTimestep = cf.GetBoolean(p, s.BoolNumeric(v)); },
(s) => { return s.NumericBool(s.VehicleScaleAngularVelocityByTimestep); }, (s) => { return s.NumericBool(s.VehicleScaleAngularVelocityByTimestep); },
(s,p,l,v) => { s.VehicleScaleAngularVelocityByTimestep = s.BoolNumeric(v); } ), (s,p,l,v) => { s.VehicleScaleAngularVelocityByTimestep = s.BoolNumeric(v); } ),

View File

@ -5,7 +5,7 @@ Eliminate all crashes (DONEish)
Border crossing of physical linkset (DONE) Border crossing of physical linkset (DONE)
Enable vehicle border crossings (at least as poorly as ODE) Enable vehicle border crossings (at least as poorly as ODE)
Avatar created in previous region and not new region when crossing border Avatar created in previous region and not new region when crossing border
Vehicle recreated in new sim at small Z value (offset from root value?) Vehicle recreated in new sim at small Z value (offset from root value?) (DONE)
Calibrate turning radius Calibrate turning radius
limitMotorUp calibration (more down?) limitMotorUp calibration (more down?)
study PID motors (include 'efficiency' implementation study PID motors (include 'efficiency' implementation