package geometry._theory { import away3d.core.math.Quaternion; import away3d.primitives.Sphere; import flash.events.Event; import flash.geom.Matrix3D; import flash.geom.Orientation3D; import flash.geom.Vector3D; import flash.utils.getTimer; import triga.shapes.Tick; import triga.shapes.XYZ; /** * @author Nicolas Barradeau * http://en.nicoptere.net */ public class J_QuaternionSlerp extends BaseScene { static public const RADIANS_TO_DEGREES:Number = 180 / Math.PI; static public const DEGREES_TO_RADIANS:Number = Math.PI / 180; private var vectorSphere:Sphere; private var quaternionTick:Tick; private var pos:Vector3D; private var Qstart:Quaternion; private var Qend:Quaternion; private var mStart:Matrix3D; private var mEnd:Matrix3D; public function J_QuaternionSlerp() { setup(); addChild( GlobalTextField.instance ); pos = new Vector3D( 100,0,0 ); addMesh( new XYZ( 100 ), quaternionTick = new Tick( null, 32, RED ), new Sphere( GREEN, 100 ), vectorSphere = new Sphere( BLUE, 8 ), new Tick( pos, 25, WHITE ) ); GREEN.alpha = .25; //we choose 2 angles var startAngle:Number = Math.PI / 2; var endAngle:Number = -Math.PI / 2; //preparing 2 Quaternions to interpolate Qstart = new Quaternion(); Qstart.fromEulerAngles( startAngle, startAngle, startAngle ); Qend = new Quaternion(); Qend.fromEulerAngles( endAngle, endAngle, endAngle ); //preparing 2 matrices to interpolate var position:Vector3D = new Vector3D(); var scale:Vector3D = new Vector3D(1,1,1); mStart = new Matrix3D(); mStart.recompose( Vector.( [ position, new Vector3D( startAngle, startAngle, startAngle ), scale ] ) ); mEnd = new Matrix3D(); mEnd.recompose( Vector.( [ position, new Vector3D( endAngle, endAngle, endAngle ), scale ] ) ); addEventListener( Event.ENTER_FRAME, oef ); } private function oef(e:Event):void { var t:Number = .5 + Math.sin( ( getTimer() * .1 ) * DEGREES_TO_RADIANS ) * .5; //spherical interpolation with the Quaternions var q:Quaternion = new Quaternion(); q.slerp( Qstart, Qend, t ); quaternionTick.position = q.rotatePoint( pos ); //linear interpolation with the matrices var m:Matrix3D = mStart.clone(); m.interpolateTo( mEnd, t ); vectorSphere.position = m.transformVector( pos ); //apart from the angles management, they behave the same... } } }