diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 75 |
1 files changed, 38 insertions, 37 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index 82d7c44..f0d17d3 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -589,10 +589,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
589 | m_vehicleMass = ControllingPrim.TotalMass; | 589 | m_vehicleMass = ControllingPrim.TotalMass; |
590 | 590 | ||
591 | // Friction affects are handled by this vehicle code | 591 | // Friction affects are handled by this vehicle code |
592 | m_physicsScene.PE.SetFriction(ControllingPrim.PhysBody, BSParam.VehicleFriction); | 592 | // m_physicsScene.PE.SetFriction(ControllingPrim.PhysBody, BSParam.VehicleFriction); |
593 | m_physicsScene.PE.SetRestitution(ControllingPrim.PhysBody, BSParam.VehicleRestitution); | 593 | // m_physicsScene.PE.SetRestitution(ControllingPrim.PhysBody, BSParam.VehicleRestitution); |
594 | // ControllingPrim.Linkset.SetPhysicalFriction(BSParam.VehicleFriction); | 594 | ControllingPrim.Linkset.SetPhysicalFriction(BSParam.VehicleFriction); |
595 | // ControllingPrim.Linkset.SetPhysicalRestitution(BSParam.VehicleRestitution); | 595 | ControllingPrim.Linkset.SetPhysicalRestitution(BSParam.VehicleRestitution); |
596 | 596 | ||
597 | // Moderate angular movement introduced by Bullet. | 597 | // Moderate angular movement introduced by Bullet. |
598 | // TODO: possibly set AngularFactor and LinearFactor for the type of vehicle. | 598 | // TODO: possibly set AngularFactor and LinearFactor for the type of vehicle. |
@@ -602,21 +602,21 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
602 | m_physicsScene.PE.SetAngularFactorV(ControllingPrim.PhysBody, BSParam.VehicleAngularFactor); | 602 | m_physicsScene.PE.SetAngularFactorV(ControllingPrim.PhysBody, BSParam.VehicleAngularFactor); |
603 | 603 | ||
604 | // Vehicles report collision events so we know when it's on the ground | 604 | // Vehicles report collision events so we know when it's on the ground |
605 | m_physicsScene.PE.AddToCollisionFlags(ControllingPrim.PhysBody, CollisionFlags.BS_VEHICLE_COLLISIONS); | 605 | // m_physicsScene.PE.AddToCollisionFlags(ControllingPrim.PhysBody, CollisionFlags.BS_VEHICLE_COLLISIONS); |
606 | // ControllingPrim.Linkset.SetPhysicalCollisionFlags(CollisionFlags.BS_VEHICLE_COLLISIONS); | 606 | ControllingPrim.Linkset.AddToPhysicalCollisionFlags(CollisionFlags.BS_VEHICLE_COLLISIONS); |
607 | 607 | ||
608 | Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(ControllingPrim.PhysShape.physShapeInfo, m_vehicleMass); | 608 | // Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(ControllingPrim.PhysShape.physShapeInfo, m_vehicleMass); |
609 | ControllingPrim.Inertia = inertia * BSParam.VehicleInertiaFactor; | 609 | // ControllingPrim.Inertia = inertia * BSParam.VehicleInertiaFactor; |
610 | m_physicsScene.PE.SetMassProps(ControllingPrim.PhysBody, m_vehicleMass, ControllingPrim.Inertia); | 610 | // m_physicsScene.PE.SetMassProps(ControllingPrim.PhysBody, m_vehicleMass, ControllingPrim.Inertia); |
611 | m_physicsScene.PE.UpdateInertiaTensor(ControllingPrim.PhysBody); | 611 | // m_physicsScene.PE.UpdateInertiaTensor(ControllingPrim.PhysBody); |
612 | // ControllingPrim.Linkset.ComputeLocalInertia(BSParam.VehicleInertiaFactor); | 612 | ControllingPrim.Linkset.ComputeAndSetLocalInertia(BSParam.VehicleInertiaFactor, m_vehicleMass); |
613 | 613 | ||
614 | // Set the gravity for the vehicle depending on the buoyancy | 614 | // Set the gravity for the vehicle depending on the buoyancy |
615 | // TODO: what should be done if prim and vehicle buoyancy differ? | 615 | // TODO: what should be done if prim and vehicle buoyancy differ? |
616 | m_VehicleGravity = ControllingPrim.ComputeGravity(m_VehicleBuoyancy); | 616 | m_VehicleGravity = ControllingPrim.ComputeGravity(m_VehicleBuoyancy); |
617 | // The actual vehicle gravity is set to zero in Bullet so we can do all the application of same. | 617 | // The actual vehicle gravity is set to zero in Bullet so we can do all the application of same. |
618 | m_physicsScene.PE.SetGravity(ControllingPrim.PhysBody, Vector3.Zero); | 618 | // m_physicsScene.PE.SetGravity(ControllingPrim.PhysBody, Vector3.Zero); |
619 | // ControllingPrim.Linkset.SetPhysicalGravity(Vector3.Zero); | 619 | ControllingPrim.Linkset.SetPhysicalGravity(Vector3.Zero); |
620 | 620 | ||
621 | VDetailLog("{0},BSDynamics.SetPhysicalParameters,mass={1},inert={2},vehGrav={3},aDamp={4},frict={5},rest={6},lFact={7},aFact={8}", | 621 | VDetailLog("{0},BSDynamics.SetPhysicalParameters,mass={1},inert={2},vehGrav={3},aDamp={4},frict={5},rest={6},lFact={7},aFact={8}", |
622 | ControllingPrim.LocalID, m_vehicleMass, ControllingPrim.Inertia, m_VehicleGravity, | 622 | ControllingPrim.LocalID, m_vehicleMass, ControllingPrim.Inertia, m_VehicleGravity, |
@@ -1121,7 +1121,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1121 | { | 1121 | { |
1122 | m_VhoverTargetHeight = m_VhoverHeight; | 1122 | m_VhoverTargetHeight = m_VhoverHeight; |
1123 | } | 1123 | } |
1124 | |||
1125 | if ((m_flags & VehicleFlag.HOVER_UP_ONLY) != 0) | 1124 | if ((m_flags & VehicleFlag.HOVER_UP_ONLY) != 0) |
1126 | { | 1125 | { |
1127 | // If body is already heigher, use its height as target height | 1126 | // If body is already heigher, use its height as target height |
@@ -1170,7 +1169,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1170 | m_VhoverTimescale, m_VhoverHeight, m_VhoverTargetHeight, | 1169 | m_VhoverTimescale, m_VhoverHeight, m_VhoverTargetHeight, |
1171 | verticalError, verticalCorrection); | 1170 | verticalError, verticalCorrection); |
1172 | } | 1171 | } |
1173 | |||
1174 | } | 1172 | } |
1175 | } | 1173 | } |
1176 | 1174 | ||
@@ -1357,6 +1355,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1357 | private void ComputeAngularTurning(float pTimestep) | 1355 | private void ComputeAngularTurning(float pTimestep) |
1358 | { | 1356 | { |
1359 | // The user wants this many radians per second angular change? | 1357 | // The user wants this many radians per second angular change? |
1358 | Vector3 origVehicleRotationalVelocity = VehicleRotationalVelocity; // DEBUG DEBUG | ||
1360 | Vector3 currentAngularV = VehicleRotationalVelocity * Quaternion.Inverse(VehicleOrientation); | 1359 | Vector3 currentAngularV = VehicleRotationalVelocity * Quaternion.Inverse(VehicleOrientation); |
1361 | Vector3 angularMotorContributionV = m_angularMotor.Step(pTimestep, currentAngularV); | 1360 | Vector3 angularMotorContributionV = m_angularMotor.Step(pTimestep, currentAngularV); |
1362 | 1361 | ||
@@ -1369,20 +1368,20 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1369 | // TODO: This is here because this is where ODE put it but documentation says it | 1368 | // TODO: This is here because this is where ODE put it but documentation says it |
1370 | // is a linear effect. Where should this check go? | 1369 | // is a linear effect. Where should this check go? |
1371 | //if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0) | 1370 | //if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0) |
1372 | // { | 1371 | // { |
1373 | // angularMotorContributionV.X = 0f; | 1372 | // angularMotorContributionV.X = 0f; |
1374 | // angularMotorContributionV.Y = 0f; | 1373 | // angularMotorContributionV.Y = 0f; |
1375 | // } | 1374 | // } |
1376 | 1375 | ||
1377 | // Reduce any velocity by friction. | 1376 | // Reduce any velocity by friction. |
1378 | Vector3 frictionFactorW = ComputeFrictionFactor(m_angularFrictionTimescale, pTimestep); | 1377 | Vector3 frictionFactorW = ComputeFrictionFactor(m_angularFrictionTimescale, pTimestep); |
1379 | angularMotorContributionV -= (currentAngularV * frictionFactorW); | 1378 | angularMotorContributionV -= (currentAngularV * frictionFactorW); |
1380 | 1379 | ||
1381 | VehicleRotationalVelocity += angularMotorContributionV * VehicleOrientation; | 1380 | Vector3 angularMotorContributionW = angularMotorContributionV * VehicleOrientation; |
1382 | 1381 | VehicleRotationalVelocity += angularMotorContributionW; | |
1383 | |||
1384 | 1382 | ||
1385 | VDetailLog("{0}, MoveAngular,angularTurning,angContribV={1}", ControllingPrim.LocalID, angularMotorContributionV); | 1383 | VDetailLog("{0}, MoveAngular,angularTurning,curAngVelV={1},origVehRotVel={2},vehRotVel={3},frictFact={4}, angContribV={5},angContribW={6}", |
1384 | ControllingPrim.LocalID, currentAngularV, origVehicleRotationalVelocity, VehicleRotationalVelocity, frictionFactorW, angularMotorContributionV, angularMotorContributionW); | ||
1386 | } | 1385 | } |
1387 | 1386 | ||
1388 | // From http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial: | 1387 | // From http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial: |
@@ -1409,7 +1408,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1409 | 1408 | ||
1410 | // Flipping what was originally a timescale into a speed variable and then multiplying it by 2 | 1409 | // Flipping what was originally a timescale into a speed variable and then multiplying it by 2 |
1411 | // since only computing half the distance between the angles. | 1410 | // since only computing half the distance between the angles. |
1412 | float VerticalAttractionSpeed = (1 / m_verticalAttractionTimescale) * 2.0f; | 1411 | float verticalAttractionSpeed = (1 / m_verticalAttractionTimescale) * 2.0f; |
1413 | 1412 | ||
1414 | // Make a prediction of where the up axis will be when this is applied rather then where it is now as | 1413 | // Make a prediction of where the up axis will be when this is applied rather then where it is now as |
1415 | // this makes for a smoother adjustment and less fighting between the various forces. | 1414 | // this makes for a smoother adjustment and less fighting between the various forces. |
@@ -1419,12 +1418,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1419 | Vector3 torqueVector = Vector3.Cross(predictedUp, Vector3.UnitZ); | 1418 | Vector3 torqueVector = Vector3.Cross(predictedUp, Vector3.UnitZ); |
1420 | 1419 | ||
1421 | // Scale vector by our timescale since it is an acceleration it is r/s^2 or radians a timescale squared | 1420 | // Scale vector by our timescale since it is an acceleration it is r/s^2 or radians a timescale squared |
1422 | Vector3 vertContributionV = torqueVector * VerticalAttractionSpeed * VerticalAttractionSpeed; | 1421 | Vector3 vertContributionV = torqueVector * verticalAttractionSpeed * verticalAttractionSpeed; |
1423 | 1422 | ||
1424 | VehicleRotationalVelocity += vertContributionV; | 1423 | VehicleRotationalVelocity += vertContributionV; |
1425 | 1424 | ||
1426 | VDetailLog("{0}, MoveAngular,verticalAttraction,upAxis={1},PredictedUp={2},torqueVector={3},contrib={4}", | 1425 | VDetailLog("{0}, MoveAngular,verticalAttraction,vertAttrSpeed={1},upAxis={2},PredictedUp={3},torqueVector={4},contrib={5}", |
1427 | ControllingPrim.LocalID, | 1426 | ControllingPrim.LocalID, |
1427 | verticalAttractionSpeed, | ||
1428 | vehicleUpAxis, | 1428 | vehicleUpAxis, |
1429 | predictedUp, | 1429 | predictedUp, |
1430 | torqueVector, | 1430 | torqueVector, |
@@ -1437,37 +1437,38 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1437 | // http://stackoverflow.com/questions/14939657/computing-vector-from-quaternion-works-computing-quaternion-from-vector-does-no | 1437 | // http://stackoverflow.com/questions/14939657/computing-vector-from-quaternion-works-computing-quaternion-from-vector-does-no |
1438 | 1438 | ||
1439 | // Create a rotation that is only the vehicle's rotation around Z | 1439 | // Create a rotation that is only the vehicle's rotation around Z |
1440 | Vector3 currentEuler = Vector3.Zero; | 1440 | Vector3 currentEulerW = Vector3.Zero; |
1441 | VehicleOrientation.GetEulerAngles(out currentEuler.X, out currentEuler.Y, out currentEuler.Z); | 1441 | VehicleOrientation.GetEulerAngles(out currentEulerW.X, out currentEulerW.Y, out currentEulerW.Z); |
1442 | Quaternion justZOrientation = Quaternion.CreateFromAxisAngle(Vector3.UnitZ, currentEuler.Z); | 1442 | Quaternion justZOrientation = Quaternion.CreateFromAxisAngle(Vector3.UnitZ, currentEulerW.Z); |
1443 | 1443 | ||
1444 | // Create the axis that is perpendicular to the up vector and the rotated up vector. | 1444 | // Create the axis that is perpendicular to the up vector and the rotated up vector. |
1445 | Vector3 differenceAxis = Vector3.Cross(Vector3.UnitZ * justZOrientation, Vector3.UnitZ * VehicleOrientation); | 1445 | Vector3 differenceAxisW = Vector3.Cross(Vector3.UnitZ * justZOrientation, Vector3.UnitZ * VehicleOrientation); |
1446 | // Compute the angle between those to vectors. | 1446 | // Compute the angle between those to vectors. |
1447 | double differenceAngle = Math.Acos((double)Vector3.Dot(Vector3.UnitZ, Vector3.Normalize(Vector3.UnitZ * VehicleOrientation))); | 1447 | double differenceAngle = Math.Acos((double)Vector3.Dot(Vector3.UnitZ, Vector3.Normalize(Vector3.UnitZ * VehicleOrientation))); |
1448 | // 'differenceAngle' is the angle to rotate and 'differenceAxis' is the plane to rotate in to get the vehicle vertical | 1448 | // 'differenceAngle' is the angle to rotate and 'differenceAxis' is the plane to rotate in to get the vehicle vertical |
1449 | 1449 | ||
1450 | // Reduce the change by the time period it is to change in. Timestep is handled when velocity is applied. | 1450 | // Reduce the change by the time period it is to change in. Timestep is handled when velocity is applied. |
1451 | // TODO: add 'efficiency'. | 1451 | // TODO: add 'efficiency'. |
1452 | differenceAngle /= m_verticalAttractionTimescale; | 1452 | // differenceAngle /= m_verticalAttractionTimescale; |
1453 | 1453 | ||
1454 | // Create the quaterian representing the correction angle | 1454 | // Create the quaterian representing the correction angle |
1455 | Quaternion correctionRotation = Quaternion.CreateFromAxisAngle(differenceAxis, (float)differenceAngle); | 1455 | Quaternion correctionRotationW = Quaternion.CreateFromAxisAngle(differenceAxisW, (float)differenceAngle); |
1456 | 1456 | ||
1457 | // Turn that quaternion into Euler values to make it into velocities to apply. | 1457 | // Turn that quaternion into Euler values to make it into velocities to apply. |
1458 | Vector3 vertContributionV = Vector3.Zero; | 1458 | Vector3 vertContributionW = Vector3.Zero; |
1459 | correctionRotation.GetEulerAngles(out vertContributionV.X, out vertContributionV.Y, out vertContributionV.Z); | 1459 | correctionRotationW.GetEulerAngles(out vertContributionW.X, out vertContributionW.Y, out vertContributionW.Z); |
1460 | vertContributionV *= -1f; | 1460 | vertContributionW *= -1f; |
1461 | vertContributionW /= m_verticalAttractionTimescale; | ||
1461 | 1462 | ||
1462 | VehicleRotationalVelocity += vertContributionV; | 1463 | VehicleRotationalVelocity += vertContributionW; |
1463 | 1464 | ||
1464 | VDetailLog("{0}, MoveAngular,verticalAttraction,upAxis={1},diffAxis={2},diffAng={3},corrRot={4},contrib={5}", | 1465 | VDetailLog("{0}, MoveAngular,verticalAttraction,upAxis={1},diffAxis={2},diffAng={3},corrRot={4},contrib={5}", |
1465 | ControllingPrim.LocalID, | 1466 | ControllingPrim.LocalID, |
1466 | vehicleUpAxis, | 1467 | vehicleUpAxis, |
1467 | differenceAxis, | 1468 | differenceAxisW, |
1468 | differenceAngle, | 1469 | differenceAngle, |
1469 | correctionRotation, | 1470 | correctionRotationW, |
1470 | vertContributionV); | 1471 | vertContributionW); |
1471 | break; | 1472 | break; |
1472 | } | 1473 | } |
1473 | case 2: | 1474 | case 2: |