-
Notifications
You must be signed in to change notification settings - Fork 36
Description
//------------------------------------------------------------------------------------------------------------
/**
-
Rotate the object passed as param by the angle specified. The rotation happen only about the specified axis
-
@param SourceObject:Object - The object that must by rotated
-
@param X:Number( Degrees ) - The angle, of rotation
-
@param Y:Number( Degrees ) - The angle, of rotation
-
@param RotationAxis:Vector3D - The vector tha specify the axis of rotation
*/
//------------------------------------------------------------------------------------------------------------
public function RotateObjectByArbitraryAxis( SourceObject:Object, X:Number, Y:Number, RotationAxis:Vector3D ):void
{// GET THE ORIGINAL OBJECT TRANSFORM MATRIX
var m:Matrix3D = SourceObject.transform;
// ROTATION EULER BY QUATERNION
var rv:Vector3D = new Vector3D();// The first Vector3D object holds the translation elements.
// The second Vector3D object holds the rotation elements.
// The third Vector3D object holds the scale elements.
var VM:Vector. = m.decompose();
// ROTATION QUATERNION
var QRotation:Quaternion = new Quaternion();// NEW TRANSFORM MATRIX
var mm:Matrix3D = new Matrix3D();// A Vector of 16 Numbers, where every four elements is a column of a 4x4 matrix.
var RawMatrixData:Vector. = m.rawData;// ONLY ROTATION DATA REMAIN UNCHANGED
RawMatrixData[3] = 0;
RawMatrixData[7] = 0;
RawMatrixData[11] = 0;
RawMatrixData[12] = 0;
RawMatrixData[13] = 0;
RawMatrixData[14] = 0;
RawMatrixData[15] = 1;
// COPY ROTATION DATA IN TO THE NEW TRANSFORM MATRIX
mm.copyRawDataFrom( RawMatrixData );// MAKE A NEW QUATERNION FROM THE NEW TRANSFORM MATRIX
QRotation.fromMatrix( mm );
// NORMALIZE QUATERNION
QRotation.normalize();// ADD ROTATION BY ARBITRARY AXIS
if( RotationAxis.x ) // ROLL
{
// Add rotation about X axis
QRotation.fromAxisAngle( Vector3D.X_AXIS, X * DEGREES_TO_RADIANS );
}
else if( RotationAxis.y ) // YAW
{
// Add rotation about Y axis
QRotation.fromAxisAngle( Vector3D.Y_AXIS, Y * DEGREES_TO_RADIANS );
}
else if( RotationAxis.z ) // PITCH
{
// Add rotation about Z axis
QRotation.fromAxisAngle( Vector3D.Z_AXIS, X * DEGREES_TO_RADIANS );
}//
QRotation.normalize();
// GET ANGLE OF ROTATIONS FROM QUATERNION
QRotation.toEulerAngles( rv );// UPDATE THE NEW TRANSFORM MATRIX
mm.appendRotation( rv.x * RADIANS_TO_DEGREES, Vector3D.X_AXIS );
mm.appendRotation( rv.y * RADIANS_TO_DEGREES, Vector3D.Y_AXIS );
mm.appendRotation( rv.z * RADIANS_TO_DEGREES, Vector3D.Z_AXIS );
mm.appendTranslation( VM[0].x, VM[0].y, VM[0].z );
mm.appendScale( VM[2].x, VM[2].y, VM[2].z );
// COPY THE NEW MATRIX IN TO THE ORIGINAL MATRIX
m.copyFrom( mm );
// APPLY THE NEW TRANSFORM TO THE OBJECT
SourceObject.transform = m;
}