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?
Ich würde mich sehr über Hilfe freuen.
Hier auch noch einmal das komplette AS3:
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);
}
}
}