BulletSim: simplify the initialization of some of the parameters.

Disable vertical attraction for vehicles by default (for the moment).
Fix bug where vehicle would go crazy when velocity got above a
   certain speed.
user_profiles
Robert Adams 2013-01-27 12:48:36 -08:00
parent 26d4596080
commit b546af9ac2
2 changed files with 23 additions and 32 deletions

View File

@ -141,7 +141,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// in changes by making enablement of debugging flags from INI file. // in changes by making enablement of debugging flags from INI file.
public void SetupVehicleDebugging() public void SetupVehicleDebugging()
{ {
enableAngularVerticalAttraction = true; enableAngularVerticalAttraction = false;
enableAngularDeflection = false; enableAngularDeflection = false;
enableAngularBanking = false; enableAngularBanking = false;
if (BSParam.VehicleDebuggingEnabled != ConfigurationParameters.numericFalse) if (BSParam.VehicleDebuggingEnabled != ConfigurationParameters.numericFalse)
@ -803,7 +803,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
m_knownVelocity = Prim.ForceVelocity; m_knownVelocity = Prim.ForceVelocity;
m_knownHas |= m_knownChangedVelocity; m_knownHas |= m_knownChangedVelocity;
} }
return (Vector3)m_knownVelocity; return m_knownVelocity;
} }
set set
{ {
@ -926,6 +926,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// Called after the simulation step // Called after the simulation step
internal void PostStep(float pTimestep) internal void PostStep(float pTimestep)
{ {
if (!IsActive) return;
if (PhysicsScene.VehiclePhysicalLoggingEnabled) if (PhysicsScene.VehiclePhysicalLoggingEnabled)
PhysicsScene.PE.DumpRigidBody(PhysicsScene.World, Prim.PhysBody); PhysicsScene.PE.DumpRigidBody(PhysicsScene.World, Prim.PhysBody);
} }
@ -961,10 +963,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// ================================================================== // ==================================================================
// Clamp high or low velocities // Clamp high or low velocities
float newVelocityLengthSq = VehicleVelocity.LengthSquared(); float newVelocityLengthSq = VehicleVelocity.LengthSquared();
if (newVelocityLengthSq > BSParam.VehicleMaxLinearVelocity) if (newVelocityLengthSq > BSParam.VehicleMaxLinearVelocitySq)
{ {
Vector3 origVelW = VehicleVelocity; // DEBUG DEBUG
VehicleVelocity /= VehicleVelocity.Length(); VehicleVelocity /= VehicleVelocity.Length();
VehicleVelocity *= BSParam.VehicleMaxLinearVelocity; VehicleVelocity *= BSParam.VehicleMaxLinearVelocity;
VDetailLog("{0}, MoveLinear,clampMax,origVelW={1},lenSq={2},maxVelSq={3},,newVelW={4}",
Prim.LocalID, origVelW, newVelocityLengthSq, BSParam.VehicleMaxLinearVelocitySq, VehicleVelocity);
} }
else if (newVelocityLengthSq < 0.001f) else if (newVelocityLengthSq < 0.001f)
VehicleVelocity = Vector3.Zero; VehicleVelocity = Vector3.Zero;
@ -1301,6 +1306,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
if (enableAngularVerticalAttraction && m_verticalAttractionTimescale < m_verticalAttractionCutoff) if (enableAngularVerticalAttraction && m_verticalAttractionTimescale < m_verticalAttractionCutoff)
{ {
Vector3 vertContributionV = Vector3.Zero; Vector3 vertContributionV = Vector3.Zero;
Vector3 origRotVelW = VehicleRotationalVelocity; // DEBUG DEBUG
// 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;
@ -1328,13 +1334,14 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// 'vertContrbution' is now the necessary angular correction to correct tilt in one second. // 'vertContrbution' is now the necessary angular correction to correct tilt in one second.
// Correction happens over a number of seconds. // Correction happens over a number of seconds.
Vector3 unscaledContrib = vertContributionV; // DEBUG DEBUG Vector3 unscaledContribVerticalErrorV = vertContributionV; // DEBUG DEBUG
vertContributionV /= m_verticalAttractionTimescale; vertContributionV /= m_verticalAttractionTimescale;
VehicleRotationalVelocity += vertContributionV * VehicleOrientation; VehicleRotationalVelocity += vertContributionV * VehicleOrientation;
VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},eff={3},ts={4},vertAttr={5}", VDetailLog("{0}, MoveAngular,verticalAttraction,,origRotVW={1},vertError={2},unscaledV={3},eff={4},ts={5},vertContribV={6}",
Prim.LocalID, verticalError, unscaledContrib, m_verticalAttractionEfficiency, m_verticalAttractionTimescale, vertContributionV); Prim.LocalID, origRotVelW, verticalError, unscaledContribVerticalErrorV,
m_verticalAttractionEfficiency, m_verticalAttractionTimescale, vertContributionV);
} }
} }

