BulletSim: repair vehicle problems introduced in previous 'improvements'. Fix line endings in BSParams.
parent
ae4d932e7f
commit
6dbf9c8ed4
|
@ -634,28 +634,33 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
m_knownHas = 0;
|
m_knownHas = 0;
|
||||||
m_knownChanged = 0;
|
m_knownChanged = 0;
|
||||||
}
|
}
|
||||||
|
// Push all the changed values back into the physics engine
|
||||||
private void PushKnownChanged()
|
private void PushKnownChanged()
|
||||||
{
|
{
|
||||||
if (m_knownChanged != 0)
|
if (m_knownChanged != 0)
|
||||||
{
|
{
|
||||||
if ((m_knownChanged & m_knownChangedPosition) != 0)
|
if ((m_knownChanged & m_knownChangedPosition) != 0)
|
||||||
Prim.ForcePosition = VehiclePosition;
|
Prim.ForcePosition = m_knownPosition;
|
||||||
|
|
||||||
if ((m_knownChanged & m_knownChangedOrientation) != 0)
|
if ((m_knownChanged & m_knownChangedOrientation) != 0)
|
||||||
Prim.ForceOrientation = VehicleOrientation;
|
Prim.ForceOrientation = m_knownOrientation;
|
||||||
|
|
||||||
if ((m_knownChanged & m_knownChangedVelocity) != 0)
|
if ((m_knownChanged & m_knownChangedVelocity) != 0)
|
||||||
{
|
{
|
||||||
Prim.ForceVelocity = VehicleVelocity;
|
Prim.ForceVelocity = m_knownVelocity;
|
||||||
BulletSimAPI.SetInterpolationLinearVelocity2(Prim.PhysBody.ptr, VehicleVelocity);
|
BulletSimAPI.SetInterpolationLinearVelocity2(Prim.PhysBody.ptr, VehicleVelocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m_knownChanged & m_knownChangedForce) != 0)
|
if ((m_knownChanged & m_knownChangedForce) != 0)
|
||||||
Prim.AddForce((Vector3)m_knownForce, false, true);
|
Prim.AddForce((Vector3)m_knownForce, false, true);
|
||||||
|
|
||||||
if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0)
|
if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0)
|
||||||
{
|
{
|
||||||
Prim.ForceRotationalVelocity = VehicleRotationalVelocity;
|
Prim.ForceRotationalVelocity = m_knownRotationalVelocity;
|
||||||
// Fake out Bullet by making it think the velocity is the same as last time.
|
// Fake out Bullet by making it think the velocity is the same as last time.
|
||||||
BulletSimAPI.SetInterpolationAngularVelocity2(Prim.PhysBody.ptr, VehicleRotationalVelocity);
|
BulletSimAPI.SetInterpolationAngularVelocity2(Prim.PhysBody.ptr, m_knownRotationalVelocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m_knownChanged & m_knownChangedRotationalForce) != 0)
|
if ((m_knownChanged & m_knownChangedRotationalForce) != 0)
|
||||||
Prim.AddAngularForce((Vector3)m_knownRotationalForce, false, true);
|
Prim.AddAngularForce((Vector3)m_knownRotationalForce, false, true);
|
||||||
|
|
||||||
|
@ -667,7 +672,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
}
|
}
|
||||||
|
|
||||||
// Since the computation of terrain height can be a little involved, this routine
|
// Since the computation of terrain height can be a little involved, this routine
|
||||||
// is used ot fetch the height only once for each vehicle simulation step.
|
// is used to fetch the height only once for each vehicle simulation step.
|
||||||
private float GetTerrainHeight(Vector3 pos)
|
private float GetTerrainHeight(Vector3 pos)
|
||||||
{
|
{
|
||||||
if ((m_knownHas & m_knownChangedTerrainHeight) == 0)
|
if ((m_knownHas & m_knownChangedTerrainHeight) == 0)
|
||||||
|
@ -699,12 +704,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
m_knownPosition = Prim.ForcePosition;
|
m_knownPosition = Prim.ForcePosition;
|
||||||
m_knownHas |= m_knownChangedPosition;
|
m_knownHas |= m_knownChangedPosition;
|
||||||
}
|
}
|
||||||
return (Vector3)m_knownPosition;
|
return m_knownPosition;
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
m_knownPosition = value;
|
m_knownPosition = value;
|
||||||
m_knownChanged |= m_knownChangedPosition;
|
m_knownChanged |= m_knownChangedPosition;
|
||||||
|
m_knownHas |= m_knownChangedPosition;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -717,12 +723,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
m_knownOrientation = Prim.ForceOrientation;
|
m_knownOrientation = Prim.ForceOrientation;
|
||||||
m_knownHas |= m_knownChangedOrientation;
|
m_knownHas |= m_knownChangedOrientation;
|
||||||
}
|
}
|
||||||
return (Quaternion)m_knownOrientation;
|
return m_knownOrientation;
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
m_knownOrientation = value;
|
m_knownOrientation = value;
|
||||||
m_knownChanged |= m_knownChangedOrientation;
|
m_knownChanged |= m_knownChangedOrientation;
|
||||||
|
m_knownHas |= m_knownChangedOrientation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -741,13 +748,19 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
{
|
{
|
||||||
m_knownVelocity = value;
|
m_knownVelocity = value;
|
||||||
m_knownChanged |= m_knownChangedVelocity;
|
m_knownChanged |= m_knownChangedVelocity;
|
||||||
|
m_knownHas |= m_knownChangedVelocity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void VehicleAddForce(Vector3 aForce)
|
private void VehicleAddForce(Vector3 aForce)
|
||||||
{
|
{
|
||||||
|
if ((m_knownHas & m_knownChangedForce) == 0)
|
||||||
|
{
|
||||||
|
m_knownForce = Vector3.Zero;
|
||||||
|
}
|
||||||
m_knownForce += aForce;
|
m_knownForce += aForce;
|
||||||
m_knownChanged |= m_knownChangedForce;
|
m_knownChanged |= m_knownChangedForce;
|
||||||
|
m_knownHas |= m_knownChangedForce;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Vector3 VehicleRotationalVelocity
|
private Vector3 VehicleRotationalVelocity
|
||||||
|
@ -765,12 +778,18 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
{
|
{
|
||||||
m_knownRotationalVelocity = value;
|
m_knownRotationalVelocity = value;
|
||||||
m_knownChanged |= m_knownChangedRotationalVelocity;
|
m_knownChanged |= m_knownChangedRotationalVelocity;
|
||||||
|
m_knownHas |= m_knownChangedRotationalVelocity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void VehicleAddAngularForce(Vector3 aForce)
|
private void VehicleAddAngularForce(Vector3 aForce)
|
||||||
{
|
{
|
||||||
|
if ((m_knownHas & m_knownChangedRotationalForce) == 0)
|
||||||
|
{
|
||||||
|
m_knownRotationalForce = Vector3.Zero;
|
||||||
|
}
|
||||||
m_knownRotationalForce += aForce;
|
m_knownRotationalForce += aForce;
|
||||||
m_knownChanged |= m_knownChangedRotationalForce;
|
m_knownChanged |= m_knownChangedRotationalForce;
|
||||||
|
m_knownHas |= m_knownChangedRotationalForce;
|
||||||
}
|
}
|
||||||
// Vehicle relative forward velocity
|
// Vehicle relative forward velocity
|
||||||
private Vector3 VehicleForwardVelocity
|
private Vector3 VehicleForwardVelocity
|
||||||
|
@ -782,7 +801,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
m_knownForwardVelocity = VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation));
|
m_knownForwardVelocity = VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation));
|
||||||
m_knownHas |= m_knownChangedForwardVelocity;
|
m_knownHas |= m_knownChangedForwardVelocity;
|
||||||
}
|
}
|
||||||
return (Vector3)m_knownForwardVelocity;
|
return m_knownForwardVelocity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private float VehicleForwardSpeed
|
private float VehicleForwardSpeed
|
||||||
|
|
|
@ -268,12 +268,14 @@ public class BSPIDVMotor : BSVMotor
|
||||||
public Vector3 proportionFactor { get; set; }
|
public Vector3 proportionFactor { get; set; }
|
||||||
public Vector3 integralFactor { get; set; }
|
public Vector3 integralFactor { get; set; }
|
||||||
public Vector3 derivFactor { get; set; }
|
public Vector3 derivFactor { get; set; }
|
||||||
|
|
||||||
// Arbritrary factor range.
|
// Arbritrary factor range.
|
||||||
// EfficiencyHigh means move quickly to the correct number. EfficiencyLow means might over correct.
|
// EfficiencyHigh means move quickly to the correct number. EfficiencyLow means might over correct.
|
||||||
public float EfficiencyHigh = 0.4f;
|
public float EfficiencyHigh = 0.4f;
|
||||||
public float EfficiencyLow = 4.0f;
|
public float EfficiencyLow = 4.0f;
|
||||||
|
|
||||||
Vector3 IntegralFactor { get; set; }
|
// Running integration of the error
|
||||||
|
Vector3 RunningIntegration { get; set; }
|
||||||
|
|
||||||
public BSPIDVMotor(string useName)
|
public BSPIDVMotor(string useName)
|
||||||
: base(useName)
|
: base(useName)
|
||||||
|
@ -281,7 +283,7 @@ public class BSPIDVMotor : BSVMotor
|
||||||
proportionFactor = new Vector3(1.00f, 1.00f, 1.00f);
|
proportionFactor = new Vector3(1.00f, 1.00f, 1.00f);
|
||||||
integralFactor = new Vector3(1.00f, 1.00f, 1.00f);
|
integralFactor = new Vector3(1.00f, 1.00f, 1.00f);
|
||||||
derivFactor = new Vector3(1.00f, 1.00f, 1.00f);
|
derivFactor = new Vector3(1.00f, 1.00f, 1.00f);
|
||||||
IntegralFactor = Vector3.Zero;
|
RunningIntegration = Vector3.Zero;
|
||||||
LastError = Vector3.Zero;
|
LastError = Vector3.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,14 +314,18 @@ public class BSPIDVMotor : BSVMotor
|
||||||
public override Vector3 Step(float timeStep, Vector3 error)
|
public override Vector3 Step(float timeStep, Vector3 error)
|
||||||
{
|
{
|
||||||
// Add up the error so we can integrate over the accumulated errors
|
// Add up the error so we can integrate over the accumulated errors
|
||||||
IntegralFactor += error * timeStep;
|
RunningIntegration += error * timeStep;
|
||||||
|
|
||||||
// A simple derivitive is the rate of change from the last error.
|
// A simple derivitive is the rate of change from the last error.
|
||||||
Vector3 derivFactor = (error - LastError) * timeStep;
|
Vector3 derivFactor = (error - LastError) * timeStep;
|
||||||
LastError = error;
|
LastError = error;
|
||||||
|
|
||||||
// Correction = -(proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError)
|
// Correction = -(proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError)
|
||||||
Vector3 ret = -(error * proportionFactor + IntegralFactor * integralFactor + derivFactor * derivFactor);
|
Vector3 ret = -(
|
||||||
|
error * proportionFactor
|
||||||
|
+ RunningIntegration * integralFactor
|
||||||
|
+ derivFactor * derivFactor
|
||||||
|
);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) Contributors, http://opensimulator.org/
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
*
|
*
|
||||||
|
@ -136,6 +136,7 @@ public static class BSParam
|
||||||
// A ParameterDefn() takes the following parameters:
|
// A ParameterDefn() takes the following parameters:
|
||||||
// -- the text name of the parameter. This is used for console input and ini file.
|
// -- the text name of the parameter. This is used for console input and ini file.
|
||||||
// -- a short text description of the parameter. This shows up in the console listing.
|
// -- a short text description of the parameter. This shows up in the console listing.
|
||||||
|
// -- a default value (float)
|
||||||
// -- a delegate for fetching the parameter from the ini file.
|
// -- a delegate for fetching the parameter from the ini file.
|
||||||
// Should handle fetching the right type from the ini file and converting it.
|
// Should handle fetching the right type from the ini file and converting it.
|
||||||
// -- a delegate for getting the value as a float
|
// -- a delegate for getting the value as a float
|
||||||
|
@ -148,7 +149,7 @@ public static class BSParam
|
||||||
// o = BSPhysObject
|
// o = BSPhysObject
|
||||||
// p = string parameter name
|
// p = string parameter name
|
||||||
// l = localID of referenced object
|
// l = localID of referenced object
|
||||||
// v = float value
|
// v = value (float)
|
||||||
// cf = parameter configuration class (for fetching values from ini file)
|
// cf = parameter configuration class (for fetching values from ini file)
|
||||||
private static ParameterDefn[] ParameterDefinitions =
|
private static ParameterDefn[] ParameterDefinitions =
|
||||||
{
|
{
|
||||||
|
|
|
@ -864,7 +864,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
|
||||||
{
|
{
|
||||||
DetailLog("{0},BSScene.AssertInTaintTime,NOT IN TAINT TIME,Region={1},Where={2}", DetailLogZero, RegionName, whereFrom);
|
DetailLog("{0},BSScene.AssertInTaintTime,NOT IN TAINT TIME,Region={1},Where={2}", DetailLogZero, RegionName, whereFrom);
|
||||||
m_log.ErrorFormat("{0} NOT IN TAINT TIME!! Region={1}, Where={2}", LogHeader, RegionName, whereFrom);
|
m_log.ErrorFormat("{0} NOT IN TAINT TIME!! Region={1}, Where={2}", LogHeader, RegionName, whereFrom);
|
||||||
Util.PrintCallStack(DetailLog); // Prints the stack into the DEBUG log file.
|
Util.PrintCallStack(DetailLog);
|
||||||
}
|
}
|
||||||
return InTaintTime;
|
return InTaintTime;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue