BulletSim: small change to add position correction force with AddForce rather than just storing it in the variable
parent
22d5bf8ff9
commit
9a42405944
|
@ -518,13 +518,18 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
{
|
{
|
||||||
if (IsActive)
|
if (IsActive)
|
||||||
{
|
{
|
||||||
|
VDetailLog("{0},BSDynamics.Refresh", Prim.LocalID);
|
||||||
|
m_vehicleMass = Prim.Linkset.LinksetMass;
|
||||||
|
|
||||||
// Friction effects are handled by this vehicle code
|
// Friction effects are handled by this vehicle code
|
||||||
BulletSimAPI.SetFriction2(Prim.PhysBody.ptr, 0f);
|
BulletSimAPI.SetFriction2(Prim.PhysBody.ptr, 0f);
|
||||||
BulletSimAPI.SetHitFraction2(Prim.PhysBody.ptr, 0f);
|
BulletSimAPI.SetHitFraction2(Prim.PhysBody.ptr, 0f);
|
||||||
|
|
||||||
// BulletSimAPI.SetAngularDamping2(Prim.PhysBody.ptr, 0.8f);
|
BulletSimAPI.SetAngularDamping2(Prim.PhysBody.ptr, 0.8f);
|
||||||
|
|
||||||
|
BulletSimAPI.SetMassProps2(Prim.PhysBody.ptr, m_vehicleMass, new Vector3(1f, 1f, 1f));
|
||||||
|
|
||||||
|
|
||||||
VDetailLog("{0},BSDynamics.Refresh,zeroingFriction and adding damping", Prim.LocalID);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -560,8 +565,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// m_lastLinearVelocityVector = Prim.ForceVelocity * Quaternion.Inverse(Prim.ForceOrientation); // DEBUG:
|
// m_lastLinearVelocityVector = Prim.ForceVelocity * Quaternion.Inverse(Prim.ForceOrientation); // DEBUG:
|
||||||
// END DEBUG
|
// END DEBUG
|
||||||
|
|
||||||
m_vehicleMass = Prim.Linkset.LinksetMass;
|
|
||||||
|
|
||||||
MoveLinear(pTimestep);
|
MoveLinear(pTimestep);
|
||||||
// Commented out for debug
|
// Commented out for debug
|
||||||
MoveAngular(pTimestep);
|
MoveAngular(pTimestep);
|
||||||
|
@ -650,6 +653,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// if (rotatedSize.Z < terrainHeight)
|
// if (rotatedSize.Z < terrainHeight)
|
||||||
if (pos.Z < terrainHeight)
|
if (pos.Z < terrainHeight)
|
||||||
{
|
{
|
||||||
|
// TODO: correct position by applying force rather than forcing position.
|
||||||
pos.Z = terrainHeight + 2;
|
pos.Z = terrainHeight + 2;
|
||||||
Prim.ForcePosition = pos;
|
Prim.ForcePosition = pos;
|
||||||
VDetailLog("{0},MoveLinear,terrainHeight,terrainHeight={1},pos={2}", Prim.LocalID, terrainHeight, pos);
|
VDetailLog("{0},MoveLinear,terrainHeight,terrainHeight={1},pos={2}", Prim.LocalID, terrainHeight, pos);
|
||||||
|
@ -810,9 +814,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
private void MoveAngular(float pTimestep)
|
private void MoveAngular(float pTimestep)
|
||||||
{
|
{
|
||||||
// m_angularMotorDirection // angular velocity requested by LSL motor
|
// m_angularMotorDirection // angular velocity requested by LSL motor
|
||||||
// m_angularMotorApply // application frame counter
|
|
||||||
// m_angularMotorVelocity // current angular motor velocity (ramps up and down)
|
// m_angularMotorVelocity // current angular motor velocity (ramps up and down)
|
||||||
// m_angularMotorTimescale // motor angular velocity ramp up rate
|
// m_angularMotorTimescale // motor angular velocity ramp up time
|
||||||
// m_angularMotorDecayTimescale // motor angular velocity decay rate
|
// m_angularMotorDecayTimescale // motor angular velocity decay rate
|
||||||
// m_angularFrictionTimescale // body angular velocity decay rate
|
// m_angularFrictionTimescale // body angular velocity decay rate
|
||||||
// m_lastAngularVelocity // what was last applied to body
|
// m_lastAngularVelocity // what was last applied to body
|
||||||
|
@ -847,7 +850,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
{
|
{
|
||||||
float VAservo = pTimestep * 0.2f / m_verticalAttractionTimescale;
|
float VAservo = pTimestep * 0.2f / m_verticalAttractionTimescale;
|
||||||
if (Prim.IsColliding)
|
if (Prim.IsColliding)
|
||||||
VAservo = pTimestep * 0.05f / (m_verticalAttractionTimescale);
|
VAservo = pTimestep * 0.05f / m_verticalAttractionTimescale;
|
||||||
|
|
||||||
VAservo *= (m_verticalAttractionEfficiency * m_verticalAttractionEfficiency);
|
VAservo *= (m_verticalAttractionEfficiency * m_verticalAttractionEfficiency);
|
||||||
|
|
||||||
|
@ -925,6 +928,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
float mix = Math.Abs(m_bankingMix);
|
float mix = Math.Abs(m_bankingMix);
|
||||||
if (m_angularMotorVelocity.X == 0)
|
if (m_angularMotorVelocity.X == 0)
|
||||||
{
|
{
|
||||||
|
// The vehicle is stopped
|
||||||
/*if (!parent.Orientation.ApproxEquals(this.m_referenceFrame, 0.25f))
|
/*if (!parent.Orientation.ApproxEquals(this.m_referenceFrame, 0.25f))
|
||||||
{
|
{
|
||||||
Vector3 axisAngle;
|
Vector3 axisAngle;
|
||||||
|
@ -938,9 +942,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
banking.Z += (effSquared*(mult*mix))*(m_angularMotorVelocity.X) * 4;
|
{
|
||||||
|
banking.Z += (effSquared * (mult * mix)) * (m_angularMotorVelocity.X) * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
//If they are colliding, we probably shouldn't shove the prim around... probably
|
||||||
if (!Prim.IsColliding && Math.Abs(m_angularMotorVelocity.X) > mix)
|
if (!Prim.IsColliding && Math.Abs(m_angularMotorVelocity.X) > mix)
|
||||||
//If they are colliding, we probably shouldn't shove the prim around... probably
|
|
||||||
{
|
{
|
||||||
float angVelZ = m_angularMotorVelocity.X*-1;
|
float angVelZ = m_angularMotorVelocity.X*-1;
|
||||||
/*if(angVelZ > mix)
|
/*if(angVelZ > mix)
|
||||||
|
@ -957,8 +964,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
banking += bankingRot;
|
banking += bankingRot;
|
||||||
}
|
}
|
||||||
m_angularMotorVelocity.X *= m_bankingEfficiency == 1 ? 0.0f : 1 - m_bankingEfficiency;
|
m_angularMotorVelocity.X *= m_bankingEfficiency == 1 ? 0.0f : 1 - m_bankingEfficiency;
|
||||||
VDetailLog("{0},MoveAngular,Banking,bEff={1},angMotVel={2},banking={3}",
|
VDetailLog("{0},MoveAngular,Banking,bEff={1},angMotVel={2},effSq={3},mult={4},mix={5},banking={6}",
|
||||||
Prim.LocalID, m_bankingEfficiency, m_angularMotorVelocity, banking);
|
Prim.LocalID, m_bankingEfficiency, m_angularMotorVelocity, effSquared, mult, mix, banking);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -342,13 +342,12 @@ public sealed class BSPrim : BSPhysObject
|
||||||
// TODO: check for out of bounds
|
// TODO: check for out of bounds
|
||||||
|
|
||||||
// The above code computes a force to apply to correct any out-of-bounds problems. Apply same.
|
// The above code computes a force to apply to correct any out-of-bounds problems. Apply same.
|
||||||
|
// TODO: This should be intergrated with a geneal physics action mechanism.
|
||||||
|
// TODO: This should be moderated with PID'ness.
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
PhysicsScene.TaintedObject(inTaintTime, "BSPrim.PositionSanityCheck:belowTerrain", delegate()
|
// Apply upforce and overcome gravity.
|
||||||
{
|
AddForce(upForce - PhysicsScene.DefaultGravity, false, inTaintTime);
|
||||||
// Apply upforce and overcome gravity.
|
|
||||||
ForceVelocity = ForceVelocity + upForce - PhysicsScene.DefaultGravity;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue