hi, here are 3 method you can had to the Quaternion class : quaternion2Matrix(quaternion):Matrix3D createFromMatrix(matrix3D):Quaternion slerp(qa:Quaternion, qb:Quaternion,alpha:Number ):Quaternion
public static function slerp( qa:Quaternion, qb:Quaternion,
alpha:Number ):Quaternion {
var quatSlerp:Quaternion = new Quaternion;
var angle:Number=qa.w*qb.w+qa.x*qb.x+qa.y*qb.y
+qa.z*qb.z;
if (angle<0.0) {
qa.x*=-1.0;
qa.y*=-1.0;
qa.z*=-1.0;
qa.w*=-1.0;
angle*=-1.0;
}
var scale:Number;
var invscale:Number;
if ((angle + 1.0) > 0.000001) {
if ((1.0 - angle) >= 0.000001) {
var theta:Number=Math.acos
(angle);
var invsintheta:Number=1.0/
Math.sin(theta);
scale = Math.sin(theta * (1.0-
alpha)) * invsintheta;
invscale=Math.sin(theta*alpha)
*invsintheta;
} else {
scale=1.0-alpha;
invscale=alpha;
}
} else {
qb.y=- qa.y;
qb.x=qa.x;
qb.w=- qa.w;
qb.z=qa.z;
scale = Math.sin(Math.PI * (0.5 -
alpha));
invscale=Math.sin(Math.PI*alpha);
}
quatSlerp.x = scale * qa.x + invscale * qb.x;
quatSlerp.y = scale * qa.y + invscale * qb.y;
quatSlerp.z = scale * qa.z + invscale * qb.z;
quatSlerp.w = scale * qa.w + invscale * qb.w;
return quatSlerp;
}
static public function createFromMatrix
( matrix:Matrix3D ):Quaternion {
var quat:Quaternion = new Quaternion();
var s:Number;
var q:Array=new Array(4);
var i:int,j:int,k:int;
var tr:Number=matrix.sxx+matrix.syy
+matrix.szz;
// check the diagonal
if (tr>0.0) {
s=Math.sqrt(tr+1.0);
quat.w=s/2.0;
s=0.5/s;
quat.x = (matrix.szy - matrix.syz) *
s;
quat.y = (matrix.sxz - matrix.szx) *
s;
quat.z = (matrix.syx - matrix.sxy) *
s;
} else {
// diagonal is negative
var nxt:Array=[1,2,0];
var m:Array = [
[matrix.sxx, matrix.sxy, matrix.sxz,
matrix.tx],
[matrix.syx, matrix.syy, matrix.syz,
matrix.ty],
[matrix.szx, matrix.szy, matrix.szz,
matrix.tz]
];
i=0;
if (m[1][1]>m[0][0]) {
i=1;
}
if (m[2][2]>m[i][i]) {
i=2;
}
j=nxt[i];
k=nxt[j];
s = Math.sqrt((m[i][i] - (m[j][j] + m
[k][k])) + 1.0);
q[i]=s*0.5;
if (s!=0.0) {
s=0.5/s;
}
q[3] = (m[k][j] - m[j][k]) * s;
q[j] = (m[j][i] + m[i][j]) * s;
q[k] = (m[k][i] + m[i][k]) * s;
quat.x=q[0];
quat.y=q[1];
quat.z=q[2];
quat.w=q[3];
}
return quat;
}
public static function quaternion2Matrix
(quat:Quaternion):Matrix3D {
var _matrix:Matrix3D=new Matrix3D ;
var xx:Number=quat.x*quat.x;
var xy:Number=quat.x*quat.y;
var xz:Number=quat.x*quat.z;
var xw:Number=quat.x*quat.w;
var yy:Number=quat.y*quat.y;
var yz:Number=quat.y*quat.z;
var yw:Number=quat.y*quat.w;
var zz:Number=quat.z*quat.z;
var zw:Number=quat.z*quat.w;
_matrix.sxx = 1 - 2 * ( yy + zz );
_matrix.sxy = 2 * ( xy - zw );
_matrix.sxz = 2 * ( xz + yw );
_matrix.syx = 2 * ( xy + zw );
_matrix.syy = 1 - 2 * ( xx + zz );
_matrix.syz = 2 * ( yz - xw );
_matrix.szx = 2 * ( xz - yw );
_matrix.szy = 2 * ( yz + xw );
_matrix.szz = 1 - 2 * ( xx + yy );
return _matrix;
}
hope this will be helpfull.
