Skip to main content
Don't repeat tags in title
Link
DMGregory
  • 140.8k
  • 23
  • 257
  • 401

Unity - Quaternion - Rotate / UnrotateUn-Rotate Error

I'm trying to unrotateun-rotate a quaternion, aligning it with the axis, and then rotate it back to where it was originally. But with every iteration it seems to lose precision and just after 20 iterations the rotation dissapearsdisappears. Here is an example, which is a simplification of my code:

            Quaternion rotation = Quaternion.Euler (0f, 90f, 0f);
            Debug.Log ("Before: " + rotation.ToString ("F7") + " / Euler: " +
                       rotation.eulerAngles.ToString());

            int iterations = 1;
            for (int i = 0; i < iterations; i++) {              
                var currentRotation = rotation;
                rotation = Quaternion.Inverse (currentRotation) * rotation;
                rotation = currentRotation * rotation;
            }
            
            Debug.Log ("After:  " + rotation.ToString ("F7") + " / Euler: " +
                       rotation.eulerAngles.ToString());

I'm trying to unrotate a quaternion, aligning it with the axis, and then rotate it back to where it was originally. But with every iteration it seems to lose precision and just after 20 iterations the rotation dissapears. Here is an example, which is a simplification of my code:

            Quaternion rotation = Quaternion.Euler (0f, 90f, 0f);
            Debug.Log ("Before: " + rotation.ToString ("F7") + " / Euler: " +
                       rotation.eulerAngles.ToString());

            int iterations = 1;
            for (int i = 0; i < iterations; i++) {              
                var currentRotation = rotation;
                rotation = Quaternion.Inverse (currentRotation) * rotation;
                rotation = currentRotation * rotation;
            }
            
            Debug.Log ("After:  " + rotation.ToString ("F7") + " / Euler: " +
                       rotation.eulerAngles.ToString());

I'm trying to un-rotate a quaternion, aligning it with the axis, and then rotate it back to where it was originally. But with every iteration it seems to lose precision and just after 20 iterations the rotation disappears. Here is an example, which is a simplification of my code:

Quaternion rotation = Quaternion.Euler (0f, 90f, 0f);
Debug.Log ("Before: " + rotation.ToString ("F7") + " / Euler: " +
  rotation.eulerAngles.ToString());

int iterations = 1;
for (int i = 0; i < iterations; i++) {              
    var currentRotation = rotation;
    rotation = Quaternion.Inverse (currentRotation) * rotation;
    rotation = currentRotation * rotation;
}
            
Debug.Log ("After:  " + rotation.ToString ("F7") + " / Euler: " +
  rotation.eulerAngles.ToString());
Tweeted twitter.com/#!/StackGameDev/status/462697576132009984
Source Link
Celtc
  • 155
  • 1
  • 10

Unity - Quaternion - Rotate / Unrotate Error

I'm trying to unrotate a quaternion, aligning it with the axis, and then rotate it back to where it was originally. But with every iteration it seems to lose precision and just after 20 iterations the rotation dissapears. Here is an example, which is a simplification of my code:

            Quaternion rotation = Quaternion.Euler (0f, 90f, 0f);
            Debug.Log ("Before: " + rotation.ToString ("F7") + " / Euler: " +
                       rotation.eulerAngles.ToString());

            int iterations = 1;
            for (int i = 0; i < iterations; i++) {              
                var currentRotation = rotation;
                rotation = Quaternion.Inverse (currentRotation) * rotation;
                rotation = currentRotation * rotation;
            }
            
            Debug.Log ("After:  " + rotation.ToString ("F7") + " / Euler: " +
                       rotation.eulerAngles.ToString());

With 1 iteration the output is:

Before: (0.0000000, 0.7071068, 0.0000000, 0.7071068) / Euler: (0.0, 90.0, 0.0)
After:  (0.0000000, 0.7071067, 0.0000000, 0.7071067) / Euler: (0.0, 90.0, 0.0)

With 5 iterations:

Before: (0.0000000, 0.7071068, 0.0000000, 0.7071068) / Euler: (0.0, 90.0, 0.0)
After:  (0.0000000, 0.7071019, 0.0000000, 0.7071019) / Euler: (0.0, 90.0, 0.0)

With 10 iterations:

Before: (0.0000000, 0.7071068, 0.0000000, 0.7071068) / Euler: (0.0, 90.0, 0.0)
After:  (0.0000000, 0.7059279, 0.0000000, 0.7059279) / Euler: (0.0, 90.0, 0.0)

With 15 iterations:

Before: (0.0000000, 0.7071068, 0.0000000, 0.7071068) / Euler: (0.0, 90.0, 0.0)
After:  (0.0000000, 0.4714038, 0.0000000, 0.4714038) / Euler: (0.0, 90.0, 0.0)

And finally with 19 iterations

Before: (0.0000000, 0.7071068, 0.0000000, 0.7071068) / Euler: (0.0, 90.0, 0.0)
After:  (0.0000000, 0.0000000, 0.0000000, 0.0000000) / Euler: (0.0, 0.0, 0.0)

At the 19th iteration the euler angles becomes zero, and at previous iterations altough the euler angles are still correct, if I rotate a vector with the quaternion its magnitude is changed.

I hope you can help me and sorry for my bad english!