View File

@ -84,32 +84,16 @@ public static class BSParam
// Vehicle parameters // Vehicle parameters
public static float VehicleMaxLinearVelocity { get; private set; } public static float VehicleMaxLinearVelocity { get; private set; }
public static float VehicleMaxLinearVelocitySq { get; private set; }
public static float VehicleMaxAngularVelocity { get; private set; } public static float VehicleMaxAngularVelocity { get; private set; }
public static float VehicleMaxAngularVelocitySq { get; private set; }
public static float VehicleAngularDamping { get; private set; } public static float VehicleAngularDamping { get; private set; }
public static float VehicleFriction { get; private set; } public static float VehicleFriction { get; private set; }
public static float VehicleRestitution { get; private set; } public static float VehicleRestitution { get; private set; }
public static float VehicleLinearFactor { get; private set; } public static float VehicleLinearFactor { get; private set; }
private static Vector3? vehicleLinearFactorV; public static Vector3 VehicleLinearFactorV { get; private set; }
public static Vector3 VehicleLinearFactorV
{
get
{
if (!vehicleLinearFactorV.HasValue)
vehicleLinearFactorV = new Vector3(VehicleLinearFactor, VehicleLinearFactor, VehicleLinearFactor);
return (Vector3)vehicleLinearFactorV;
}
}
public static float VehicleAngularFactor { get; private set; } public static float VehicleAngularFactor { get; private set; }
private static Vector3? vehicleAngularFactorV; public static Vector3 VehicleAngularFactorV { get; private set; }
public static Vector3 VehicleAngularFactorV
{
get
{
if (!vehicleAngularFactorV.HasValue)
vehicleAngularFactorV = new Vector3(VehicleAngularFactor, VehicleAngularFactor, VehicleAngularFactor);
return (Vector3)vehicleAngularFactorV;
}
}
public static float VehicleGroundGravityFudge { get; private set; } public static float VehicleGroundGravityFudge { get; private set; }
public static float VehicleDebuggingEnabled { get; private set; } public static float VehicleDebuggingEnabled { get; private set; }
@ -469,12 +453,12 @@ public static class BSParam
1000.0f, 1000.0f,
(s,cf,p,v) => { VehicleMaxLinearVelocity = cf.GetFloat(p, v); }, (s,cf,p,v) => { VehicleMaxLinearVelocity = cf.GetFloat(p, v); },
(s) => { return (float)VehicleMaxLinearVelocity; }, (s) => { return (float)VehicleMaxLinearVelocity; },
(s,p,l,v) => { VehicleMaxLinearVelocity = v; } ), (s,p,l,v) => { VehicleMaxLinearVelocity = v; VehicleMaxLinearVelocitySq = v * v; } ),
new ParameterDefn("VehicleMaxAngularVelocity", "Maximum rotational velocity magnitude that can be assigned to a vehicle", new ParameterDefn("VehicleMaxAngularVelocity", "Maximum rotational velocity magnitude that can be assigned to a vehicle",
12.0f, 12.0f,
(s,cf,p,v) => { VehicleMaxAngularVelocity = cf.GetFloat(p, v); }, (s,cf,p,v) => { VehicleMaxAngularVelocity = cf.GetFloat(p, v); },
(s) => { return (float)VehicleMaxAngularVelocity; }, (s) => { return (float)VehicleMaxAngularVelocity; },
(s,p,l,v) => { VehicleMaxAngularVelocity = v; } ), (s,p,l,v) => { VehicleMaxAngularVelocity = v; VehicleMaxAngularVelocitySq = v * v; } ),
new ParameterDefn("VehicleAngularDamping", "Factor to damp vehicle angular movement per second (0.0 - 1.0)", new ParameterDefn("VehicleAngularDamping", "Factor to damp vehicle angular movement per second (0.0 - 1.0)",
0.0f, 0.0f,
(s,cf,p,v) => { VehicleAngularDamping = cf.GetFloat(p, v); }, (s,cf,p,v) => { VehicleAngularDamping = cf.GetFloat(p, v); },
@ -484,24 +468,24 @@ public static class BSParam
1.0f, 1.0f,
(s,cf,p,v) => { VehicleLinearFactor = cf.GetFloat(p, v); }, (s,cf,p,v) => { VehicleLinearFactor = cf.GetFloat(p, v); },
(s) => { return VehicleLinearFactor; }, (s) => { return VehicleLinearFactor; },
(s,p,l,v) => { VehicleLinearFactor = v; } ), (s,p,l,v) => { VehicleLinearFactor = v; VehicleLinearFactorV = new Vector3(v, v, v); } ),
new ParameterDefn("VehicleAngularFactor", "Fraction of physical angular changes applied to vehicle (0.0 - 1.0)", new ParameterDefn("VehicleAngularFactor", "Fraction of physical angular changes applied to vehicle (0.0 - 1.0)",
1.0f, 1.0f,
(s,cf,p,v) => { VehicleAngularFactor = cf.GetFloat(p, v); }, (s,cf,p,v) => { VehicleAngularFactor = cf.GetFloat(p, v); },
(s) => { return VehicleAngularFactor; }, (s) => { return VehicleAngularFactor; },
(s,p,l,v) => { VehicleAngularFactor = v; } ), (s,p,l,v) => { VehicleAngularFactor = v; VehicleAngularFactorV = new Vector3(v, v, v); } ),
new ParameterDefn("VehicleFriction", "Friction of vehicle on the ground (0.0 - 1.0)", new ParameterDefn("VehicleFriction", "Friction of vehicle on the ground (0.0 - 1.0)",
0.0f, 0.0f,
(s,cf,p,v) => { VehicleFriction = cf.GetFloat(p, v); }, (s,cf,p,v) => { VehicleFriction = cf.GetFloat(p, v); },
(s) => { return VehicleFriction; }, (s) => { return VehicleFriction; },
(s,p,l,v) => { VehicleFriction = v; } ), (s,p,l,v) => { VehicleFriction = v; } ),
new ParameterDefn("VehicleRestitution", "Bouncyness factor for vehicles (0.0 - 1.0)", new ParameterDefn("VehicleRestitution", "Bouncyness factor for vehicles (0.0 - 1.0)",
0.2f, 0.0f,
(s,cf,p,v) => { VehicleRestitution = cf.GetFloat(p, v); }, (s,cf,p,v) => { VehicleRestitution = cf.GetFloat(p, v); },
(s) => { return VehicleRestitution; }, (s) => { return VehicleRestitution; },
(s,p,l,v) => { VehicleRestitution = v; } ), (s,p,l,v) => { VehicleRestitution = v; } ),
new ParameterDefn("VehicleGroundGravityFudge", "Factor to multiple gravity if a ground vehicle is probably on the ground (0.0 - 1.0)", new ParameterDefn("VehicleGroundGravityFudge", "Factor to multiple gravity if a ground vehicle is probably on the ground (0.0 - 1.0)",
1.0f, 0.2f,
(s,cf,p,v) => { VehicleGroundGravityFudge = cf.GetFloat(p, v); }, (s,cf,p,v) => { VehicleGroundGravityFudge = cf.GetFloat(p, v); },
(s) => { return VehicleGroundGravityFudge; }, (s) => { return VehicleGroundGravityFudge; },
(s,p,l,v) => { VehicleGroundGravityFudge = v; } ), (s,p,l,v) => { VehicleGroundGravityFudge = v; } ),