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)
}
}
}
}
}