Below is the Euler transformation, written in Actionscript:
function eulerTransform(x1,y1,z1,xr,yr,zr,xo,yo,zo){
var x2,y2,z2,pts=new Array();
// Rotate about X axis
x2=x1;
y2=y1*Math.cos(xr)+z1*Math.sin(xr);
z2=z1*Math.cos(xr)-y1*Math.sin(xr);
// Rotate about Y axis
y1=y2;
x1=x2*Math.cos(yr)-z2*Math.sin(yr);
z1=x2*Math.sin(yr)+z2*Math.cos(yr);
// Rotate about Z axis
z2=z1;
x2=x1*Math.cos(zr)-y1*Math.sin(zr);
y2=x1*Math.sin(zr)+y1*Math.cos(zr);
// Apply offsets in 3D space
pts[0]=x2+xo;
pts[1]=y2+yo;
pts[2]=z2+zo;
return(pts);
}
And below is the equivalent Quaternion transform, which takes the same arguments:
function quaternionTransform(x1,y1,z1,xr,yr,zr,xo,yo,zo){
var xc,yc,zc,xs,ys,zs,qr,q1,q2,q3;
xc=Math.cos(xr*0.5);
yc=Math.cos(yr*0.5);
zc=Math.cos(zr*0.5);
xs=Math.sin(xr*0.5);
ys=Math.sin(yr*0.5);
zs=Math.sin(zr*0.5);
qr=new Array();
qr[0]=xc*yc*zc-xs*ys*zs;
qr[1]=xs*yc*zc+xc*ys*zs;
qr[2]=xc*ys*zc-xs*yc*zs;
qr[3]=xs*ys*zc+xc*yc*zs;
q1=new Array(qr[0],0-qr[1],0-qr[2],0-qr[3]);
q2=new Array(0,x1,y1,z1);
q3=new Array(qr[0],qr[1],qr[2],qr[3]);
q2=qMult(q2,q1);
q3=qMult(q3,q2);
q3[1]+=xo;
q3[2]+=yo;
q3[3]+=zo;
q3.shift();
return(q3);
}
function qMult(m0,m1){
var m2=new Array();
m2[0]=m0[0]*m1[0]-m0[1]*m1[1]-m0[2]*m1[2]-m0[3]*m1[3];
m2[1]=m0[0]*m1[1]+m0[1]*m1[0]+m0[2]*m1[3]-m0[3]*m1[2];
m2[2]=m0[0]*m1[2]+m0[2]*m1[0]+m0[3]*m1[1]-m0[1]*m1[3];
m2[3]=m0[0]*m1[3]+m0[3]*m1[0]+m0[1]*m1[2]-m0[2]*m1[1];
return(m2);
}
The Quaternion code includes a 4*1 Array multiplier, since AS2 lacks the ability to multiply matrices, as far as I know.
I have attached a quick demonstration of the differences which I will include in a tutorial.