@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;
}
//------------------------------------------------------------------------------------------------------------
/**
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;
}