diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index 13c2539..c34c05a 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -137,6 +137,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
137 | get { return Type != Vehicle.TYPE_NONE && Prim.IsPhysical; } | 137 | get { return Type != Vehicle.TYPE_NONE && Prim.IsPhysical; } |
138 | } | 138 | } |
139 | 139 | ||
140 | #region Vehicle parameter setting | ||
140 | internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue) | 141 | internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue) |
141 | { | 142 | { |
142 | VDetailLog("{0},ProcessFloatVehicleParam,param={1},val={2}", Prim.LocalID, pParam, pValue); | 143 | VDetailLog("{0},ProcessFloatVehicleParam,param={1},val={2}", Prim.LocalID, pParam, pValue); |
@@ -546,6 +547,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
546 | m_verticalAttractionMotor.FrictionTimescale = new Vector3(BSMotor.Infinite, BSMotor.Infinite, 0.1f); | 547 | m_verticalAttractionMotor.FrictionTimescale = new Vector3(BSMotor.Infinite, BSMotor.Infinite, 0.1f); |
547 | m_verticalAttractionMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG DEBUG (enables detail logging) | 548 | m_verticalAttractionMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG DEBUG (enables detail logging) |
548 | } | 549 | } |
550 | #endregion // Vehicle parameter setting | ||
549 | 551 | ||
550 | // Some of the properties of this prim may have changed. | 552 | // Some of the properties of this prim may have changed. |
551 | // Do any updating needed for a vehicle | 553 | // Do any updating needed for a vehicle |
@@ -854,6 +856,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
854 | // The movement computed in the linear motor is relative to the vehicle | 856 | // The movement computed in the linear motor is relative to the vehicle |
855 | // coordinates. Rotate the movement to world coordinates. | 857 | // coordinates. Rotate the movement to world coordinates. |
856 | linearMotorContribution *= VehicleOrientation; | 858 | linearMotorContribution *= VehicleOrientation; |
859 | // All the contributions after this are world relative (mostly Z modifications) | ||
857 | 860 | ||
858 | // ================================================================== | 861 | // ================================================================== |
859 | // Buoyancy: force to overcome gravity. | 862 | // Buoyancy: force to overcome gravity. |
@@ -925,7 +928,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
925 | // TODO: Consider taking the rotated size of the object or possibly casting a ray. | 928 | // TODO: Consider taking the rotated size of the object or possibly casting a ray. |
926 | if (VehiclePosition.Z < GetTerrainHeight(VehiclePosition)) | 929 | if (VehiclePosition.Z < GetTerrainHeight(VehiclePosition)) |
927 | { | 930 | { |
928 | // TODO: correct position by applying force rather than forcing position. | 931 | // Force position because applying force won't get the vehicle through the terrain |
929 | Vector3 newPosition = VehiclePosition; | 932 | Vector3 newPosition = VehiclePosition; |
930 | newPosition.Z = GetTerrainHeight(VehiclePosition) + 1f; | 933 | newPosition.Z = GetTerrainHeight(VehiclePosition) + 1f; |
931 | VehiclePosition = newPosition; | 934 | VehiclePosition = newPosition; |
@@ -980,14 +983,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
980 | float verticalCorrectionVelocity = verticalError / m_VhoverTimescale; | 983 | float verticalCorrectionVelocity = verticalError / m_VhoverTimescale; |
981 | 984 | ||
982 | // TODO: implement m_VhoverEfficiency correctly | 985 | // TODO: implement m_VhoverEfficiency correctly |
983 | if (Math.Abs(verticalError) > m_VhoverEfficiency) | 986 | ret = new Vector3(0f, 0f, verticalCorrectionVelocity); |
984 | { | ||
985 | ret = new Vector3(0f, 0f, verticalCorrectionVelocity); | ||
986 | } | ||
987 | } | 987 | } |
988 | 988 | ||
989 | VDetailLog("{0}, MoveLinear,hover,pos={1},ret={2},hoverTS={3},height={4},target={5}", | 989 | VDetailLog("{0}, MoveLinear,hover,pos={1},eff={2},hoverTS={3},height={4},target={5},ret={6}", |
990 | Prim.LocalID, VehiclePosition, ret, m_VhoverTimescale, m_VhoverHeight, m_VhoverTargetHeight); | 990 | Prim.LocalID, VehiclePosition, m_VhoverEfficiency, m_VhoverTimescale, m_VhoverHeight, m_VhoverTargetHeight, ret); |
991 | } | 991 | } |
992 | 992 | ||
993 | return ret; | 993 | return ret; |
@@ -1109,6 +1109,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1109 | + deflectionContribution | 1109 | + deflectionContribution |
1110 | + bankingContribution; | 1110 | + bankingContribution; |
1111 | 1111 | ||
1112 | // Add of the above computation are made relative to vehicle coordinates. | ||
1113 | // Convert to world coordinates. | ||
1114 | m_lastAngularVelocity *= VehicleOrientation; | ||
1115 | |||
1112 | // ================================================================== | 1116 | // ================================================================== |
1113 | // Apply the correction velocity. | 1117 | // Apply the correction velocity. |
1114 | // TODO: Should this be applied as an angular force (torque)? | 1118 | // TODO: Should this be applied as an angular force (torque)? |
@@ -1220,19 +1224,21 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1220 | public Vector3 ComputeAngularDeflection() | 1224 | public Vector3 ComputeAngularDeflection() |
1221 | { | 1225 | { |
1222 | Vector3 ret = Vector3.Zero; | 1226 | Vector3 ret = Vector3.Zero; |
1223 | return ret; // DEBUG DEBUG DEBUG | 1227 | |
1224 | // Disable angular deflection for the moment. | ||
1225 | // Since angularMotorUp and angularDeflection are computed independently, they will calculate | 1228 | // Since angularMotorUp and angularDeflection are computed independently, they will calculate |
1226 | // approximately the same X or Y correction. When added together (when contributions are combined) | 1229 | // approximately the same X or Y correction. When added together (when contributions are combined) |
1227 | // this creates an over-correction and then wabbling as the target is overshot. | 1230 | // this creates an over-correction and then wabbling as the target is overshot. |
1228 | // TODO: rethink how the different correction computations inter-relate. | 1231 | // TODO: rethink how the different correction computations inter-relate. |
1229 | 1232 | ||
1230 | if (m_angularDeflectionEfficiency != 0) | 1233 | if (m_angularDeflectionEfficiency != 0 && VehicleVelocity != Vector3.Zero) |
1231 | { | 1234 | { |
1232 | // The direction the vehicle is moving | 1235 | // The direction the vehicle is moving |
1233 | Vector3 movingDirection = VehicleVelocity; | 1236 | Vector3 movingDirection = VehicleVelocity; |
1234 | movingDirection.Normalize(); | 1237 | movingDirection.Normalize(); |
1235 | 1238 | ||
1239 | // If the vehicle is going backward, it is still pointing forward | ||
1240 | movingDirection *= Math.Sign(VehicleForwardSpeed); | ||
1241 | |||
1236 | // The direction the vehicle is pointing | 1242 | // The direction the vehicle is pointing |
1237 | Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation; | 1243 | Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation; |
1238 | pointingDirection.Normalize(); | 1244 | pointingDirection.Normalize(); |
@@ -1241,6 +1247,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1241 | Vector3 deflectionError = movingDirection - pointingDirection; | 1247 | Vector3 deflectionError = movingDirection - pointingDirection; |
1242 | 1248 | ||
1243 | // Don't try to correct very large errors (not our job) | 1249 | // Don't try to correct very large errors (not our job) |
1250 | // if (Math.Abs(deflectionError.X) > PIOverFour) deflectionError.X = PIOverTwo * Math.Sign(deflectionError.X); | ||
1251 | // if (Math.Abs(deflectionError.Y) > PIOverFour) deflectionError.Y = PIOverTwo * Math.Sign(deflectionError.Y); | ||
1252 | // if (Math.Abs(deflectionError.Z) > PIOverFour) deflectionError.Z = PIOverTwo * Math.Sign(deflectionError.Z); | ||
1244 | if (Math.Abs(deflectionError.X) > PIOverFour) deflectionError.X = 0f; | 1253 | if (Math.Abs(deflectionError.X) > PIOverFour) deflectionError.X = 0f; |
1245 | if (Math.Abs(deflectionError.Y) > PIOverFour) deflectionError.Y = 0f; | 1254 | if (Math.Abs(deflectionError.Y) > PIOverFour) deflectionError.Y = 0f; |
1246 | if (Math.Abs(deflectionError.Z) > PIOverFour) deflectionError.Z = 0f; | 1255 | if (Math.Abs(deflectionError.Z) > PIOverFour) deflectionError.Z = 0f; |
@@ -1296,33 +1305,29 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1296 | 1305 | ||
1297 | if (m_bankingEfficiency != 0 && m_verticalAttractionTimescale < m_verticalAttractionCutoff) | 1306 | if (m_bankingEfficiency != 0 && m_verticalAttractionTimescale < m_verticalAttractionCutoff) |
1298 | { | 1307 | { |
1299 | // This works by rotating a unit vector to the orientation of the vehicle. The | 1308 | // Rotate a UnitZ vector (pointing up) to how the vehicle is oriented. |
1300 | // roll (tilt) will be Y component of a tilting Z vector (zero for no tilt | 1309 | // As the vehicle rolls to the right or left, the Y value will increase from |
1301 | // up to one for full over). | 1310 | // zero (straight up) to 1 or -1 (full tilt right or left) |
1302 | Vector3 rollComponents = Vector3.UnitZ * VehicleOrientation; | 1311 | Vector3 rollComponents = Vector3.UnitZ * VehicleOrientation; |
1303 | 1312 | ||
1304 | // Figure out the yaw value for this much roll. | 1313 | // Figure out the yaw value for this much roll. |
1305 | float turnComponent = rollComponents.Y * rollComponents.Y * m_bankingEfficiency; | 1314 | // Squared because that seems to give a good value |
1306 | // Keep the sign | 1315 | float yawAngle = (float)Math.Asin(rollComponents.Y * rollComponents.Y) * m_bankingEfficiency; |
1307 | if (rollComponents.Y < 0f) | ||
1308 | turnComponent = -turnComponent; | ||
1309 | |||
1310 | // TODO: there must be a better computation of the banking force. | ||
1311 | float bankingTurnForce = turnComponent; | ||
1312 | 1316 | ||
1313 | // actual error = static turn error + dynamic turn error | 1317 | // actual error = static turn error + dynamic turn error |
1314 | float mixedBankingError = bankingTurnForce * (1f - m_bankingMix) + bankingTurnForce * m_bankingMix * VehicleForwardSpeed; | 1318 | float mixedYawAngle = yawAngle * (1f - m_bankingMix) + yawAngle * m_bankingMix * VehicleForwardSpeed; |
1319 | |||
1315 | // TODO: the banking effect should not go to infinity but what to limit it to? | 1320 | // TODO: the banking effect should not go to infinity but what to limit it to? |
1316 | mixedBankingError = ClampInRange(-20f, mixedBankingError, 20f); | 1321 | mixedYawAngle = ClampInRange(-20f, mixedYawAngle, 20f); |
1317 | 1322 | ||
1318 | // Build the force vector to change rotation from what it is to what it should be | 1323 | // Build the force vector to change rotation from what it is to what it should be |
1319 | ret.Z = -mixedBankingError; | 1324 | ret.Z = -mixedYawAngle; |
1320 | 1325 | ||
1321 | // Don't do it all at once. | 1326 | // Don't do it all at once. |
1322 | ret /= m_bankingTimescale; | 1327 | ret /= m_bankingTimescale; |
1323 | 1328 | ||
1324 | VDetailLog("{0}, MoveAngular,Banking,rollComp={1},speed={2},turnComp={3},bankErr={4},mixedBankErr={5},ret={6}", | 1329 | VDetailLog("{0}, MoveAngular,Banking,rollComp={1},speed={2},rollComp={3},yAng={4},mYAng={5},ret={6}", |
1325 | Prim.LocalID, rollComponents, VehicleForwardSpeed, turnComponent, bankingTurnForce, mixedBankingError, ret); | 1330 | Prim.LocalID, rollComponents, VehicleForwardSpeed, rollComponents, yawAngle, mixedYawAngle, ret); |
1326 | } | 1331 | } |
1327 | return ret; | 1332 | return ret; |
1328 | } | 1333 | } |