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