Thanks for the test class.

I was able to reproduce my problem in your code by placing the camera
closer to the sphere and making the sphere smaller.  Is there a bug in
the Drag3D class or am I just not using the camera correctly?

http://abowman.nozonenet.com/away3d/Drag3DTest.as
http://abowman.nozonenet.com/away3d/Drag3DTest.swf

Thanks for your help.

BTW, I purchased the new Away3D book and I'm finding it very helpful.
I was able to get my code working using that, but would really like to
be able to use this Drag3D class rather than using a plane primitive.


On Jun 1, 5:25 am, Fabrice3D <[email protected]> wrote:
> I haven't debugged your code, (that would be your job :)) )
> but made quick test class using latest 3.5 to test class itself, all seams 
> fine to me.
>
> 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);  
>   
>         }
>
>         }
>
> }
>
> On Jun 1, 2010, at 1:08 AM, abowman wrote:
>
> > I tried calling the onResize function at the beginning of my init
> > function and that didn't solve the problem.
>
> > On May 31, 4:54 pm, Fabrice3D <[email protected]> wrote:
> >> looked very quickly at your code,
> >> since class caches few values to spare calcs, try call resize(); before 
> >> you do setup the class.
>
> >> let me know how it goes, I will in case it doesn't fix your issue, try 
> >> your class tomorrow.
>
> >> also one detail, camera is standard of type Camera3D
> >> so view.camera.x, y, z is enough, no need to declare one.
>
> >> Fabrice
>
> >> On May 31, 2010, at 6:09 PM, abowman wrote:
>
> >>> Thanks for the class Fabrice.
>
> >>> For some reason, when I move the mouse the sphere I'm dragging doesn't
> >>> stay under the mouse.
>
> >>>http://abowman.nozonenet.com/away3d/dragTest.swf
> >>>http://abowman.nozonenet.com/away3d/DragTest.as
>
> >>> What do I need to do to fix this?
>
> >>> Thanks
>
> >>> On May 21, 4:49 am, Fabrice3D <[email protected]> wrote:
> >>>> Hi all,
> >>>> I get many requests about this and I keep sending code...
>
> >>>> So I've added a new class dedicated to this particular functionality.
> >>>> Drag3D.  in tools.utils package
>
> >>>> you can use it to drag an object or just to get the intersection back.
>
> >>>> here an example of implementation
>
> >>>>                 import away3d.tools.utils.Drag3D
> >>>>                 [... usual away code...]
> >>>>                 private var drag3d:Drag3D;
>
> >>>>                  private function setUp():void
> >>>>                 {
> >>>>                         //the object you want to drag
> >>>>                         var _debugPrimitive:Sphere = new 
> >>>> Sphere({radius:50, material:null});
> >>>>                         this.scene.addChild(_debugPrimitive);
>
> >>>>                         //declare instance
> >>>>                         drag3d = new Drag3D(this.view);
> >>>>                         //which plane do you want to drag on
> >>>>                         // note here that plane != Plane primitive!!
> >>>>                         drag3d.plane = "xz";
> >>>>                         // in case you want to check what you are doing
> >>>>                         //drag3d.debug = true;
> >>>>                         // to assign an object to be dragged
> >>>>                         drag3d.object3d = _debugPrimitive;
> >>>>                 }
>
> >>>>                 private function myEnterFrame(event:Event = null):void
> >>>>                 {
> >>>>                         //will update the object automatically on mouse 
> >>>> moves
> >>>>                         drag3d.updateDrag();  // its is of course handy 
> >>>> to couple this with mouseEvents, like "if mouseisdown --> drag"
>
> >>>>                         // in case you want only the 
> >>>> positionintersectback
> >>>>                         varintersect:Number3D = drag3d.getIntersect();
>
> >>>>                         this.view.render();
> >>>>                 }
>
> >>>> next to 0,0,0 default, there are also options for custom positions of 
> >>>> plane, in case of AABB tests and even support for rotated planes
> >>>> if you want object aligned calcs...
>
> >>>> here a little tech demohttp://www.closier.nl/playground/drag/drag3d.swf
>
> >>>> cheers,
>
> >>>> Fabrice
>
>

Reply via email to