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.
parent
021623a17d
commit
11532a4390
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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); } ),
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue