Caurina Transitions für weiche Bewegungen

intercorni

Erfahrenes Mitglied
Hallo,

ich quäle mich als AS3 Neuling durch ein Beispiel, welches ich
mit Papervision3D realisieren möchte. Und zwar geht es um eine
Sphere, auf die ich ein Erdmaterial mappe.
Mit der Maus kann man diese Weltkugel dann drehen.
Nun würde ich gerne dieses "Drehen" etwas eleganter gestalten.
In einigen Beispielen wurde dazu möglicher weise die Caurina Transitions
verwendet. Allerdings habe ich überhaupt keinen Schimmer davon, wie man
diese Transition in meinem Beispiel anwenden kann.
Hier das das von mir verwendete AS3 der Maussteuerung. Hier sollte doch
die Caurina Transitions eingesetzt werden, oder?

PHP:
stage.addEventListener(MouseEvent.MOUSE_DOWN, stage_mouseDownHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler);
		}		
		
		private function stage_mouseDownHandler(event:MouseEvent):void
		{
			isMouseDown = true;
		}
		
		private function stage_mouseUpHandler(event:MouseEvent):void
		{
			isMouseDown = false;	
		}
		
		override protected function onRenderTick(event:Event=null):void
		{
			var currentMousePoint:Point = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
			
			if(isMouseDown)
			{
				var difference:Point = currentMousePoint.subtract(previousMousePoint);
	 			var vector:Number3D = new Number3D(difference.x, difference.y, 0);
	 			
				var rotationAxis:Number3D = Number3D.cross(vector, FORWARD);
				rotationAxis.normalize();
				
				var distance:Number = Point.distance(currentMousePoint, previousMousePoint);
				var rotationMatrix:Matrix3D = Matrix3D.rotationMatrix(rotationAxis.x, -rotationAxis.y, rotationAxis.z, distance/250);
	 			
				sphere.transform.calculateMultiply3x3(rotationMatrix, sphere.transform);
			}
			
			previousMousePoint = currentMousePoint;
			
			super.onRenderTick(event);
		}

Ich würde mich sehr über Hilfe freuen.
Hier auch noch einmal das komplette AS3:

PHP:
package
{
	//flash
	import caurina.transitions.Tweener;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	//papervision
	import org.papervision3d.core.math.Matrix3D;
	import org.papervision3d.core.math.Number3D;
	import org.papervision3d.view.BasicView;
	
	//light
	import org.papervision3d.lights.PointLight3D;
	
	//material
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
	import org.papervision3d.materials.BitmapFileMaterial;
	import org.papervision3d.materials.BitmapMaterial;
	import org.papervision3d.materials.ColorMaterial;     
	import org.papervision3d.materials.special.LineMaterial;
	
	//primitives
	import org.papervision3d.core.geom.Lines3D;
    import org.papervision3d.core.geom.renderables.Line3D;
	import org.papervision3d.core.geom.renderables.Vertex3D;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.objects.primitives.Plane;
	
	[SWF(width="1024", height="768", backgroundColor="#000000", frameRate="30")]
	public class Trackball extends BasicView
	{
		private static const FORWARD:Number3D = new Number3D(0, 0, 1);
		private var erdmaterial: BitmapFileMaterial; 
		private var sphere:Sphere;
		private var primitive: Plane;
		private var previousMousePoint:Point = new Point();
		private var isMouseDown:Boolean = false;
		private var _lines3d : Lines3D;
      	private var _line3d : Line3D;
      	private var _angle : Number = 0;
		
		public function Trackball()
		{
			//Erdmaterial
			erdmaterial = new BitmapFileMaterial("assets/earthmap1k.jpg");
			erdmaterial.doubleSided = true;
			erdmaterial.smooth = true;
			erdmaterial.interactive = true;		
			
			//Erdkugel
			sphere = new Sphere(erdmaterial, 100, 18, 18);
			sphere.x = 0;
			sphere.y = 0;
			sphere.z = 0; //-670
			scene.addChild(sphere);
			
			startRendering();
			
			stage.addEventListener(MouseEvent.MOUSE_DOWN, stage_mouseDownHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler);
		}		
		
		private function stage_mouseDownHandler(event:MouseEvent):void
		{
			isMouseDown = true;
		}
		
		private function stage_mouseUpHandler(event:MouseEvent):void
		{
			isMouseDown = false;	
		}
		
		override protected function onRenderTick(event:Event=null):void
		{
			var currentMousePoint:Point = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
			
			if(isMouseDown)
			{
				var difference:Point = currentMousePoint.subtract(previousMousePoint);
	 			var vector:Number3D = new Number3D(difference.x, difference.y, 0);
	 			
				var rotationAxis:Number3D = Number3D.cross(vector, FORWARD);
				rotationAxis.normalize();
				
				var distance:Number = Point.distance(currentMousePoint, previousMousePoint);
				var rotationMatrix:Matrix3D = Matrix3D.rotationMatrix(rotationAxis.x, -rotationAxis.y, rotationAxis.z, distance/250);
	 			
				sphere.transform.calculateMultiply3x3(rotationMatrix, sphere.transform);
			}
			
			previousMousePoint = currentMousePoint;
			
			super.onRenderTick(event);
		}
	}
}
 
An dieser Stelle müsste ich doch das Caurina Tweening einfügen, oder?

PHP:
sphere.transform.calculateMultiply3x3(rotationMatrix, sphere.transform);

Und die Caurina Hilfe zeigt, wie es angewendet werden soll

PHP:
Tweener.addTween(myMovie, {x:10, y:10, time:1, transition:"linear"});

Nur wie kann ich das jetzt miteinander kombinieren? Wie schreibt man das richtig?
 
Habe einen Tipp bekommen:

Entweder so:

PHP:
Tweener.addTween( rotationAxis, { x:zielX, y:zielY, z:zielZ, time:1, transition:"linear" });

Oder, wenn der Wert immer neu gesetzt werden muss, eventuell so:

PHP:
Tweener.addTween( rotationAxis, { x:zielX, y:zielY, z:zielZ, time:1, transition:"linear", onUpdate:setMatrix });

function setMatrix():void
{
  Matrix3D.rotationMatrix( rotationAxis.x,*-rotationAxis.y,*rotationAxis.z,*distance/250 );
}

Allerdings weiß ich nun nicht, an welche Stelle ich dieses einfügen muss bzw.
ob es eine bisher geschriebene Funktion ersetzt. Würde mich wirklich sehr über Hilfe freuen.
 
Zurück