diff options
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/ODEVehicleSettings.cs')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEVehicleSettings.cs | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEVehicleSettings.cs b/OpenSim/Region/Physics/OdePlugin/ODEVehicleSettings.cs index c4c3044..3a99b48 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEVehicleSettings.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEVehicleSettings.cs | |||
@@ -44,6 +44,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
44 | get { return m_type; } | 44 | get { return m_type; } |
45 | } | 45 | } |
46 | 46 | ||
47 | public IntPtr Body | ||
48 | { | ||
49 | get { return m_body; } | ||
50 | } | ||
51 | |||
47 | private Vehicle m_type = Vehicle.TYPE_NONE; | 52 | private Vehicle m_type = Vehicle.TYPE_NONE; |
48 | private OdeScene m_parentScene = null; | 53 | private OdeScene m_parentScene = null; |
49 | private IntPtr m_body = IntPtr.Zero; | 54 | private IntPtr m_body = IntPtr.Zero; |
@@ -75,6 +80,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
75 | private float m_linearMotorTimescale = 0; | 80 | private float m_linearMotorTimescale = 0; |
76 | private float m_verticalAttractionEfficiency = 0; | 81 | private float m_verticalAttractionEfficiency = 0; |
77 | private float m_verticalAttractionTimescale = 0; | 82 | private float m_verticalAttractionTimescale = 0; |
83 | private Vector3 m_lastVector = Vector3.Zero; | ||
78 | private VehicleFlag m_flags = (VehicleFlag) 0; | 84 | private VehicleFlag m_flags = (VehicleFlag) 0; |
79 | 85 | ||
80 | 86 | ||
@@ -222,8 +228,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
222 | 228 | ||
223 | internal void Enable(IntPtr pBody, OdeScene pParentScene) | 229 | internal void Enable(IntPtr pBody, OdeScene pParentScene) |
224 | { | 230 | { |
225 | if (pBody == IntPtr.Zero || m_type == Vehicle.TYPE_NONE) | 231 | if (m_type == Vehicle.TYPE_NONE) |
226 | return; | 232 | return; |
233 | |||
227 | m_body = pBody; | 234 | m_body = pBody; |
228 | m_parentScene = pParentScene; | 235 | m_parentScene = pParentScene; |
229 | } | 236 | } |
@@ -246,11 +253,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
246 | { | 253 | { |
247 | if (m_body == IntPtr.Zero || m_type == Vehicle.TYPE_NONE) | 254 | if (m_body == IntPtr.Zero || m_type == Vehicle.TYPE_NONE) |
248 | return; | 255 | return; |
249 | 256 | VerticalAttractor(pTimestep); | |
257 | LinearMotor(pTimestep); | ||
250 | } | 258 | } |
251 | 259 | ||
252 | private void SetDefaultsForType(Vehicle pType) | 260 | private void SetDefaultsForType(Vehicle pType) |
253 | { | 261 | { |
262 | m_type = pType; | ||
254 | switch (pType) | 263 | switch (pType) |
255 | { | 264 | { |
256 | case Vehicle.TYPE_SLED: | 265 | case Vehicle.TYPE_SLED: |
@@ -388,5 +397,43 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
388 | 397 | ||
389 | } | 398 | } |
390 | } | 399 | } |
400 | |||
401 | private void VerticalAttractor(float pTimestep) | ||
402 | { | ||
403 | // The purpose of this routine here is to quickly stabilize the Body while it's popped up in the air. | ||
404 | // The amotor needs a few seconds to stabilize so without it, the avatar shoots up sky high when you | ||
405 | // change appearance and when you enter the simulator | ||
406 | // After this routine is done, the amotor stabilizes much quicker | ||
407 | d.Mass objMass; | ||
408 | d.BodyGetMass(Body, out objMass); | ||
409 | //d.BodyGetS | ||
410 | |||
411 | d.Vector3 feet; | ||
412 | d.Vector3 head; | ||
413 | d.BodyGetRelPointPos(m_body, 0.0f, 0.0f, -1.0f, out feet); | ||
414 | d.BodyGetRelPointPos(m_body, 0.0f, 0.0f, 1.0f, out head); | ||
415 | float posture = head.Z - feet.Z; | ||
416 | |||
417 | // restoring force proportional to lack of posture: | ||
418 | float servo = (2.5f - posture) * (objMass.mass * m_verticalAttractionEfficiency / (m_verticalAttractionTimescale * pTimestep)) * objMass.mass; | ||
419 | d.BodyAddForceAtRelPos(m_body, 0.0f, 0.0f, servo, 0.0f, 0.0f, 1.0f); | ||
420 | d.BodyAddForceAtRelPos(m_body, 0.0f, 0.0f, -servo, 0.0f, 0.0f, -1.0f); | ||
421 | //d.Matrix3 bodyrotation = d.BodyGetRotation(Body); | ||
422 | //m_log.Info("[PHYSICSAV]: Rotation: " + bodyrotation.M00 + " : " + bodyrotation.M01 + " : " + bodyrotation.M02 + " : " + bodyrotation.M10 + " : " + bodyrotation.M11 + " : " + bodyrotation.M12 + " : " + bodyrotation.M20 + " : " + bodyrotation.M21 + " : " + bodyrotation.M22); | ||
423 | } | ||
424 | |||
425 | private void LinearMotor(float pTimestep) | ||
426 | { | ||
427 | |||
428 | /* | ||
429 | float decayval = (m_linearMotorDecayTimescale * pTimestep); | ||
430 | m_linearMotorDirection *= decayval; | ||
431 | m_lastVector += m_linearMotorDirection | ||
432 | |||
433 | |||
434 | m_lin | ||
435 | m_lastVector | ||
436 | * */ | ||
437 | } | ||
391 | } | 438 | } |
392 | } | 439 | } |