diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 55 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 3 |
2 files changed, 38 insertions, 20 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index be8a502..a83d966 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -620,11 +620,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
620 | private Vector3? m_knownVelocity; | 620 | private Vector3? m_knownVelocity; |
621 | private Quaternion? m_knownOrientation; | 621 | private Quaternion? m_knownOrientation; |
622 | private Vector3? m_knownRotationalVelocity; | 622 | private Vector3? m_knownRotationalVelocity; |
623 | private Vector3? m_knownRotationalForce; | ||
623 | 624 | ||
624 | private const int m_knownChangedPosition = 1 << 0; | 625 | private const int m_knownChangedPosition = 1 << 0; |
625 | private const int m_knownChangedVelocity = 1 << 1; | 626 | private const int m_knownChangedVelocity = 1 << 1; |
626 | private const int m_knownChangedOrientation = 1 << 2; | 627 | private const int m_knownChangedOrientation = 1 << 2; |
627 | private const int m_knownChangedRotationalVelocity = 1 << 3; | 628 | private const int m_knownChangedRotationalVelocity = 1 << 3; |
629 | private const int m_knownChangedRotationalForce = 1 << 4; | ||
628 | 630 | ||
629 | private void ForgetKnownVehicleProperties() | 631 | private void ForgetKnownVehicleProperties() |
630 | { | 632 | { |
@@ -634,6 +636,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
634 | m_knownVelocity = null; | 636 | m_knownVelocity = null; |
635 | m_knownOrientation = null; | 637 | m_knownOrientation = null; |
636 | m_knownRotationalVelocity = null; | 638 | m_knownRotationalVelocity = null; |
639 | m_knownRotationalForce = null; | ||
637 | m_knownChanged = 0; | 640 | m_knownChanged = 0; |
638 | } | 641 | } |
639 | private void PushKnownChanged() | 642 | private void PushKnownChanged() |
@@ -645,12 +648,19 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
645 | if ((m_knownChanged & m_knownChangedOrientation) != 0) | 648 | if ((m_knownChanged & m_knownChangedOrientation) != 0) |
646 | Prim.ForceOrientation = VehicleOrientation; | 649 | Prim.ForceOrientation = VehicleOrientation; |
647 | if ((m_knownChanged & m_knownChangedVelocity) != 0) | 650 | if ((m_knownChanged & m_knownChangedVelocity) != 0) |
651 | { | ||
648 | Prim.ForceVelocity = VehicleVelocity; | 652 | Prim.ForceVelocity = VehicleVelocity; |
653 | BulletSimAPI.SetInterpolationLinearVelocity2(Prim.PhysBody.ptr, VehicleVelocity); | ||
654 | } | ||
649 | if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0) | 655 | if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0) |
650 | { | 656 | { |
651 | Prim.ForceRotationalVelocity = VehicleRotationalVelocity; | 657 | Prim.ForceRotationalVelocity = VehicleRotationalVelocity; |
658 | // Fake out Bullet by making it think the velocity is the same as last time. | ||
652 | BulletSimAPI.SetInterpolationAngularVelocity2(Prim.PhysBody.ptr, VehicleRotationalVelocity); | 659 | BulletSimAPI.SetInterpolationAngularVelocity2(Prim.PhysBody.ptr, VehicleRotationalVelocity); |
653 | } | 660 | } |
661 | if ((m_knownChanged & m_knownChangedRotationalForce) != 0) | ||
662 | Prim.AddAngularForce((Vector3)m_knownRotationalForce, false, true); | ||
663 | |||
654 | // If we set one of the values (ie, the physics engine didn't do it) we must force | 664 | // If we set one of the values (ie, the physics engine didn't do it) we must force |
655 | // an UpdateProperties event to send the changes up to the simulator. | 665 | // an UpdateProperties event to send the changes up to the simulator. |
656 | BulletSimAPI.PushUpdate2(Prim.PhysBody.ptr); | 666 | BulletSimAPI.PushUpdate2(Prim.PhysBody.ptr); |
@@ -734,6 +744,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
734 | m_knownChanged |= m_knownChangedRotationalVelocity; | 744 | m_knownChanged |= m_knownChangedRotationalVelocity; |
735 | } | 745 | } |
736 | } | 746 | } |
747 | private void VehicleAddAngularForce(Vector3 aForce) | ||
748 | { | ||
749 | m_knownRotationalForce += aForce; | ||
750 | m_knownChanged |= m_knownChangedRotationalForce; | ||
751 | } | ||
737 | #endregion // Known vehicle value functions | 752 | #endregion // Known vehicle value functions |
738 | 753 | ||
739 | // One step of the vehicle properties for the next 'pTimestep' seconds. | 754 | // One step of the vehicle properties for the next 'pTimestep' seconds. |
@@ -1013,11 +1028,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1013 | + bankingContribution; | 1028 | + bankingContribution; |
1014 | 1029 | ||
1015 | // ================================================================== | 1030 | // ================================================================== |
1016 | // The correction is applied to the current orientation. | 1031 | // Apply the correction velocity. |
1032 | // TODO: Should this be applied as an angular force (torque)? | ||
1017 | if (!m_lastAngularCorrection.ApproxEquals(Vector3.Zero, 0.01f)) | 1033 | if (!m_lastAngularCorrection.ApproxEquals(Vector3.Zero, 0.01f)) |
1018 | { | 1034 | { |
1019 | Vector3 scaledCorrection = m_lastAngularCorrection * pTimestep; | 1035 | Vector3 scaledCorrection = m_lastAngularCorrection * pTimestep; |
1020 | |||
1021 | VehicleRotationalVelocity = scaledCorrection; | 1036 | VehicleRotationalVelocity = scaledCorrection; |
1022 | 1037 | ||
1023 | VDetailLog("{0}, MoveAngular,done,nonZero,angMotorContrib={1},vertAttrContrib={2},bankContrib={3},deflectContrib={4},totalContrib={5},scaledCorr={6}", | 1038 | 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 | |||
1029 | } | 1044 | } |
1030 | else | 1045 | else |
1031 | { | 1046 | { |
1032 | // The vehicle is not adding anything velocity wise. | 1047 | // The vehicle is not adding anything angular wise. |
1033 | VehicleRotationalVelocity = Vector3.Zero; | 1048 | VehicleRotationalVelocity = Vector3.Zero; |
1034 | VDetailLog("{0}, MoveAngular,done,zero", Prim.LocalID); | 1049 | VDetailLog("{0}, MoveAngular,done,zero", Prim.LocalID); |
1035 | } | 1050 | } |
@@ -1060,8 +1075,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1060 | torqueFromOffset.Y = 0; | 1075 | torqueFromOffset.Y = 0; |
1061 | if (float.IsNaN(torqueFromOffset.Z)) | 1076 | if (float.IsNaN(torqueFromOffset.Z)) |
1062 | torqueFromOffset.Z = 0; | 1077 | torqueFromOffset.Z = 0; |
1063 | torqueFromOffset *= m_vehicleMass; | 1078 | |
1064 | Prim.ApplyTorqueImpulse(torqueFromOffset, true); | 1079 | VehicleAddAngularForce(torqueFromOffset * m_vehicleMass); |
1065 | VDetailLog("{0}, BSDynamic.MoveAngular,motorOffset,applyTorqueImpulse={1}", Prim.LocalID, torqueFromOffset); | 1080 | VDetailLog("{0}, BSDynamic.MoveAngular,motorOffset,applyTorqueImpulse={1}", Prim.LocalID, torqueFromOffset); |
1066 | } | 1081 | } |
1067 | 1082 | ||
@@ -1097,23 +1112,21 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1097 | ret.Y = - verticalError.X; | 1112 | ret.Y = - verticalError.X; |
1098 | ret.Z = 0f; | 1113 | ret.Z = 0f; |
1099 | 1114 | ||
1100 | // scale by the time scale and timestep | 1115 | // Scale the correction force by how far we're off from vertical. |
1116 | // Z error of one says little error. As Z gets smaller, the vehicle is leaning farther over. | ||
1117 | // float clampedZError = ClampInRange(0.1f, Math.Abs(verticalError.Z), 1f); | ||
1118 | float clampedSqrZError = ClampInRange(0.01f, verticalError.Z * verticalError.Z, 1f); | ||
1119 | // float vertForce = 1f / clampedSqrZError * m_verticalAttractionEfficiency; | ||
1120 | float vertForce = 1f / clampedSqrZError; | ||
1121 | |||
1122 | ret *= vertForce; | ||
1123 | |||
1124 | // Correction happens over a number of seconds. | ||
1101 | Vector3 unscaledContrib = ret; | 1125 | Vector3 unscaledContrib = ret; |
1102 | ret /= m_verticalAttractionTimescale; | 1126 | ret /= m_verticalAttractionTimescale; |
1103 | // This returns the angular correction desired. Timestep is added later. | 1127 | |
1104 | // ret *= pTimestep; | 1128 | VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},vertForce={3},eff={4},vertAttr={5}", |
1105 | 1129 | Prim.LocalID, verticalError, unscaledContrib, vertForce, m_verticalAttractionEfficiency, ret); | |
1106 | // apply efficiency | ||
1107 | Vector3 preEfficiencyContrib = ret; | ||
1108 | // TODO: implement efficiency. | ||
1109 | // Effenciency squared seems to give a more realistic effect | ||
1110 | float efficencySquared = m_verticalAttractionEfficiency * m_verticalAttractionEfficiency; | ||
1111 | // ret *= efficencySquared; | ||
1112 | |||
1113 | VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},preEff={3},eff={4},effSq={5},vertAttr={6}", | ||
1114 | Prim.LocalID, verticalError, unscaledContrib, preEfficiencyContrib, | ||
1115 | m_verticalAttractionEfficiency, efficencySquared, | ||
1116 | ret); | ||
1117 | } | 1130 | } |
1118 | return ret; | 1131 | return ret; |
1119 | } | 1132 | } |
@@ -1123,6 +1136,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1123 | public Vector3 ComputeAngularDeflection() | 1136 | public Vector3 ComputeAngularDeflection() |
1124 | { | 1137 | { |
1125 | Vector3 ret = Vector3.Zero; | 1138 | Vector3 ret = Vector3.Zero; |
1139 | return ret; // DEBUG DEBUG DEBUG debug the other contributors first | ||
1126 | 1140 | ||
1127 | if (m_angularDeflectionEfficiency != 0) | 1141 | if (m_angularDeflectionEfficiency != 0) |
1128 | { | 1142 | { |
@@ -1151,6 +1165,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1151 | { | 1165 | { |
1152 | Vector3 ret = Vector3.Zero; | 1166 | Vector3 ret = Vector3.Zero; |
1153 | Vector3 computedBanking = Vector3.Zero; | 1167 | Vector3 computedBanking = Vector3.Zero; |
1168 | return ret; // DEBUG DEBUG DEBUG debug the other contributors first | ||
1154 | 1169 | ||
1155 | if (m_bankingEfficiency != 0) | 1170 | if (m_bankingEfficiency != 0) |
1156 | { | 1171 | { |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index ea1f71a..e392078 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -1010,6 +1010,9 @@ public sealed class BSPrim : BSPhysObject | |||
1010 | }); | 1010 | }); |
1011 | } | 1011 | } |
1012 | // A torque impulse. | 1012 | // A torque impulse. |
1013 | // ApplyTorqueImpulse adds torque directly to the angularVelocity. | ||
1014 | // AddAngularForce accumulates the force and applied it to the angular velocity all at once. | ||
1015 | // Computed as: angularVelocity += impulse * inertia; | ||
1013 | public void ApplyTorqueImpulse(OMV.Vector3 impulse, bool inTaintTime) | 1016 | public void ApplyTorqueImpulse(OMV.Vector3 impulse, bool inTaintTime) |
1014 | { | 1017 | { |
1015 | OMV.Vector3 applyImpulse = impulse; | 1018 | OMV.Vector3 applyImpulse = impulse; |