also one detail, camera is standard of type Camera3D
so view.camera.x, y, z is enough, no need to declare one.
Fabrice
Sent from an iPhone without Flash
I would check if the mouse coordinates are correct in your case.
Fabrice
package{
import flash.display.*;
import flash.events.*;
import away3d.containers.Scene3D;
import away3d.containers.View3D;
import away3d.core.base.Object3D;
import away3d.core.render.*;
import away3d.cameras.HoverCamera3D;
import away3d.events.MouseEvent3D;
import away3d.primitives.Sphere;
import away3d.tools.Drag3D;
public class Drag3DTest extends Sprite
{
public var scene:Scene3D;
private var view:View3D;
private var drag3d:Drag3D;
private var cameraDistance:Number = 3000;
private var Hcamera:HoverCamera3D;
private var move:Boolean = false;
private var lastPanAngle:Number;
private var lastTiltAngle:Number;
private var lastMouseX:Number;
private var lastMouseY:Number;
public function Drag3DTest()
{
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event):void
{
initSWFEnvironement();
populate();
}
private function initSWFEnvironement():void
{
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.stageFocusRect = false;
Hcamera = new HoverCamera3D();
view = new View3D({camera:Hcamera});
scene = view.scene;
view.x = stage.stageWidth * .5;
view.y = stage.stageHeight * .5;
Hcamera.distance = cameraDistance;
Hcamera.tiltAngle = Hcamera.panAngle = 45;
addChild(view);
//scene.addChild(new Trident(1000, true));
start();
}
public function start():void
{
if(!hasEventListener(Event.ENTER_FRAME)){
addEventListener(Event.ENTER_FRAME, refreshScreen);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseIsDown);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseIsUp);
stage.addEventListener(Event.RESIZE, onResize);
}
}
private function populate():void
{
var _debugPrimitive:Sphere = new Sphere({radius:50, material:null});
scene.addChild(_debugPrimitive);
drag3d = new Drag3D(view);
drag3d.plane = "xz";
drag3d.debug = true;
drag3d.object3d = _debugPrimitive;
Hcamera.hover(true);
}
private function refreshScreen(event:Event = null):void
{
if (move) {
Hcamera.panAngle = 0.7*(stage.mouseX - lastMouseX) + lastPanAngle;
Hcamera.tiltAngle = 0.7*(stage.mouseY - lastMouseY) + lastTiltAngle;
}
Hcamera.hover();
drag3d.updateDrag();
view.render();
}
private function onResize(event:Event):void
{
view.x = stage.stageWidth *.5;
view.y = stage.stageHeight *.5;
}
private function onMouseIsDown(event:MouseEvent):void
{
lastPanAngle = Hcamera.panAngle;
lastTiltAngle = Hcamera.tiltAngle;
lastMouseX = stage.mouseX;
lastMouseY = stage.mouseY;
move = true;
stage.addEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
}
private function onMouseIsUp(event:MouseEvent):void
{
move = false;
stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
}
private function onStageMouseLeave(event:Event):void
{
move = false;
stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
Prefab uses a more complex drag system, but yes it always comes down to ray/plane intersection anyway.
Just think this class might help few to properly implement drag in 3d (and the easy way) into their apps/games.
Fabrice
in meanwhile keep away from cam :))
Fabrice
because someone was writting it probably at 3 am ;)(Fabrice?)