diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 70 |
1 files changed, 51 insertions, 19 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index bcebaec..6601479 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -124,9 +124,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
124 | static readonly float PIOverTwo = ((float)Math.PI) / 2f; | 124 | static readonly float PIOverTwo = ((float)Math.PI) / 2f; |
125 | 125 | ||
126 | // For debugging, flags to turn on and off individual corrections. | 126 | // For debugging, flags to turn on and off individual corrections. |
127 | private bool enableAngularVerticalAttraction = true; | 127 | private bool enableAngularVerticalAttraction; |
128 | private bool enableAngularDeflection = true; | 128 | private bool enableAngularDeflection; |
129 | private bool enableAngularBanking = true; | 129 | private bool enableAngularBanking; |
130 | 130 | ||
131 | public BSDynamics(BSScene myScene, BSPrim myPrim) | 131 | public BSDynamics(BSScene myScene, BSPrim myPrim) |
132 | { | 132 | { |
@@ -141,8 +141,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
141 | public void SetupVehicleDebugging() | 141 | public void SetupVehicleDebugging() |
142 | { | 142 | { |
143 | enableAngularVerticalAttraction = true; | 143 | enableAngularVerticalAttraction = true; |
144 | enableAngularDeflection = true; | 144 | enableAngularDeflection = false; |
145 | enableAngularBanking = true; | 145 | enableAngularBanking = false; |
146 | if (BSParam.VehicleDebuggingEnabled != ConfigurationParameters.numericFalse) | 146 | if (BSParam.VehicleDebuggingEnabled != ConfigurationParameters.numericFalse) |
147 | { | 147 | { |
148 | enableAngularVerticalAttraction = false; | 148 | enableAngularVerticalAttraction = false; |
@@ -649,6 +649,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
649 | private Quaternion m_knownOrientation; | 649 | private Quaternion m_knownOrientation; |
650 | private Vector3 m_knownRotationalVelocity; | 650 | private Vector3 m_knownRotationalVelocity; |
651 | private Vector3 m_knownRotationalForce; | 651 | private Vector3 m_knownRotationalForce; |
652 | private Vector3 m_knownRotationalImpulse; | ||
652 | private Vector3 m_knownForwardVelocity; // vehicle relative forward speed | 653 | private Vector3 m_knownForwardVelocity; // vehicle relative forward speed |
653 | 654 | ||
654 | private const int m_knownChangedPosition = 1 << 0; | 655 | private const int m_knownChangedPosition = 1 << 0; |
@@ -658,9 +659,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
658 | private const int m_knownChangedOrientation = 1 << 4; | 659 | private const int m_knownChangedOrientation = 1 << 4; |
659 | private const int m_knownChangedRotationalVelocity = 1 << 5; | 660 | private const int m_knownChangedRotationalVelocity = 1 << 5; |
660 | private const int m_knownChangedRotationalForce = 1 << 6; | 661 | private const int m_knownChangedRotationalForce = 1 << 6; |
661 | private const int m_knownChangedTerrainHeight = 1 << 7; | 662 | private const int m_knownChangedRotationalImpulse = 1 << 7; |
662 | private const int m_knownChangedWaterLevel = 1 << 8; | 663 | private const int m_knownChangedTerrainHeight = 1 << 8; |
663 | private const int m_knownChangedForwardVelocity = 1 << 9; | 664 | private const int m_knownChangedWaterLevel = 1 << 9; |
665 | private const int m_knownChangedForwardVelocity = 1 <<10; | ||
664 | 666 | ||
665 | private void ForgetKnownVehicleProperties() | 667 | private void ForgetKnownVehicleProperties() |
666 | { | 668 | { |
@@ -700,6 +702,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
700 | PhysicsScene.PE.SetInterpolationAngularVelocity(Prim.PhysBody, m_knownRotationalVelocity); | 702 | PhysicsScene.PE.SetInterpolationAngularVelocity(Prim.PhysBody, m_knownRotationalVelocity); |
701 | } | 703 | } |
702 | 704 | ||
705 | if ((m_knownChanged & m_knownChangedRotationalImpulse) != 0) | ||
706 | Prim.ApplyTorqueImpulse((Vector3)m_knownRotationalImpulse, true /*inTaintTime*/); | ||
707 | |||
703 | if ((m_knownChanged & m_knownChangedRotationalForce) != 0) | 708 | if ((m_knownChanged & m_knownChangedRotationalForce) != 0) |
704 | { | 709 | { |
705 | Prim.AddAngularForce((Vector3)m_knownRotationalForce, false /*pushForce*/, true /*inTaintTime*/); | 710 | Prim.AddAngularForce((Vector3)m_knownRotationalForce, false /*pushForce*/, true /*inTaintTime*/); |
@@ -843,6 +848,17 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
843 | m_knownChanged |= m_knownChangedRotationalForce; | 848 | m_knownChanged |= m_knownChangedRotationalForce; |
844 | m_knownHas |= m_knownChangedRotationalForce; | 849 | m_knownHas |= m_knownChangedRotationalForce; |
845 | } | 850 | } |
851 | private void VehicleAddRotationalImpulse(Vector3 pImpulse) | ||
852 | { | ||
853 | if ((m_knownHas & m_knownChangedRotationalImpulse) == 0) | ||
854 | { | ||
855 | m_knownRotationalImpulse = Vector3.Zero; | ||
856 | m_knownHas |= m_knownChangedRotationalImpulse; | ||
857 | } | ||
858 | m_knownRotationalImpulse += pImpulse; | ||
859 | m_knownChanged |= m_knownChangedRotationalImpulse; | ||
860 | } | ||
861 | |||
846 | // Vehicle relative forward velocity | 862 | // Vehicle relative forward velocity |
847 | private Vector3 VehicleForwardVelocity | 863 | private Vector3 VehicleForwardVelocity |
848 | { | 864 | { |
@@ -1031,16 +1047,32 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1031 | else | 1047 | else |
1032 | { | 1048 | { |
1033 | // Error is positive if below the target and negative if above. | 1049 | // Error is positive if below the target and negative if above. |
1034 | float verticalError = m_VhoverTargetHeight - VehiclePosition.Z; | 1050 | Vector3 hpos = VehiclePosition; |
1035 | float verticalCorrectionVelocity = verticalError / m_VhoverTimescale * pTimestep; | 1051 | float verticalError = m_VhoverTargetHeight - hpos.Z; |
1052 | float verticalCorrection = verticalError / m_VhoverTimescale; | ||
1053 | verticalCorrection *= m_VhoverEfficiency; | ||
1054 | |||
1055 | hpos.Z += verticalCorrection; | ||
1056 | VehiclePosition = hpos; | ||
1057 | |||
1058 | // Since we are hovering, we need to do the opposite of falling -- get rid of world Z | ||
1059 | Vector3 vel = VehicleVelocity; | ||
1060 | vel.Z = 0f; | ||
1061 | VehicleVelocity = vel; | ||
1062 | |||
1063 | /* | ||
1064 | float verticalCorrectionVelocity = verticalError / m_VhoverTimescale; | ||
1065 | Vector3 verticalCorrection = new Vector3(0f, 0f, verticalCorrectionVelocity); | ||
1066 | verticalCorrection *= m_vehicleMass; | ||
1036 | 1067 | ||
1037 | // TODO: implement m_VhoverEfficiency correctly | 1068 | // TODO: implement m_VhoverEfficiency correctly |
1038 | VehicleAddForceImpulse(new Vector3(0f, 0f, verticalCorrectionVelocity)); | 1069 | VehicleAddForceImpulse(verticalCorrection); |
1070 | */ | ||
1039 | 1071 | ||
1040 | VDetailLog("{0}, MoveLinear,hover,pos={1},eff={2},hoverTS={3},height={4},target={5},err={6},corrVel={7}", | 1072 | VDetailLog("{0}, MoveLinear,hover,pos={1},eff={2},hoverTS={3},height={4},target={5},err={6},corr={7}", |
1041 | Prim.LocalID, VehiclePosition, m_VhoverEfficiency, | 1073 | Prim.LocalID, VehiclePosition, m_VhoverEfficiency, |
1042 | m_VhoverTimescale, m_VhoverHeight, m_VhoverTargetHeight, | 1074 | m_VhoverTimescale, m_VhoverHeight, m_VhoverTargetHeight, |
1043 | verticalError, verticalCorrectionVelocity); | 1075 | verticalError, verticalCorrection); |
1044 | } | 1076 | } |
1045 | 1077 | ||
1046 | } | 1078 | } |
@@ -1128,8 +1160,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1128 | if (!Prim.IsColliding && VehicleVelocity.Z > 0.1) | 1160 | if (!Prim.IsColliding && VehicleVelocity.Z > 0.1) |
1129 | { | 1161 | { |
1130 | // Get rid of any of the velocity vector that is pushing us up. | 1162 | // Get rid of any of the velocity vector that is pushing us up. |
1131 | VehicleVelocity += new Vector3(0, 0, -VehicleVelocity.Z); | 1163 | float upVelocity = VehicleVelocity.Z; |
1164 | VehicleVelocity += new Vector3(0, 0, -upVelocity); | ||
1132 | 1165 | ||
1166 | /* | ||
1133 | // If we're pointed up into the air, we should nose down | 1167 | // If we're pointed up into the air, we should nose down |
1134 | Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation; | 1168 | Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation; |
1135 | // The rotation around the Y axis is pitch up or down | 1169 | // The rotation around the Y axis is pitch up or down |
@@ -1143,11 +1177,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1143 | VDetailLog("{0}, MoveLinear,limitMotorUp,newVel={1},pntDir={2},corrFrc={3},aCorr={4}", | 1177 | VDetailLog("{0}, MoveLinear,limitMotorUp,newVel={1},pntDir={2},corrFrc={3},aCorr={4}", |
1144 | Prim.LocalID, VehicleVelocity, pointingDirection, angularCorrectionForce, angularCorrectionVector); | 1178 | Prim.LocalID, VehicleVelocity, pointingDirection, angularCorrectionForce, angularCorrectionVector); |
1145 | } | 1179 | } |
1146 | else | 1180 | */ |
1147 | { | 1181 | VDetailLog("{0}, MoveLinear,limitMotorUp,collide={1},upVel={2},newVel={3}", |
1148 | VDetailLog("{0}, MoveLinear,limitMotorUp,newVel={1},pntDir={2}", | 1182 | Prim.LocalID, Prim.IsColliding, upVelocity, VehicleVelocity); |
1149 | Prim.LocalID, VehicleVelocity, pointingDirection); | ||
1150 | } | ||
1151 | } | 1183 | } |
1152 | } | 1184 | } |
1153 | } | 1185 | } |