interresting... so I guess, fix would be to project from camera pos instead of mouse using same ray dir... thx for pointing that out, will try implement a fix to it asap.
in meanwhile keep away from cam :)) Fabrice On Jun 2, 2010, at 12:37 AM, abowman wrote: > 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 >> >>
