aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs51
1 files changed, 37 insertions, 14 deletions
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
index 27a9f1c..bb04ea7 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
@@ -80,6 +80,7 @@ namespace OpenSim.Region.Physics.OdePlugin
80 private Vector3 m_rotationalVelocity; 80 private Vector3 m_rotationalVelocity;
81 private Vector3 m_size; 81 private Vector3 m_size;
82 private Quaternion m_orientation; 82 private Quaternion m_orientation;
83 private Quaternion m_orientation2D;
83 private float m_mass = 80f; 84 private float m_mass = 80f;
84 public float m_density = 60f; 85 public float m_density = 60f;
85 private bool m_pidControllerActive = true; 86 private bool m_pidControllerActive = true;
@@ -207,6 +208,7 @@ namespace OpenSim.Region.Physics.OdePlugin
207 208
208 m_feetOffset = pfeetOffset; 209 m_feetOffset = pfeetOffset;
209 m_orientation = Quaternion.Identity; 210 m_orientation = Quaternion.Identity;
211 m_orientation2D = Quaternion.Identity;
210 m_density = density; 212 m_density = density;
211 213
212 // force lower density for testing 214 // force lower density for testing
@@ -649,7 +651,6 @@ namespace OpenSim.Region.Physics.OdePlugin
649 { 651 {
650// fakeori = value; 652// fakeori = value;
651// givefakeori++; 653// givefakeori++;
652
653 value.Normalize(); 654 value.Normalize();
654 AddChange(changes.Orientation, value); 655 AddChange(changes.Orientation, value);
655 } 656 }
@@ -977,7 +978,7 @@ namespace OpenSim.Region.Physics.OdePlugin
977 // force a full inelastic collision 978 // force a full inelastic collision
978 m_collisionException = true; 979 m_collisionException = true;
979 980
980 offset = m_size * m_orientation; 981 offset = m_size * m_orientation2D;
981 982
982 offset.X = (float)Math.Abs(offset.X) * 0.5f + contact.depth; 983 offset.X = (float)Math.Abs(offset.X) * 0.5f + contact.depth;
983 offset.Y = (float)Math.Abs(offset.Y) * 0.5f + contact.depth; 984 offset.Y = (float)Math.Abs(offset.Y) * 0.5f + contact.depth;
@@ -1143,10 +1144,10 @@ namespace OpenSim.Region.Physics.OdePlugin
1143 // so force it back to identity 1144 // so force it back to identity
1144 1145
1145 d.Quaternion qtmp; 1146 d.Quaternion qtmp;
1146 qtmp.W = m_orientation.W; 1147 qtmp.W = m_orientation2D.W;
1147 qtmp.X = m_orientation.X; 1148 qtmp.X = m_orientation2D.X;
1148 qtmp.Y = m_orientation.Y; 1149 qtmp.Y = m_orientation2D.Y;
1149 qtmp.Z = m_orientation.Z; 1150 qtmp.Z = m_orientation2D.Z;
1150 d.BodySetQuaternion(Body, ref qtmp); 1151 d.BodySetQuaternion(Body, ref qtmp);
1151 1152
1152 if (m_pidControllerActive == false) 1153 if (m_pidControllerActive == false)
@@ -1679,14 +1680,36 @@ namespace OpenSim.Region.Physics.OdePlugin
1679 1680
1680 private void changeOrientation(Quaternion newOri) 1681 private void changeOrientation(Quaternion newOri)
1681 { 1682 {
1682 d.Quaternion myrot = new d.Quaternion(); 1683 if (m_orientation != newOri)
1683 myrot.X = newOri.X; 1684 {
1684 myrot.Y = newOri.Y; 1685 m_orientation = newOri; // keep a copy for core use
1685 myrot.Z = newOri.Z; 1686 // but only use rotations around Z
1686 myrot.W = newOri.W; 1687
1687 float t = d.JointGetAMotorAngle(Amotor, 2); 1688 m_orientation2D.W = newOri.W;
1688 d.BodySetQuaternion(Body,ref myrot); 1689 m_orientation2D.Z = newOri.Z;
1689 m_orientation = newOri; 1690
1691 float t = m_orientation2D.W * m_orientation2D.W + m_orientation2D.Z * m_orientation2D.Z;
1692 if (t > 0)
1693 {
1694 t = 1.0f / (float)Math.Sqrt(t);
1695 m_orientation2D.W *= t;
1696 m_orientation2D.Z *= t;
1697 }
1698 else
1699 {
1700 m_orientation2D.W = 1.0f;
1701 m_orientation2D.Z = 0f;
1702 }
1703 m_orientation2D.Y = 0f;
1704 m_orientation2D.X = 0f;
1705
1706 d.Quaternion myrot = new d.Quaternion();
1707 myrot.X = m_orientation2D.X;
1708 myrot.Y = m_orientation2D.Y;
1709 myrot.Z = m_orientation2D.Z;
1710 myrot.W = m_orientation2D.W;
1711 d.BodySetQuaternion(Body, ref myrot);
1712 }
1690 } 1713 }
1691 1714
1692 private void changeVelocity(Vector3 newVel) 1715 private void changeVelocity(Vector3 newVel)