class quaternion { public var x, y, z, w:Number; //"w" - rotatia. function quaternion(a, b, c, d) { x = a ? a : 0; y = b ? b : 0; z = c ? c : 0; w = d ? d : 1; } public function get _x():Number { return x; } public function get _y():Number { return y; } public function get _z():Number { return z; } public function get _w():Number { return w; } public function fromPoint(a:Number, b:Number, c:Number) { x = a; y = b; z = c; w = 0; } public function fromAxisAngle(a:Number, b:Number, c:Number, d:Number):Void { var ca = Math.cos(d/2); var sa = Math.sin(d/2); var m = Math.sqrt(a*a + b*b + c*c); //m = magnitude. sau asa ceva. x = a/m * sa; y = b/m * sa; z = c/m * sa; w = ca; } public function concat(q:quaternion):Void { var w1 = w; var x1 = x; var y1 = y; var z1 = z; var w2 = q._w; var x2 = q._x; var y2 = q._y; var z2 = q._z; w = w1*w2 - x1*x2 - y1*y2 - z1*z2; x = w1*x2 + x1*w2 + y1*z2 - z1*y2; y = w1*y2 + y1*w2 + z1*x2 - x1*z2; z = w1*z2 + z1*w2 + x1*y2 - y1*x2; } public function invert():Void { x = -x; y = -y; z = -z; } public function copy():quaternion { return new quaternion(x,y,z,w); } }