BulletSim: remove setting of vehicle InterpolationRotationalVelocity.

This doesn't seem to help the vehicle stability.
Rename vehicle internal variables adding a "V" or "W" so it is clear
when coordinates are vehicle or world relative.
user_profiles
Robert Adams 2013-01-23 14:21:52 -08:00
parent 13182904da
commit a7b810ddee
2 changed files with 34 additions and 36 deletions

View File

@ -690,7 +690,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// Bullet does a bunch of smoothing for changing parameters. // Bullet does a bunch of smoothing for changing parameters.
// Since the vehicle is demanding this setting, we override Bullet's smoothing // Since the vehicle is demanding this setting, we override Bullet's smoothing
// by telling Bullet the value was the same last time. // by telling Bullet the value was the same last time.
PhysicsScene.PE.SetInterpolationLinearVelocity(Prim.PhysBody, m_knownVelocity); // PhysicsScene.PE.SetInterpolationLinearVelocity(Prim.PhysBody, m_knownVelocity);
} }
if ((m_knownChanged & m_knownChangedForce) != 0) if ((m_knownChanged & m_knownChangedForce) != 0)
@ -702,7 +702,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0) if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0)
{ {
Prim.ForceRotationalVelocity = m_knownRotationalVelocity; Prim.ForceRotationalVelocity = m_knownRotationalVelocity;
PhysicsScene.PE.SetInterpolationAngularVelocity(Prim.PhysBody, m_knownRotationalVelocity); // PhysicsScene.PE.SetInterpolationAngularVelocity(Prim.PhysBody, m_knownRotationalVelocity);
} }
if ((m_knownChanged & m_knownChangedRotationalImpulse) != 0) if ((m_knownChanged & m_knownChangedRotationalImpulse) != 0)
@ -963,23 +963,23 @@ namespace OpenSim.Region.Physics.BulletSPlugin
{ {
// Step the motor from the current value. Get the correction needed this step. // Step the motor from the current value. Get the correction needed this step.
Vector3 currentVel = VehicleVelocity * Quaternion.Inverse(VehicleOrientation); Vector3 currentVel = VehicleVelocity * Quaternion.Inverse(VehicleOrientation);
Vector3 linearMotorCorrection = m_linearMotor.Step(pTimestep, currentVel); Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVel);
// Motor is vehicle coordinates. Rotate it to world coordinates // Motor is vehicle coordinates. Rotate it to world coordinates
Vector3 linearMotorVelocity = linearMotorCorrection * VehicleOrientation; Vector3 linearMotorVelocityW = linearMotorCorrectionV * VehicleOrientation;
// If we're a ground vehicle, don't add any upward Z movement // If we're a ground vehicle, don't add any upward Z movement
if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != 0) if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != 0)
{ {
if (linearMotorVelocity.Z > 0f) if (linearMotorVelocityW.Z > 0f)
linearMotorVelocity.Z = 0f; linearMotorVelocityW.Z = 0f;
} }
// Add this correction to the velocity to make it faster/slower. // Add this correction to the velocity to make it faster/slower.
VehicleVelocity += linearMotorVelocity; VehicleVelocity += linearMotorVelocityW;
VDetailLog("{0}, MoveLinear,velocity,vehVel={1},correction={2},force={3}", VDetailLog("{0}, MoveLinear,velocity,vehVel={1},correction={2},force={3}",
Prim.LocalID, VehicleVelocity, linearMotorCorrection, linearMotorVelocity); Prim.LocalID, VehicleVelocity, linearMotorCorrectionV, linearMotorVelocityW);
} }
public void ComputeLinearTerrainHeightCorrection(float pTimestep) public void ComputeLinearTerrainHeightCorrection(float pTimestep)
@ -1123,8 +1123,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// a downward raycast to find what is below. // a downward raycast to find what is below.
public void ComputeLinearMotorUp(float pTimestep) public void ComputeLinearMotorUp(float pTimestep)
{ {
Vector3 ret = Vector3.Zero;
if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0) if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0)
{ {
// This code tries to decide if the object is not on the ground and then pushing down // This code tries to decide if the object is not on the ground and then pushing down
@ -1250,8 +1248,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
private void ComputeAngularTurning(float pTimestep) private void ComputeAngularTurning(float pTimestep)
{ {
// The user wants this many radians per second angular change? // The user wants this many radians per second angular change?
Vector3 currentAngular = VehicleRotationalVelocity * Quaternion.Inverse(VehicleOrientation); Vector3 currentAngularV = VehicleRotationalVelocity * Quaternion.Inverse(VehicleOrientation);
Vector3 angularMotorContribution = m_angularMotor.Step(pTimestep, currentAngular); Vector3 angularMotorContributionV = m_angularMotor.Step(pTimestep, currentAngularV);
// ================================================================== // ==================================================================
// From http://wiki.secondlife.com/wiki/LlSetVehicleFlags : // From http://wiki.secondlife.com/wiki/LlSetVehicleFlags :
@ -1263,12 +1261,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// is a linear effect. Where should this check go? // is a linear effect. Where should this check go?
if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0) if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0)
{ {
angularMotorContribution.X = 0f; angularMotorContributionV.X = 0f;
angularMotorContribution.Y = 0f; angularMotorContributionV.Y = 0f;
} }
VehicleRotationalVelocity += angularMotorContribution * VehicleOrientation; VehicleRotationalVelocity += angularMotorContributionV * VehicleOrientation;
VDetailLog("{0}, MoveAngular,angularTurning,angularMotorContrib={1}", Prim.LocalID, angularMotorContribution); VDetailLog("{0}, MoveAngular,angularTurning,angularMotorContrib={1}", Prim.LocalID, angularMotorContributionV);
} }
// From http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial: // From http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial:
@ -1284,7 +1282,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// If vertical attaction timescale is reasonable // If vertical attaction timescale is reasonable
if (enableAngularVerticalAttraction && m_verticalAttractionTimescale < m_verticalAttractionCutoff) if (enableAngularVerticalAttraction && m_verticalAttractionTimescale < m_verticalAttractionCutoff)
{ {
Vector3 vertContribution = Vector3.Zero; Vector3 vertContributionV = Vector3.Zero;
// 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;
@ -1299,26 +1297,26 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// Y error means needed rotation around X axis and visa versa. // Y error means needed rotation around X axis and visa versa.
// Since the error goes from zero to one, the asin is the corresponding angle. // Since the error goes from zero to one, the asin is the corresponding angle.
vertContribution.X = (float)Math.Asin(verticalError.Y); vertContributionV.X = (float)Math.Asin(verticalError.Y);
// (Tilt forward (positive X) needs to tilt back (rotate negative) around Y axis.) // (Tilt forward (positive X) needs to tilt back (rotate negative) around Y axis.)
vertContribution.Y = -(float)Math.Asin(verticalError.X); vertContributionV.Y = -(float)Math.Asin(verticalError.X);
// If verticalError.Z is negative, the vehicle is upside down. Add additional push. // If verticalError.Z is negative, the vehicle is upside down. Add additional push.
if (verticalError.Z < 0f) if (verticalError.Z < 0f)
{ {
vertContribution.X += PIOverFour; vertContributionV.X += PIOverFour;
// vertContribution.Y -= PIOverFour; // vertContribution.Y -= PIOverFour;
} }
// '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 = vertContribution; // DEBUG DEBUG Vector3 unscaledContrib = vertContributionV; // DEBUG DEBUG
vertContribution /= m_verticalAttractionTimescale; vertContributionV /= m_verticalAttractionTimescale;
VehicleRotationalVelocity += vertContribution * VehicleOrientation; VehicleRotationalVelocity += vertContributionV * VehicleOrientation;
VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},eff={3},ts={4},vertAttr={5}", VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},eff={3},ts={4},vertAttr={5}",
Prim.LocalID, verticalError, unscaledContrib, m_verticalAttractionEfficiency, m_verticalAttractionTimescale, vertContribution); Prim.LocalID, verticalError, unscaledContrib, m_verticalAttractionEfficiency, m_verticalAttractionTimescale, vertContributionV);
} }
} }
@ -1336,7 +1334,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
if (enableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleForwardSpeed > 0.2) if (enableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleForwardSpeed > 0.2)
{ {
Vector3 deflectContribution = Vector3.Zero; Vector3 deflectContributionV = Vector3.Zero;
// The direction the vehicle is moving // The direction the vehicle is moving
Vector3 movingDirection = VehicleVelocity; Vector3 movingDirection = VehicleVelocity;
@ -1363,13 +1361,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// ret = m_angularDeflectionCorrectionMotor(1f, deflectionError); // ret = m_angularDeflectionCorrectionMotor(1f, deflectionError);
// Scale the correction by recovery timescale and efficiency // Scale the correction by recovery timescale and efficiency
deflectContribution = (-deflectionError) * m_angularDeflectionEfficiency; deflectContributionV = (-deflectionError) * m_angularDeflectionEfficiency;
deflectContribution /= m_angularDeflectionTimescale; deflectContributionV /= m_angularDeflectionTimescale;
VehicleRotationalVelocity += deflectContribution * VehicleOrientation; VehicleRotationalVelocity += deflectContributionV * VehicleOrientation;
VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}", VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}",
Prim.LocalID, movingDirection, pointingDirection, deflectionError, deflectContribution); Prim.LocalID, movingDirection, pointingDirection, deflectionError, deflectContributionV);
VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3}", VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3}",
Prim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale); Prim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale);
} }
@ -1410,7 +1408,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
{ {
if (enableAngularBanking && m_bankingEfficiency != 0 && m_verticalAttractionTimescale < m_verticalAttractionCutoff) if (enableAngularBanking && m_bankingEfficiency != 0 && m_verticalAttractionTimescale < m_verticalAttractionCutoff)
{ {
Vector3 bankingContribution = Vector3.Zero; Vector3 bankingContributionV = Vector3.Zero;
// Rotate a UnitZ vector (pointing up) to how the vehicle is oriented. // Rotate a UnitZ vector (pointing up) to how the vehicle is oriented.
// As the vehicle rolls to the right or left, the Y value will increase from // As the vehicle rolls to the right or left, the Y value will increase from
@ -1428,15 +1426,15 @@ namespace OpenSim.Region.Physics.BulletSPlugin
mixedYawAngle = ClampInRange(-20f, mixedYawAngle, 20f); mixedYawAngle = ClampInRange(-20f, mixedYawAngle, 20f);
// Build the force vector to change rotation from what it is to what it should be // Build the force vector to change rotation from what it is to what it should be
bankingContribution.Z = -mixedYawAngle; bankingContributionV.Z = -mixedYawAngle;
// Don't do it all at once. // Don't do it all at once.
bankingContribution /= m_bankingTimescale; bankingContributionV /= m_bankingTimescale;
VehicleRotationalVelocity += bankingContribution * VehicleOrientation; VehicleRotationalVelocity += bankingContributionV * VehicleOrientation;
VDetailLog("{0}, MoveAngular,Banking,rollComp={1},speed={2},rollComp={3},yAng={4},mYAng={5},ret={6}", VDetailLog("{0}, MoveAngular,Banking,rollComp={1},speed={2},rollComp={3},yAng={4},mYAng={5},ret={6}",
Prim.LocalID, rollComponents, VehicleForwardSpeed, rollComponents, yawAngle, mixedYawAngle, bankingContribution); Prim.LocalID, rollComponents, VehicleForwardSpeed, rollComponents, yawAngle, mixedYawAngle, bankingContributionV);
} }
} }

