diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 22 |
1 files changed, 6 insertions, 16 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 57ec1ae..781c20c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -4909,25 +4909,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
4909 | 4909 | ||
4910 | Quaternion currRot = GetWorldRotation(); | 4910 | Quaternion currRot = GetWorldRotation(); |
4911 | currRot.Normalize(); | 4911 | currRot.Normalize(); |
4912 | 4912 | ||
4913 | // difference between current orientation and desired orientation | 4913 | // difference between current orientation and desired orientation |
4914 | Quaternion dR = new Quaternion(currRot.X, currRot.Y, currRot.Z, -currRot.W) * APIDTarget; | 4914 | Quaternion dR = currRot / APIDTarget; |
4915 | 4915 | ||
4916 | // find axis of rotation to rotate to desired orientation | 4916 | // find axis and angle of rotation to rotate to desired orientation |
4917 | Vector3 axis = Vector3.UnitX; | 4917 | Vector3 axis = Vector3.UnitX; |
4918 | float s = (float)Math.Sqrt(1.0f - dR.W * dR.W); | 4918 | float angle; |
4919 | if (s >= 0.001) | 4919 | dR.GetAxisAngle(out axis, out angle); |
4920 | { | 4920 | axis = axis * currRot; |
4921 | float invS = 1.0f / s; | ||
4922 | if (dR.W < 0) invS = -invS; | ||
4923 | axis = new Vector3(dR.X * invS, dR.Y * invS, dR.Z * invS) * currRot; | ||
4924 | axis.Normalize(); | ||
4925 | } | ||
4926 | |||
4927 | // angle between current and desired orientation | ||
4928 | float angle = 2.0f * (float)Math.Acos(dR.W); | ||
4929 | if (angle > Math.PI) | ||
4930 | angle = 2.0f * (float)Math.PI - angle; | ||
4931 | 4921 | ||
4932 | // clamp strength to avoid overshoot | 4922 | // clamp strength to avoid overshoot |
4933 | float strength = 1.0f / APIDStrength; | 4923 | float strength = 1.0f / APIDStrength; |