BulletSim: improve angularVerticalAttraction calculation to compute angular correction velocity rather than estimating correction (excuse to use trig functions).

0.7.5-pf-bulletsim
Robert Adams 2012-12-18 23:05:59 -08:00
parent 7b84bcfbb8
commit a9b9c0f035
1 changed files with 15 additions and 18 deletions

View File

@ -1003,7 +1003,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// Not colliding if the vehicle is off the ground // Not colliding if the vehicle is off the ground
if (!Prim.IsColliding) if (!Prim.IsColliding)
{ {
// downForce = new Vector3(0, 0, (-distanceAboveGround / m_bankingTimescale) * pTimestep);
// downForce = new Vector3(0, 0, -distanceAboveGround / m_bankingTimescale); // downForce = new Vector3(0, 0, -distanceAboveGround / m_bankingTimescale);
ret = new Vector3(0, 0, -distanceAboveGround); ret = new Vector3(0, 0, -distanceAboveGround);
} }
@ -1135,31 +1134,30 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// 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.
// 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.
ret.X = (float)Math.Asin(verticalError.Y);
ret.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)
{ {
verticalError.X = 2f - verticalError.X; ret.X += (float)Math.PI / 4f;
verticalError.Y = 2f - verticalError.Y; ret.Y += (float)Math.PI / 4f;
} }
// Y error means needed rotation around X axis and visa versa. // Put the signs back on so the rotation is in the correct direction.
ret.X = verticalError.Y; ret.X *= (float)Math.Sign(verticalError.Y);
ret.Y = - verticalError.X; // (Tilt forward (positive X) needs to tilt back (rotate negative) around Y axis.)
ret.Z = 0f; ret.Y *= -(float)Math.Sign(verticalError.X);
// Scale the correction force by how far we're off from vertical.
// Z error of one says little error. As Z gets smaller, the vehicle is leaning farther over.
float clampedSqrZError = ClampInRange(0.01f, verticalError.Z * verticalError.Z, 1f);
float vertForce = 1f / clampedSqrZError;
ret *= vertForce;
// 'ret' is now the necessary velocity to correct tilt in one second.
// Correction happens over a number of seconds. // Correction happens over a number of seconds.
Vector3 unscaledContrib = ret; Vector3 unscaledContrib = ret;
ret /= m_verticalAttractionTimescale; ret /= m_verticalAttractionTimescale;
VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},vertForce={3},eff={4},vertAttr={5}", VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},eff={3},vertAttr={4}",
Prim.LocalID, verticalError, unscaledContrib, vertForce, m_verticalAttractionEfficiency, ret); Prim.LocalID, verticalError, unscaledContrib, m_verticalAttractionEfficiency, ret);
} }
return ret; return ret;
} }
@ -1172,7 +1170,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
public Vector3 ComputeAngularDeflection() public Vector3 ComputeAngularDeflection()
{ {
Vector3 ret = Vector3.Zero; Vector3 ret = Vector3.Zero;
return ret; // DEBUG DEBUG DEBUG debug one force at a time
if (m_angularDeflectionEfficiency != 0) if (m_angularDeflectionEfficiency != 0)
{ {