BulletSim: Vehicle angular vertical attraction works. Other vehicle angular forces commented out for the moment for debugging.

0.7.5-pf-bulletsim
Robert Adams 2012-12-05 09:27:38 -08:00
parent f1d4e8f792
commit e599a8b242
2 changed files with 37 additions and 19 deletions

View File

@ -620,11 +620,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
private Vector3? m_knownVelocity;
private Quaternion? m_knownOrientation;
private Vector3? m_knownRotationalVelocity;
private Vector3? m_knownRotationalForce;
private const int m_knownChangedPosition = 1 << 0;
private const int m_knownChangedVelocity = 1 << 1;
private const int m_knownChangedOrientation = 1 << 2;
private const int m_knownChangedRotationalVelocity = 1 << 3;
private const int m_knownChangedRotationalForce = 1 << 4;
private void ForgetKnownVehicleProperties()
{
@ -634,6 +636,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
m_knownVelocity = null;
m_knownOrientation = null;
m_knownRotationalVelocity = null;
m_knownRotationalForce = null;
m_knownChanged = 0;
}
private void PushKnownChanged()
@ -645,12 +648,19 @@ namespace OpenSim.Region.Physics.BulletSPlugin
if ((m_knownChanged & m_knownChangedOrientation) != 0)
Prim.ForceOrientation = VehicleOrientation;
if ((m_knownChanged & m_knownChangedVelocity) != 0)
{
Prim.ForceVelocity = VehicleVelocity;
BulletSimAPI.SetInterpolationLinearVelocity2(Prim.PhysBody.ptr, VehicleVelocity);
}
if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0)
{
Prim.ForceRotationalVelocity = VehicleRotationalVelocity;
// Fake out Bullet by making it think the velocity is the same as last time.
BulletSimAPI.SetInterpolationAngularVelocity2(Prim.PhysBody.ptr, VehicleRotationalVelocity);
}
if ((m_knownChanged & m_knownChangedRotationalForce) != 0)
Prim.AddAngularForce((Vector3)m_knownRotationalForce, false, true);
// If we set one of the values (ie, the physics engine didn't do it) we must force
// an UpdateProperties event to send the changes up to the simulator.
BulletSimAPI.PushUpdate2(Prim.PhysBody.ptr);
@ -734,6 +744,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
m_knownChanged |= m_knownChangedRotationalVelocity;
}
}
private void VehicleAddAngularForce(Vector3 aForce)
{
m_knownRotationalForce += aForce;
m_knownChanged |= m_knownChangedRotationalForce;
}
#endregion // Known vehicle value functions
// One step of the vehicle properties for the next 'pTimestep' seconds.
@ -1013,11 +1028,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
+ bankingContribution;
// ==================================================================
// The correction is applied to the current orientation.
// Apply the correction velocity.
// TODO: Should this be applied as an angular force (torque)?
if (!m_lastAngularCorrection.ApproxEquals(Vector3.Zero, 0.01f))
{
Vector3 scaledCorrection = m_lastAngularCorrection * pTimestep;
VehicleRotationalVelocity = scaledCorrection;
VDetailLog("{0}, MoveAngular,done,nonZero,angMotorContrib={1},vertAttrContrib={2},bankContrib={3},deflectContrib={4},totalContrib={5},scaledCorr={6}",
@ -1029,7 +1044,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
}
else
{
// The vehicle is not adding anything velocity wise.
// The vehicle is not adding anything angular wise.
VehicleRotationalVelocity = Vector3.Zero;
VDetailLog("{0}, MoveAngular,done,zero", Prim.LocalID);
}
@ -1060,8 +1075,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
torqueFromOffset.Y = 0;
if (float.IsNaN(torqueFromOffset.Z))
torqueFromOffset.Z = 0;
torqueFromOffset *= m_vehicleMass;
Prim.ApplyTorqueImpulse(torqueFromOffset, true);
VehicleAddAngularForce(torqueFromOffset * m_vehicleMass);
VDetailLog("{0}, BSDynamic.MoveAngular,motorOffset,applyTorqueImpulse={1}", Prim.LocalID, torqueFromOffset);
}
@ -1097,23 +1112,21 @@ namespace OpenSim.Region.Physics.BulletSPlugin
ret.Y = - verticalError.X;
ret.Z = 0f;
// scale by the time scale and timestep
// 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 clampedZError = ClampInRange(0.1f, Math.Abs(verticalError.Z), 1f);
float clampedSqrZError = ClampInRange(0.01f, verticalError.Z * verticalError.Z, 1f);
// float vertForce = 1f / clampedSqrZError * m_verticalAttractionEfficiency;
float vertForce = 1f / clampedSqrZError;
ret *= vertForce;
// Correction happens over a number of seconds.
Vector3 unscaledContrib = ret;
ret /= m_verticalAttractionTimescale;
// This returns the angular correction desired. Timestep is added later.
// ret *= pTimestep;
// apply efficiency
Vector3 preEfficiencyContrib = ret;
// TODO: implement efficiency.
// Effenciency squared seems to give a more realistic effect
float efficencySquared = m_verticalAttractionEfficiency * m_verticalAttractionEfficiency;
// ret *= efficencySquared;
VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},preEff={3},eff={4},effSq={5},vertAttr={6}",
Prim.LocalID, verticalError, unscaledContrib, preEfficiencyContrib,
m_verticalAttractionEfficiency, efficencySquared,
ret);
VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},vertForce={3},eff={4},vertAttr={5}",
Prim.LocalID, verticalError, unscaledContrib, vertForce, m_verticalAttractionEfficiency, ret);
}
return ret;
}
@ -1123,6 +1136,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
public Vector3 ComputeAngularDeflection()
{
Vector3 ret = Vector3.Zero;
return ret; // DEBUG DEBUG DEBUG debug the other contributors first
if (m_angularDeflectionEfficiency != 0)
{
@ -1151,6 +1165,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
{
Vector3 ret = Vector3.Zero;
Vector3 computedBanking = Vector3.Zero;
return ret; // DEBUG DEBUG DEBUG debug the other contributors first
if (m_bankingEfficiency != 0)
{

View File

@ -1010,6 +1010,9 @@ public sealed class BSPrim : BSPhysObject
});
}
// A torque impulse.
// ApplyTorqueImpulse adds torque directly to the angularVelocity.
// AddAngularForce accumulates the force and applied it to the angular velocity all at once.
// Computed as: angularVelocity += impulse * inertia;
public void ApplyTorqueImpulse(OMV.Vector3 impulse, bool inTaintTime)
{
OMV.Vector3 applyImpulse = impulse;