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.
// Since the vehicle is demanding this setting, we override Bullet's smoothing
// 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)
@ -702,7 +702,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0)
{
Prim.ForceRotationalVelocity = m_knownRotationalVelocity;
PhysicsScene.PE.SetInterpolationAngularVelocity(Prim.PhysBody, m_knownRotationalVelocity);
// PhysicsScene.PE.SetInterpolationAngularVelocity(Prim.PhysBody, m_knownRotationalVelocity);
}
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.
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
Vector3 linearMotorVelocity = linearMotorCorrection * VehicleOrientation;
Vector3 linearMotorVelocityW = linearMotorCorrectionV * VehicleOrientation;
// If we're a ground vehicle, don't add any upward Z movement
if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != 0)
{
if (linearMotorVelocity.Z > 0f)
linearMotorVelocity.Z = 0f;
if (linearMotorVelocityW.Z > 0f)
linearMotorVelocityW.Z = 0f;
}
// 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}",
Prim.LocalID, VehicleVelocity, linearMotorCorrection, linearMotorVelocity);
Prim.LocalID, VehicleVelocity, linearMotorCorrectionV, linearMotorVelocityW);
}
public void ComputeLinearTerrainHeightCorrection(float pTimestep)
@ -1123,8 +1123,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// a downward raycast to find what is below.
public void ComputeLinearMotorUp(float pTimestep)
{
Vector3 ret = Vector3.Zero;
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
@ -1250,8 +1248,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
private void ComputeAngularTurning(float pTimestep)
{
// The user wants this many radians per second angular change?
Vector3 currentAngular = VehicleRotationalVelocity * Quaternion.Inverse(VehicleOrientation);
Vector3 angularMotorContribution = m_angularMotor.Step(pTimestep, currentAngular);
Vector3 currentAngularV = VehicleRotationalVelocity * Quaternion.Inverse(VehicleOrientation);
Vector3 angularMotorContributionV = m_angularMotor.Step(pTimestep, currentAngularV);
// ==================================================================
// 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?
if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0)
{
angularMotorContribution.X = 0f;
angularMotorContribution.Y = 0f;
angularMotorContributionV.X = 0f;
angularMotorContributionV.Y = 0f;
}
VehicleRotationalVelocity += angularMotorContribution * VehicleOrientation;
VDetailLog("{0}, MoveAngular,angularTurning,angularMotorContrib={1}", Prim.LocalID, angularMotorContribution);
VehicleRotationalVelocity += angularMotorContributionV * VehicleOrientation;
VDetailLog("{0}, MoveAngular,angularTurning,angularMotorContrib={1}", Prim.LocalID, angularMotorContributionV);
}
// 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 (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.
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.
// 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.)
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 < 0f)
{
vertContribution.X += PIOverFour;
vertContributionV.X += PIOverFour;
// vertContribution.Y -= PIOverFour;
}
// 'vertContrbution' is now the necessary angular correction to correct tilt in one second.
// Correction happens over a number of seconds.
Vector3 unscaledContrib = vertContribution; // DEBUG DEBUG
vertContribution /= m_verticalAttractionTimescale;
Vector3 unscaledContrib = vertContributionV; // DEBUG DEBUG
vertContributionV /= m_verticalAttractionTimescale;
VehicleRotationalVelocity += vertContribution * VehicleOrientation;
VehicleRotationalVelocity += vertContributionV * VehicleOrientation;
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)
{
Vector3 deflectContribution = Vector3.Zero;
Vector3 deflectContributionV = Vector3.Zero;
// The direction the vehicle is moving
Vector3 movingDirection = VehicleVelocity;
@ -1363,13 +1361,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// ret = m_angularDeflectionCorrectionMotor(1f, deflectionError);
// Scale the correction by recovery timescale and efficiency
deflectContribution = (-deflectionError) * m_angularDeflectionEfficiency;
deflectContribution /= m_angularDeflectionTimescale;
deflectContributionV = (-deflectionError) * m_angularDeflectionEfficiency;
deflectContributionV /= m_angularDeflectionTimescale;
VehicleRotationalVelocity += deflectContribution * VehicleOrientation;
VehicleRotationalVelocity += deflectContributionV * VehicleOrientation;
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}",
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)
{
Vector3 bankingContribution = Vector3.Zero;
Vector3 bankingContributionV = Vector3.Zero;
// 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
@ -1428,15 +1426,15 @@ namespace OpenSim.Region.Physics.BulletSPlugin
mixedYawAngle = ClampInRange(-20f, mixedYawAngle, 20f);
// 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.
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}",
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;
}
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.
if (PositionDisplacement != OMV.Vector3.Zero)
@ -1636,7 +1636,7 @@ public sealed class BSPrim : BSPhysObject
_acceleration = entprop.Acceleration;
_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.
if (IsPhysical && PositionSanityCheck(true))