From 3f9c390b4d1e13057b11ef810f19fde7c6722fca Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 11 Feb 2012 14:29:36 +0000 Subject: [PATCH] changes to vehicle banking --- .../Physics/UbitOdePlugin/ODEDynamics.cs | 92 +++++-------------- 1 file changed, 23 insertions(+), 69 deletions(-) diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs index 8999621186..80218e74cb 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs @@ -38,6 +38,8 @@ * settings use. */ +// Ubit 2012 + using System; using System.Collections.Generic; using System.Reflection; @@ -57,24 +59,15 @@ namespace OpenSim.Region.Physics.OdePlugin get { return m_type; } } -// private OdeScene m_parentScene = null; -// private IntPtr m_aMotor = IntPtr.Zero; - - private OdePrim rootPrim; private OdeScene _pParentScene; - - - - private Vector3 refUpAxis = new Vector3(0, 0, 1); - private Vector3 refAtAxis = new Vector3(1, 0, 0); - - // Vehicle properties + private Quaternion m_referenceFrame = Quaternion.Identity; // Axis modifier + private Quaternion m_RollreferenceFrame = Quaternion.Identity; // what hell is this ? + private Vehicle m_type = Vehicle.TYPE_NONE; // If a 'VEHICLE', and what kind - private Quaternion m_referenceFrame = Quaternion.Identity; // Axis modifier private VehicleFlag m_flags = (VehicleFlag) 0; // Boolean settings: // HOVER_TERRAIN_ONLY // HOVER_GLOBAL_HEIGHT @@ -84,7 +77,6 @@ namespace OpenSim.Region.Physics.OdePlugin // LIMIT_MOTOR_UP // LIMIT_ROLL_ONLY private Vector3 m_BlockingEndPoint = Vector3.Zero; // not sl - private Quaternion m_RollreferenceFrame = Quaternion.Identity; // Linear properties private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time @@ -116,7 +108,6 @@ namespace OpenSim.Region.Physics.OdePlugin private float m_VhoverHeight = 0f; private float m_VhoverEfficiency = 0f; private float m_VhoverTimescale = 1000f; - private float m_VhoverTargetHeight = -1.0f; // if <0 then no hover, else its the current target height private float m_VehicleBuoyancy = 0f; //KF: m_VehicleBuoyancy is set by VEHICLE_BUOYANCY for a vehicle. // Modifies gravity. Slider between -1 (double-gravity) and 1 (full anti-gravity) // KF: So far I have found no good method to combine a script-requested .Z velocity and gravity. @@ -126,9 +117,6 @@ namespace OpenSim.Region.Physics.OdePlugin private float m_verticalAttractionEfficiency = 1.0f; // damped private float m_verticalAttractionTimescale = 1000f; // Timescale > 300 means no vert attractor. - // special contact data for vehicles - public ContactData VehiculeContactData = new ContactData(0f, 0.1f); - // auxiliar private Vector3 m_dir = Vector3.Zero; // velocity applied to body @@ -271,7 +259,6 @@ namespace OpenSim.Region.Physics.OdePlugin float timestep = _pParentScene.ODE_STEPSIZE; switch (pParam) { - case Vehicle.ANGULAR_FRICTION_TIMESCALE: if (pValue.X < timestep) pValue.X = timestep; if (pValue.Y < timestep) pValue.Y = timestep; @@ -575,7 +562,6 @@ namespace OpenSim.Region.Physics.OdePlugin return vec; } - public static void GetRollPitch(Quaternion rot, out float roll, out float pitch) { // assuming rot is normalised @@ -617,23 +603,23 @@ namespace OpenSim.Region.Physics.OdePlugin d.Vector3 dvtmp; Vector3 tmpV; + Vector3 curVel; // velocity in world + Vector3 curAngVel; // angular velocity in world + Vector3 force = Vector3.Zero; // actually linear aceleration until mult by mass in world frame + Vector3 torque = Vector3.Zero;// actually angular aceleration until mult by Inertia in vehicle frame + d.Vector3 dtorque = new d.Vector3(); + dvtmp = d.BodyGetLinearVel(Body); - Vector3 curVel; curVel.X = dvtmp.X; curVel.Y = dvtmp.Y; curVel.Z = dvtmp.Z; Vector3 curLocalVel = curVel * irotq; // current velocity in local dvtmp = d.BodyGetAngularVel(Body); - Vector3 curAngVel; curAngVel.X = dvtmp.X; curAngVel.Y = dvtmp.Y; curAngVel.Z = dvtmp.Z; - Vector3 curLocalAngVel = curAngVel * irotq; // current velocity in local - - Vector3 force = Vector3.Zero; // actually linear aceleration until mult by mass in world frame - Vector3 torque = Vector3.Zero;// actually angular aceleration until mult by Inertia in object frame - d.Vector3 dtorque = new d.Vector3(); + Vector3 curLocalAngVel = curAngVel * irotq; // current angular velocity in local // linear motor if (m_lmEfect > 0.01 && m_linearMotorTimescale < 1000) @@ -791,11 +777,6 @@ namespace OpenSim.Region.Physics.OdePlugin } } - float r; - float p; - float y; - rotq.GetEulerAngles(out r, out p, out y); - // vertical atractor if (m_verticalAttractionTimescale < 300) { @@ -830,7 +811,17 @@ namespace OpenSim.Region.Physics.OdePlugin broll *= -((1 - m_bankingMix) + vfact); } broll = (broll - curLocalAngVel.Z) / m_bankingTimescale; - torque.Z += broll; + // torque.Z += broll; + + // make z rot be in world Z not local as seems to be in sl + tmpV.X = 0; + tmpV.Y = 0; + tmpV.Z = broll; + tmpV *= irotq; + + torque.X += tmpV.X; + torque.Y += tmpV.Y; + torque.Z += tmpV.Z; } } @@ -853,43 +844,6 @@ namespace OpenSim.Region.Physics.OdePlugin d.MultiplyM3V3(out dvtmp, ref dmass.I, ref dtorque); d.BodyAddRelTorque(Body, dvtmp.X, dvtmp.Y, dvtmp.Z); // add torque in object frame } - - //end MoveAngular - - // limit rotations -/* - bool changed = false; - - if (m_RollreferenceFrame != Quaternion.Identity) - { - if (rotq.X >= m_RollreferenceFrame.X) - { - rot.X = rotq.X - (m_RollreferenceFrame.X / 2); - } - if (rotq.Y >= m_RollreferenceFrame.Y) - { - rot.Y = rotq.Y - (m_RollreferenceFrame.Y / 2); - } - if (rotq.X <= -m_RollreferenceFrame.X) - { - rot.X = rotq.X + (m_RollreferenceFrame.X / 2); - } - if (rotq.Y <= -m_RollreferenceFrame.Y) - { - rot.Y = rotq.Y + (m_RollreferenceFrame.Y / 2); - } - changed = true; - } - - if ((m_flags & VehicleFlag.LOCK_ROTATION) != 0) - { - rot.X = 0; - rot.Y = 0; - changed = true; - } - if (changed) - d.BodySetQuaternion(Body, ref rot); -*/ } } }