View File

@ -1619,7 +1619,7 @@ public sealed class BSPrim : BSPhysObject
// entprop.RotationalVelocity = OMV.Vector3.Zero; // entprop.RotationalVelocity = OMV.Vector3.Zero;
} }
DetailLog("{0},BSPrim.UpdateProperties,entry,entprop={1}", LocalID, entprop); // DEBUG DEBUG // DetailLog("{0},BSPrim.UpdateProperties,entry,entprop={1}", LocalID, entprop); // DEBUG DEBUG
// Undo any center-of-mass displacement that might have been done. // Undo any center-of-mass displacement that might have been done.
if (PositionDisplacement != OMV.Vector3.Zero) if (PositionDisplacement != OMV.Vector3.Zero)
@ -1636,7 +1636,7 @@ public sealed class BSPrim : BSPhysObject
_acceleration = entprop.Acceleration; _acceleration = entprop.Acceleration;
_rotationalVelocity = entprop.RotationalVelocity; _rotationalVelocity = entprop.RotationalVelocity;
DetailLog("{0},BSPrim.UpdateProperties,afterAssign,entprop={1}", LocalID, entprop); // DEBUG DEBUG // DetailLog("{0},BSPrim.UpdateProperties,afterAssign,entprop={1}", LocalID, entprop); // DEBUG DEBUG
// The sanity check can change the velocity and/or position. // The sanity check can change the velocity and/or position.
if (IsPhysical && PositionSanityCheck(true)) if (IsPhysical && PositionSanityCheck(true))