Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // EXTENDED MATH FUNCTIONS
- // Converts from degrees to radians.
- Math.radians = function(degrees)
- {
- return degrees * Math.PI / 180;
- };
- // Converts from radians to degrees.
- Math.degrees = function(radians)
- {
- return radians * 180 / Math.PI;
- };
- // Converts from Axis Angle in radians to Euler in degrees
- Math.AxisAngleToEuler = function(x, y, z, angle)
- {
- var heading,attitude,bank;
- var s=Math.sin(angle);
- var c=Math.cos(angle);
- var t=1-c;
- // if axis is not already normalised then uncomment this
- // double magnitude = Math.sqrt(x*x + y*y + z*z);
- // if (magnitude==0) throw error;
- // x /= magnitude;
- // y /= magnitude;
- // z /= magnitude;
- if ((x*y*t + z*s) > 0.998)
- { // north pole singularity detected
- heading = 2*atan2(x*Math.sin(angle/2),Math.cos(angle/2));
- attitude = Math.PI/2;
- bank = 0;
- }
- else if ((x*y*t + z*s) < -0.998)
- { // south pole singularity detected
- heading = -2*atan2(x*Math.sin(angle/2),Math.cos(angle/2));
- attitude = -Math.PI/2;
- bank = 0;
- }
- else
- {
- heading = Math.atan2(y * s- x * z * t , 1 - (y*y+ z*z ) * t);
- attitude = Math.asin(x * y * t + z * s) ;
- bank = Math.atan2(x * s - y * z * t , 1 - (x*x + z*z) * t);
- }
- return {'x':Math.degrees(bank),'y':Math.degrees(heading),'z':Math.degrees(attitude)};
- };
- // Converts from Euler in degrees to Axis Angle in radians
- Math.EulerToAxisAngle = function(bankDegrees, headingDegrees, attitudeDegrees)
- {
- var Xradians = Math.radians(bankDegrees); // bank
- var Yradians = Math.radians(headingDegrees); // heading
- var Zradians = Math.radians(attitudeDegrees); // attitude
- // Convert Euler to Axis-Angle
- // NWN appears to use an axis angle
- // downloaded from http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToAngle/
- var c1 = Math.cos(Yradians/2); // heading
- var s1 = Math.sin(Yradians/2);
- var c2 = Math.cos(Zradians/2);// altitude
- var s2 = Math.sin(Zradians/2);
- var c3 = Math.cos(Xradians/2); // bank
- var s3 = Math.sin(Xradians/2);
- var c1c2 = c1*c2;
- var s1s2 = s1*s2;
- var w =c1c2*c3 - s1s2*s3;
- var x =c1c2*s3 + s1s2*c3;
- var y =s1*c2*c3 + c1*s2*s3;
- var z =c1*s2*c3 - s1*c2*s3;
- w = 2 * Math.acos(w);
- var norm = x*x+y*y+z*z;
- if( norm==0 || norm <= 0.0001)
- { // when all euler angles are zero angle = 0 so
- // we can set axis to anything to avoid divide by zero
- x="1.0";
- y=z="0.0";
- }
- else
- {
- norm = Math.sqrt(norm);
- x = (x/norm);
- y = (y/norm);
- z = (z/norm);
- }
- return {'x':x,'y':y,'z':z,'w':w};
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement