- Home /
Checking for quaternion values to not be NaN
Every so often, a camera rotation script would output (NaN,NaN,NaN,NaN) for rotation... Is there a way to check for output that is not NaN before assigning the rotation?
Answer by dentedpixel · Jun 02, 2013 at 08:41 PM
if(!System.Single.IsNaN( someVariable ))
// assign rotation
Answer by Paulo33 · May 09, 2014 at 05:30 PM
Well, i know this is a old post but, i will help others with simple soluction for check if "float variable" is a NaN or not.
if(float.IsNaN("YOURFLOATVARIABLE")){
//Your condition...
}
else{
//Your "else" condition
}
Answer by DMGregory · May 09, 2014 at 05:44 PM
I have problems with either NaN or a zero quaternion showing up from time to time, and throwing an error somewhere inside Quaternion.Lerp.
To deal with that, I like to use an extension method - I keep a static class with a few of them in each project, utilities to do things like check if a UnityEngine.Object is null off of the main thread. Here's just the relevant part:
public static class UnityExtensionMethods {
/// <summary>
/// Determines whether the quaternion is safe for interpolation or use with transform.rotation.
/// </summary>
/// <returns><c>false</c> if using the quaternion in Quaternion.Lerp() will result in an error (eg. NaN values or zero-length quaternion).</returns>
/// <param name="quaternion">Quaternion.</param>
public static bool IsValid(this Quaternion quaternion)
{
bool isNaN = float.IsNaN(quaternion.x + quaternion.y + quaternion.z + quaternion.w);
bool isZero = quaternion.x == 0 && quaternion.y == 0 && quaternion.z == 0 && quaternion.w == 0;
return !(isNaN || isZero);
}
}
This lets me write
if(myQuaternion.IsValid())
before using a quaternion in any Lerps or assigning it as a rotation.
Answer by tonehog · Nov 02, 2011 at 09:34 AM
This worked on my browsers JS console:
if (!NaN) console.debug("HI");
Hope this helps.