aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs84
1 files changed, 43 insertions, 41 deletions
diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
index 01c3f81..fbe52c8 100644
--- a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
@@ -3395,6 +3395,44 @@ Console.WriteLine(" JointCreateFixed");
3395 3395
3396//if(frcount == 0) Console.WriteLine("VA = {0}", angObjectVel); 3396//if(frcount == 0) Console.WriteLine("VA = {0}", angObjectVel);
3397 3397
3398 if ( (! m_angularMotorDVel.ApproxEquals(Vector3.Zero, 0.01f)) || (! angObjectVel.ApproxEquals(Vector3.Zero, 0.01f)) )
3399 { // if motor or object have motion
3400 if(!d.BodyIsEnabled (Body)) d.BodyEnable (Body);
3401
3402 if (m_angularMotorTimescale < 300.0f)
3403 {
3404 Vector3 attack_error = m_angularMotorDVel - angObjectVel;
3405 float angfactor = m_angularMotorTimescale/timestep;
3406 Vector3 attackAmount = (attack_error/angfactor);
3407 angObjectVel += attackAmount;
3408//if(frcount == 0) Console.WriteLine("Accel {0} Attk {1}",FrAaccel, attackAmount);
3409//if(frcount == 0) Console.WriteLine("V2+= {0}", angObjectVel);
3410 }
3411
3412 angObjectVel.X -= angObjectVel.X / (m_angularFrictionTimescale.X * 0.7f / timestep);
3413 angObjectVel.Y -= angObjectVel.Y / (m_angularFrictionTimescale.Y * 0.7f / timestep);
3414 angObjectVel.Z -= angObjectVel.Z / (m_angularFrictionTimescale.Z * 0.7f / timestep);
3415 } // else no signif. motion
3416
3417//if(frcount == 0) Console.WriteLine("Dmotor {0} Obj {1}", m_angularMotorDVel, angObjectVel);
3418 // Bank section tba
3419 // Deflection section tba
3420//if(frcount == 0) Console.WriteLine("V3 = {0}", angObjectVel);
3421
3422
3423 // Rotation Axis Disables:
3424 if (!m_angularEnable.ApproxEquals(Vector3.One, 0.003f))
3425 {
3426 if (m_angularEnable.X == 0)
3427 angObjectVel.X = 0f;
3428 if (m_angularEnable.Y == 0)
3429 angObjectVel.Y = 0f;
3430 if (m_angularEnable.Z == 0)
3431 angObjectVel.Z = 0f;
3432 }
3433
3434 angObjectVel = angObjectVel * rotq; // ================ Converts to WORLD rotation
3435
3398 // Vertical attractor section 3436 // Vertical attractor section
3399 Vector3 vertattr = Vector3.Zero; 3437 Vector3 vertattr = Vector3.Zero;
3400 3438
@@ -3419,8 +3457,9 @@ Console.WriteLine(" JointCreateFixed");
3419 } 3457 }
3420 verterr *= 0.5f; 3458 verterr *= 0.5f;
3421 // verterror is 0 (no error) to +/- 1 (max error at 180-deg tilt) 3459 // verterror is 0 (no error) to +/- 1 (max error at 180-deg tilt)
3422 3460 Vector3 xyav = angObjectVel;
3423 if ((!angObjectVel.ApproxEquals(Vector3.Zero, 0.001f)) || (verterr.Z < 0.49f)) 3461 xyav.Z = 0.0f;
3462 if ((!xyav.ApproxEquals(Vector3.Zero, 0.001f)) || (verterr.Z < 0.49f))
3424 { 3463 {
3425 // As the body rotates around the X axis, then verterr.Y increases; Rotated around Y then .X increases, so 3464 // As the body rotates around the X axis, then verterr.Y increases; Rotated around Y then .X increases, so
3426 // Change Body angular velocity X based on Y, and Y based on X. Z is not changed. 3465 // Change Body angular velocity X based on Y, and Y based on X. Z is not changed.
@@ -3452,46 +3491,9 @@ Console.WriteLine(" JointCreateFixed");
3452 } // else vertical attractor is off 3491 } // else vertical attractor is off
3453//if(frcount == 0) Console.WriteLine("V1 = {0}", angObjectVel); 3492//if(frcount == 0) Console.WriteLine("V1 = {0}", angObjectVel);
3454 3493
3455 if ( (! m_angularMotorDVel.ApproxEquals(Vector3.Zero, 0.01f)) || (! angObjectVel.ApproxEquals(Vector3.Zero, 0.01f)) ) 3494
3456 { // if motor or object have motion
3457 if(!d.BodyIsEnabled (Body)) d.BodyEnable (Body);
3458
3459 if (m_angularMotorTimescale < 300.0f)
3460 {
3461 Vector3 attack_error = m_angularMotorDVel - angObjectVel;
3462 float angfactor = m_angularMotorTimescale/timestep;
3463 Vector3 attackAmount = (attack_error/angfactor);
3464 angObjectVel += attackAmount;
3465//if(frcount == 0) Console.WriteLine("Accel {0} Attk {1}",FrAaccel, attackAmount);
3466//if(frcount == 0) Console.WriteLine("V2+= {0}", angObjectVel);
3467 }
3468
3469 angObjectVel.X -= angObjectVel.X / (m_angularFrictionTimescale.X * 0.7f / timestep);
3470 angObjectVel.Y -= angObjectVel.Y / (m_angularFrictionTimescale.Y * 0.7f / timestep);
3471 angObjectVel.Z -= angObjectVel.Z / (m_angularFrictionTimescale.Z * 0.7f / timestep);
3472 } // else no signif. motion
3473
3474//if(frcount == 0) Console.WriteLine("Dmotor {0} Obj {1}", m_angularMotorDVel, angObjectVel);
3475 // Bank section tba
3476 // Deflection section tba
3477//if(frcount == 0) Console.WriteLine("V3 = {0}", angObjectVel);
3478
3479 m_lastAngularVelocity = angObjectVel; 3495 m_lastAngularVelocity = angObjectVel;
3480 3496 // apply Angular Velocity to body
3481 if (!m_angularEnable.ApproxEquals(Vector3.One, 0.003f))
3482 {
3483 if (m_angularEnable.X == 0)
3484 m_lastAngularVelocity.X = 0f;
3485 if (m_angularEnable.Y == 0)
3486 m_lastAngularVelocity.Y = 0f;
3487 if (m_angularEnable.Z == 0)
3488 m_lastAngularVelocity.Z = 0f;
3489 }
3490 // Apply to the body
3491// Vector3 aInc = m_lastAngularVelocity - initavel;
3492//if(frcount == 0) Console.WriteLine("Inc {0}", aInc);
3493 m_lastAngularVelocity = m_lastAngularVelocity * rotq; // ================ Converts to WORLD rotation
3494
3495 d.BodySetAngularVel (Body, m_lastAngularVelocity.X, m_lastAngularVelocity.Y, m_lastAngularVelocity.Z); 3497 d.BodySetAngularVel (Body, m_lastAngularVelocity.X, m_lastAngularVelocity.Y, m_lastAngularVelocity.Z);
3496//if(frcount == 0) Console.WriteLine("V4 = {0}", m_lastAngularVelocity); 3498//if(frcount == 0) Console.WriteLine("V4 = {0}", m_lastAngularVelocity);
3497 3499