diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs index 34a87c6..8781fe9 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs | |||
@@ -268,12 +268,14 @@ public class BSPIDVMotor : BSVMotor | |||
268 | public Vector3 proportionFactor { get; set; } | 268 | public Vector3 proportionFactor { get; set; } |
269 | public Vector3 integralFactor { get; set; } | 269 | public Vector3 integralFactor { get; set; } |
270 | public Vector3 derivFactor { get; set; } | 270 | public Vector3 derivFactor { get; set; } |
271 | |||
271 | // Arbritrary factor range. | 272 | // Arbritrary factor range. |
272 | // EfficiencyHigh means move quickly to the correct number. EfficiencyLow means might over correct. | 273 | // EfficiencyHigh means move quickly to the correct number. EfficiencyLow means might over correct. |
273 | public float EfficiencyHigh = 0.4f; | 274 | public float EfficiencyHigh = 0.4f; |
274 | public float EfficiencyLow = 4.0f; | 275 | public float EfficiencyLow = 4.0f; |
275 | 276 | ||
276 | Vector3 IntegralFactor { get; set; } | 277 | // Running integration of the error |
278 | Vector3 RunningIntegration { get; set; } | ||
277 | 279 | ||
278 | public BSPIDVMotor(string useName) | 280 | public BSPIDVMotor(string useName) |
279 | : base(useName) | 281 | : base(useName) |
@@ -281,7 +283,7 @@ public class BSPIDVMotor : BSVMotor | |||
281 | proportionFactor = new Vector3(1.00f, 1.00f, 1.00f); | 283 | proportionFactor = new Vector3(1.00f, 1.00f, 1.00f); |
282 | integralFactor = new Vector3(1.00f, 1.00f, 1.00f); | 284 | integralFactor = new Vector3(1.00f, 1.00f, 1.00f); |
283 | derivFactor = new Vector3(1.00f, 1.00f, 1.00f); | 285 | derivFactor = new Vector3(1.00f, 1.00f, 1.00f); |
284 | IntegralFactor = Vector3.Zero; | 286 | RunningIntegration = Vector3.Zero; |
285 | LastError = Vector3.Zero; | 287 | LastError = Vector3.Zero; |
286 | } | 288 | } |
287 | 289 | ||
@@ -312,14 +314,18 @@ public class BSPIDVMotor : BSVMotor | |||
312 | public override Vector3 Step(float timeStep, Vector3 error) | 314 | public override Vector3 Step(float timeStep, Vector3 error) |
313 | { | 315 | { |
314 | // Add up the error so we can integrate over the accumulated errors | 316 | // Add up the error so we can integrate over the accumulated errors |
315 | IntegralFactor += error * timeStep; | 317 | RunningIntegration += error * timeStep; |
316 | 318 | ||
317 | // A simple derivitive is the rate of change from the last error. | 319 | // A simple derivitive is the rate of change from the last error. |
318 | Vector3 derivFactor = (error - LastError) * timeStep; | 320 | Vector3 derivFactor = (error - LastError) * timeStep; |
319 | LastError = error; | 321 | LastError = error; |
320 | 322 | ||
321 | // Correction = -(proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError) | 323 | // Correction = -(proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError) |
322 | Vector3 ret = -(error * proportionFactor + IntegralFactor * integralFactor + derivFactor * derivFactor); | 324 | Vector3 ret = -( |
325 | error * proportionFactor | ||
326 | + RunningIntegration * integralFactor | ||
327 | + derivFactor * derivFactor | ||
328 | ); | ||
323 | 329 | ||
324 | return ret; | 330 | return ret; |
325 | } | 331 | } |