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.

Reply via email to