A Flash Developer Resource Site

Results 1 to 3 of 3

Thread: help with pv3d quanternion rotation of sphere

  1. #1
    Junior Member
    Join Date
    Nov 2010
    Posts
    5

    help with pv3d quanternion rotation of sphere

    I am trying to rotate a sphere with the mouse on the x and y axis but the sphere keeps 'roll'ing and flipping it all around. Not sure how to change that? Please help.

    package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;

    import org.papervision3d.core.math.Matrix3D;
    import org.papervision3d.core.math.Number3D;
    import org.papervision3d.core.math.Quaternion;
    import org.papervision3d.core.utils.Mouse3D;
    import org.papervision3d.events.InteractiveScene3DEvent;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.objects.primitives.Sphere;
    import org.papervision3d.materials.BitmapFileMaterial;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;



    public class Main extends Sprite
    {
    private var scene:Scene3D;
    private var viewport:Viewport3D;
    private var camera:Camera3D;
    private var renderEngine:BasicRenderEngine;
    private var sphere:Sphere;
    private var bitmapMaterial:BitmapFileMaterial;

    private var drag:Boolean;
    private var isDown:Boolean;
    private var startX : Number;
    private var startY : Number;
    private var vx : Number = 0;
    private var vy : Number = 0;

    //private var isMouseDown:Boolean = false;
    //private var sceneWidth:Number;
    //private var sceneHeight:Number;


    public function Main()
    {
    init();
    stage.frameRate = 40;
    scene = new Scene3D();
    camera = new Camera3D();

    bitmapMaterial = new BitmapFileMaterial("images/pano.jpg")
    bitmapMaterial.doubleSided = true;
    sphere = new Sphere(bitmapMaterial, 200, 100, 100);
    scene.addChild(sphere);
    sphere.x=0;
    sphere.y=0;
    sphere.z=0;

    viewport = new Viewport3D(800,600);
    this.addChild(viewport);

    camera.x = 0;
    camera.y = -300;
    camera.z = 0;


    renderEngine = new BasicRenderEngine();
    renderEngine.renderScene(scene,camera,viewport);
    this.addEventListener(Event.ENTER_FRAME,render);

    stage.addEventListener(MouseEvent.MOUSE_DOWN, downHandler);
    stage.addEventListener(MouseEvent.MOUSE_UP, upHandler);
    }

    //private function init():void{
    //sceneWidth = stage.stageWidth;
    //sceneHeight = stage.stageHeight}


    //private function stage_mouseDownHandler(event:MouseEvent):void{
    //isMouseDown = true;}

    //private function stage_mouseUpHandler(event:MouseEvent):void{
    //isMouseDown = false}

    private function startFragFnc(e:MouseEvent):void {
    drag = true;
    stage.addEventListener(MouseEvent.MOUSE_UP, stopDRagFnc);
    }


    private function stopDRagFnc(e:MouseEvent):void {
    drag = false;
    }


    private function downHandler(event : MouseEvent) : void {
    startX = mouseX;
    startY = mouseY;
    isDown = true;
    stage.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
    }


    private function upHandler(event : MouseEvent) : void {
    isDown = false;
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
    }


    private function moveHandler(event : MouseEvent) : void {
    vx = (mouseX - startX) * .2;
    vy = (mouseY - startY) * .2;
    startX = mouseX;
    startY = mouseY;
    quaternionXYZ(-vy,-vx,0)
    }


    private function render(e:Event):void{
    //if(isMouseDown) {
    //camera.yaw(viewport.containerSprite.mouseX / sceneWidth * 5);
    //camera.pitch(viewport.containerSprite.mouseY / sceneHeight * 5)}

    renderEngine.renderScene(scene,camera,viewport)
    }




    public function quaternionXYZ(degreeX:Number = 0,degreeY:Number = 0,degreeZ:Number = 0):void {
    var pos1:Quaternion = Quaternion.createFromMatrix(camera.transform);
    var pos2:Quaternion = Quaternion.createFromEuler(degreeY, degreeZ, degreeX, true);
    pos2.normalize();
    pos2.mult(pos1);
    pos2.normalize();
    camera.copyTransform(Matrix3D.quaternion2matrix(po s2.x, pos2.y, pos2.z, pos2.w));
    }
    private function tick(e:Event):void
    {
    //easing
    if(!isDown) {
    if(vx != 0 || vy != 0) {
    vx *= .5;
    vy *= .5;
    if(Math.abs(vx) < .1) {
    vx = 0;
    }
    if(Math.abs(vy) < .4) {
    vy = 0;
    }
    //try this
    //sphere.rotationY -= vx;
    //sphere.rotationX -= vy;

    //or this
    sphere.localRotationY -= vx;
    sphere.localRotationX -= vy;

    //or this
    //quaternionXYZ(-vy,-vx,0)
    }
    }
    }
    }
    }

  2. #2
    Junior Member
    Join Date
    Nov 2010
    Posts
    5
    If someone could at least just tell me why it is rolling like that, I could try to find out how to fix it. Do I need to set up boundaries? Also, I am having trouble tweening the rotations with quaternions.

  3. #3
    Junior Member
    Join Date
    Nov 2010
    Posts
    5
    Thanks for the help flash kit forum...


    kys

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  




Click Here to Expand Forum to Full Width

HTML5 Development Center