Well if the ray is ok, then the face it's supposed to hit is not at the right place at least in terms of definition for the class.
Fabrice On Jun 3, 2010, at 11:13 PM, Michael Iv wrote: > > That is the problem. I do use your debugger and the Ray is drawn just like I > defined. But the function returns null. May be it is because I use a sphere > for the check? > Thanks > Sent from my iPhone > > On Jun 3, 2010, at 11:53 PM, Fabrice3D <[email protected]> wrote: > >> yes, exact same one, what does the debugger shows? >> I mean, I've used it for something else last week (and dying to go back to >> it soon ) >> all debugs and returns were correct... >> >> But what I did in a specific case was this. >> >> pixel = _view.camera.unproject(i-centerx, j-centery); >> _dir.x = pixel.x; >> _dir.y = pixel.y; >> _dir.z = pixel.z; >> _dir.normalize(); >> >> pixel.x += (1000000*_dir.x)+poscam.x; >> pixel.y += (1000000*_dir.y)+poscam.y; >> pixel.z += (1000000*_dir.z)+poscam.z; >> >> because in some cases, the class subs causing negative/reverts >> this was just a measure (read quick fix) for this issue. for the rest, works >> just fine. Prefab renders... >> note also the excenter top left to compensate with the screencoords >> >> but if you do use the raydebugger i gave you you should visualize the rays >> you shoot. >> use the debugger also to draw your vertexes points... this class visually >> helped me often when I was taking an away rendering >> being equal to my faces/vertex definition passed to the class... >> >> Fabrice >> >> >> On Jun 3, 2010, at 9:42 PM, Michael Iv wrote: >> >>> Hi Fabrice , did you implement the Ray Class in the example you have given >>> here for sphere intersection . I have tried everything and still >>> ray.getIntersect () returns null . What can be wrong in what I do here ? >>> >>> ////////////////////////code////////////////////////////////// >>> package >>> { >>> import away3d.core.base.Face; >>> import away3d.core.base.Segment; >>> import away3d.core.base.Vertex; >>> import away3d.core.draw.ScreenVertex; >>> import away3d.core.math.Number3D; >>> import away3d.core.utils.Cast; >>> import away3d.materials.BitmapMaterial; >>> import away3d.materials.ColorMaterial; >>> import away3d.materials.utils.data.Ray; >>> import away3d.primitives.Sphere; >>> import away3d.sprites.DirSprite2D; >>> import away3d.sprites.Sprite2D; >>> import away3d.sprites.Sprite3D; >>> >>> import flash.display.BitmapData; >>> import flash.events.Event; >>> >>> import utils.RayDebugger; >>> >>> [SWF(backgroundColor="#677999", frameRate="30", quality="LOW", >>> width="800", height="600")] >>> public class RayTracingDemo extends AwayTemplate >>> { >>> private var _rayDebug:RayDebugger; >>> private var _sp:Sphere; >>> private var _ray:Ray; >>> private var _screenVertex:ScreenVertex; >>> private var _vertex:Vertex; >>> private var _sprite3:Sprite3D; >>> private var _traceDefaultPos:Number3D=new Number3D(-100,100,-100); >>> public function RayTracingDemo() >>> { >>> >>> super(); >>> } >>> override protected function initGeometry() : void{ >>> RayDebugger.setView(_view); >>> >>> >>> >>> _sp=new Sphere({radius:30,material:new ColorMaterial(0x339955)}); >>> _view.scene.addChild(_sp); >>> _sp.z=500; >>> _sp.y=0; >>> _sp.x=0; >>> >>> >>> >>> _ray=new Ray(); >>> >>> >>> } >>> override protected function onEnterFrame(e:Event) : void{ >>> super.onEnterFrame(e); >>> var mouseDir1:Number3D=_cam.unproject(mouseX-400,mouseY-300); >>> >>> mouseDir1.x*=10; >>> mouseDir1.y*=10; >>> mouseDir1.z*=10; >>> _ray.orig= _cam.position; >>> _ray.dir= mouseDir1;///_sp.position;///_cam.transform.forward; >>> >>> >>> >>> for(var b:int=0;b<_sp.faces.length;++b){ >>> >>> >>> >>> >>> var face:Face=_sp.faces[b]; >>> >>> _ray.orig= _traceDefaultPos; >>> _ray.dir= mouseDir1;d; >>> >>> >>> trace( >>> _ray.getIntersect(_ray.orig,_ray.dir,face.v0.position,face.v1.position,face.v2.position)); >>> >>> >>> } >>> >>> } >>> >>> >>> RayDebugger.traceRay(_ray.orig,_ray.dir,0x228833,false); >>> RayDebugger.traceViewPortRect(0,0,800,600,400,300); >>> >>> } >>> >>> } >>> } >>> } >>> >>> On Wed, May 5, 2010 at 5:59 PM, Fabrice3D <[email protected]> wrote: >>> >>> >>> here you go... >>> >>> Fabrice >>> >>> >>> >>> On May 5, 2010, at 4:37 PM, devlander wrote: >>> >>> > Fabrice where can I get your RayDebug debug class ? >>> > >>> > I tried to apply the screen offset but still no success. >>> > >>> > Thanks >>> > >>> > On May 5, 3:13 pm, Michael Iv <[email protected]> wrote: >>> >> That is interesting point . I wll try this . Sorry I cant see the white >>> >> pixels , it is too far from the screen :) >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> On Wed, May 5, 2010 at 4:07 PM, Fabrice3D <[email protected]> wrote: >>> >>> I think I may know why you miss.... >>> >>> in demo I have offseted the screen, because coordinates flash are top >>> >>> left. >>> >>> pixel = _view.camera.unproject(startx-400, starty+j-300); >>> >> >>> >>> here 400 and 300 being hardcoded as 1/2 values of my screen 800x600 >>> >> >>> >>> Fabrice >>> >> >>> >>> On May 5, 2010, at 3:01 PM, Michael Iv wrote: >>> >> >>> >>> I am quite sure that the ray class casts the ray in right direction , >>> >>> but >>> >>> the problem that I could not understand was why no intersection was >>> >>> returned >>> >>> . >>> >>> In your example do you receive the intersection of these rays with the >>> >>> globe ? >>> >> >>> >>> On Wed, May 5, 2010 at 3:51 PM, Fabrice3D <[email protected]> wrote: >>> >> >>> >>>> made little demo to show you thats this is probably what is going on in >>> >>>> your code. >>> >> >>> >>>> --> this demo projects a stroke 8 px wide in center screen (800x600), >>> >>>> in >>> >>>> this case at 0,0 to 0,400 x/y >>> >>>> the ray debugger shows you the camera, viewport, and the stroke. >>> >>>> the debug rays are using the unproject camera method. (debug rays >>> >>>> projected each 20 pixels only first column to stay friend with the >>> >>>> flash >>> >>>> player) >>> >>>> as you can see the direction obtained once normalized, is what you >>> >>>> want. >>> >>>> And also shows Ray class is not wrong. >>> >> >>> >>>> Now, the sphere in the world is still object space. not having any of >>> >>>> the >>> >>>> camera perpective. >>> >>>> Changing camera after calcs to hovercam to explore, you can see the >>> >>>> debug >>> >>>> trace shows that once you put yourself behind the camera >>> >>>> that the result of the stroke does match the rays using the Ray class >>> >>>> where no perpective or lens corrections are applied. >>> >>>> except its obvious that the rays do not fit the image where the white >>> >>>> (the >>> >>>> hit) should be way smaller if in same space as camera >>> >> >>> >>>> http://www.closier.nl/playground/RaySpace.swf >>> >> >>> >>>> Again, I'll try improve that class to make it smarter.. its all a >>> >>>> question >>> >>>> of time :) >>> >> >>> >>>> Fabrice >>> >> >>> >>>> On May 5, 2010, at 1:09 PM, Michael Iv wrote: >>> >> >>> >>>> I was looking at the following function in BitmapMaterial Class: >>> >>>> if(showNormals){ >>> >> >>> >>>> _nn.rotate(tri.faceVO.face.normal, >>> >>>> tri.view.cameraVarsStore.viewTransformDictionary[tri.source]); >>> >> >>> >>>> _sv0x = (tri.v0x + tri.v1x + tri.v2x) / 3; >>> >>>> _sv0y = (tri.v0y + tri.v1y + tri.v2y) / 3; >>> >> >>> >>>> _sv1x = (_sv0x - (30*_nn.x)); >>> >>>> _sv1y = (_sv0y - (30*_nn.y)); >>> >> >>> >>>> _session.renderLine(_sv0x, _sv0y, _sv1x, _sv1y, 0, >>> >>>> 0xFF00FF, 1); >>> >>>> } >>> >>>> } >>> >> >>> >>>> And I can see ( if I am right) that you are setting _nn roation >>> >>>> multiplying face normal by face matrix that was received from camera >>> >>>> space >>> >>>> . >>> >>>> May be that is what has to be done when getting faces for >>> >>>> getIntersection >>> >>>> ? >>> >> >>> >>>> On Tue, May 4, 2010 at 12:11 PM, devlander >>> >>>> <[email protected]>wrote: >>> >> >>> >>>>> ok Fabrice. >>> >>>>> Please notify us if you can get something working ( this is a critical >>> >>>>> feature for my project ). >>> >> >>> >>>>> Thanks for your support. >>> >> >>> >>>>> On May 4, 9:44 am, Fabrice3D <[email protected]> wrote: >>> >>>>>> Looking at it asap as I need it as well... >>> >> >>> >>>>>> On May 4, 2010, at 7:18 AM, Michael Iv wrote: >>> >> >>> >>>>>>> Now I can see I am not only one having that problem >>> >> >>> >>>>>>> Sent from my iPhone >>> >> >>> >>>>>>> On May 4, 2010, at 3:49 AM, devlander <[email protected]> >>> >>>>> wrote: >>> >> >>> >>>>>>>> ================================================================= >>> >>>>>>>> Please forget about my previous post (many copy&past mistakes in >>> >>>>>>>> the >>> >>>>>>>> code snippet) >>> >>>>>>>> ================================================================= >>> >> >>> >>>>>>>> Here is my code (corrected): >>> >> >>> >>>>>>>> private function _pickMesh(mesh:Mesh):PickingResult { >>> >> >>> >>>>>>>> var pr:PickingResult = new PickingResult(); // Store picking >>> >>>>>>>> data here >>> >> >>> >>>>>>>> var rayPos:Number3D = view3D.camera.unproject(view3D.mouseX, >>> >>>>>>>> view3D.mouseY); >>> >> >>> >>>>>>>> var rayDir:Number3D = new Number3D(); >>> >>>>>>>> rayDir.x = rayPos.x; >>> >>>>>>>> rayDir.y = rayPos.y; >>> >>>>>>>> rayDir.z = rayPos.z; >>> >>>>>>>> rayDir.normalize(); >>> >>>>>>>> rayPos.add(rayPos, view3D.camera.position); >>> >> >>> >>>>>>>> var ray:Ray = new Ray(); >>> >>>>>>>> var pickedPoint:Number3D; >>> >> >>> >>>>>>>> for each (var face:Face in mesh.faces) { >>> >> >>> >>>>>>>> pickedPoint = ray.getIntersect(rayPos , rayDir , >>> >>>>>>>> face.v0.position , face.v1.position , face.v2.position); >>> >> >>> >>>>>>>> if (pickedPoint!=null) { >>> >>>>>>>> pr.hasHit = true; >>> >>>>>>>> pr.point = pickedPoint; >>> >>>>>>>> pr.face = face; >>> >>>>>>>> break; >>> >>>>>>>> } >>> >>>>>>>> } >>> >> >>> >>>>>>>> pr.mesh = mesh; >>> >> >>> >>>>>>>> return pr; >>> >> >>> >>>>>>>> } >>> >> >>> >>>>>>>> The problem is I always get null. >>> >> >>> >>>>>>>> Note: Since my mesh is a child of an Objectcontainer3D element I >>> >>>>> have >>> >>>>>>>> called mesh.applyRotations() >>> >>>>>>>> to make sure all the mesh faces are computed relative to the world >>> >>>>>>>> coord system. >>> >> >>> >>>>>>>> I suspect there is a problem in the computation of the ray params >>> >>>>>>>> (position or direction). >>> >> >>> >>>>>>>> Fabrice can you confirm that the signature of the Ray.getIntersect >>> >>>>>>>> method is as follow (no info is given in the class): >>> >> >>> >>>>>>>> p0: ray direction (or is it position ?) >>> >>>>>>>> p1: ray position [in world coord system] (or is it direction?) >>> >>>>>>>> v0: face.v0.position [in global world coord system] >>> >>>>>>>> v1: face.v1.position [in global world coord system] >>> >>>>>>>> v2: face.v2.position [in global world coord system] >>> >> >>> >>>>>>>> Thanks for any help on this. >>> >> >>> >>>>>>>> On May 4, 2:33 am, devlander <[email protected]> wrote: >>> >>>>>>>>> Hello, i am having the exact same problem here. >>> >> >>> >>>>>>>>> I am trying to determine the intersection on a 3D object at a >>> >>>>>>>>> given >>> >>>>>>>>> viewport location (view3D.mouseX, view3D.mouseY): >>> >> >>> >>>>>>>>> Here is my code: >>> >> >>> >>>>>>>>> private function _pickMesh(mesh:Mesh):PickingResult { >>> >> >>> >>>>>>>>> var pr:PickingResult = new PickingResult(); // Store >>> >>>>> picking data >>> >>>>>>>>> here >>> >> >>> >>>>>>>>> var rayPos:Number3D = >>> >>>>> view3D.camera.unproject(view3D.mouseX, >>> >>>>>>>>> view3D.mouseY); >>> >> >>> >>>>>>>>> // info retreived from here >>> >>>>>>>>> // >>> >>>>> http://www.mail-archive.com/[email protected]/msg09318.html >>> >> >>> >>>>>>>>> var rayDir:Number3D = new Number3D(); >>> >>>>>>>>> rayDir.x = pMouse.x; >>> >>>>>>>>> rayDir.y = pMouse.y; >>> >>>>>>>>> rayDir.z = pMouse.z; >>> >>>>>>>>> rayDir.normalize(); >>> >>>>>>>>> rayPos.add(rayPos, _view3D.camera.position); >>> >> >>> >>>>>>>>> var ray:Ray = new Ray(); >>> >>>>>>>>> var pickedPoint:Number3D; >>> >> >>> >>>>>>>>> for each (var face:Face in mesh.faces) { >>> >> >>> >>>>>>>>> pickedPoint = ray.getIntersect(rayPos , rayDir , >>> >>>>> face.v0.position , >>> >>>>>>>>> face.v1.position , face.v2.position); >>> >> >>> >>>>>>>>> if (pickedPoint!=null) { >>> >>>>>>>>> pr.hasHit = true; >>> >>>>>>>>> pr.point = pickedPoint; >>> >>>>>>>>> pr.face = face; >>> >>>>>>>>> break; >>> >>>>>>>>> } >>> >>>>>>>>> } >>> >> >>> >>>>>>>>> pr.mesh = mesh; >>> >> >>> >>>>>>>>> return pr; >>> >> >>> >>>>>>>>> } >>> >> >>> >>>>>>>>> The problem is I always get null. >>> >> >>> >>>>>>>>> Note: Since my mesh is a child of an Objectcontainer3D element I >>> >>>>> have >>> >>>>>>>>> called mesh.applyRotations() >>> >>>>>>>>> to make sure all the mesh faces are computed relative to the world >>> >>>>>>>>> coord system. >>> >> >>> >>>>>>>>> I suspect there is a problem in the computation of the ray params >>> >>>>>>>>> (position or direction). >>> >> >>> >>>>>>>>> Fabrice can you confirm that the signature of the Ray.getIntersect >>> >>>>>>>>> method is as follow (no info is given in the class): >>> >> >>> >>>>>>>>> p0: ray direction (or is it position ?) >>> >>>>>>>>> p1: ray position [in world coord system] (or is it direction?) >>> >>>>>>>>> v0: face.v0.position [in global world coord system] >>> >>>>>>>>> v1: face.v0.position [in global world coord system] >>> >>>>>>>>> v2: face.v0.position [in global world coord system] >>> >> >>> >>>>>>>>> Thanks >>> >> >>> >>>>>>>>> On May 4, 12:17 am, Michael Iv <[email protected]> wrote: >>> >> >>> >>>>>>>>>> Fabrice i am trying it already for 4 hours with Sphere , but it >>> >>>>> returns null >>> >>>>>>>>>> most of the time >>> >> >>> >>>>>>>>>> ///// it runs on enter frame//////////////// >>> >>>>>>>>>> for(var i:int=0;i<_sf.faces.length;++ >>> >>>>>>>>>> i){ >>> >> >>> >>>>> trace(_ray.getIntersect(_ray.orig,_ray.dir,_sf.faces[i].v0.position,_sf.faces[i].v1.position,_sf.faces[i].v2.position)); >>> >>>>>>>>>> } >>> >>>>>>>>>> and basi >>> >> >>> >>>>>>>>>> On Tue, May 4, 2010 at 1:15 AM, Fabrice3D <[email protected]> >>> >>>>> wrote: >>> >>>>>>>>>>> dir, origin, v0, v1, v2 >>> >>>>>>>>>>> to check if a ray hits a triangle >>> >> >>> >>>>>>>>>>> Fabrice >>> >> >>> >>>>>>>>>>> On May 3, 2010, at 9:43 PM, Michael Iv wrote: >>> >> >>> >>>>>>>>>>> Someone can tell me what are* v0,v1,v2* in* >>> >>>>> Ray.getIntersect(p0:Number3D, >>> >>>>>>>>>>> p1:Number3D, v0:Number3D, v1:Number3D, v2:Number3D):Number3D* >>> >>>>>>>>>>> ??? >>> >>>>>>>>>>> Just can't find any example explaining these >>> >> >>> >>>>>>>>>>> Thanks! >>> >> >>> >>>>>>>>>>> -- >>> >>>>>>>>>>> Michael Ivanov ,Programmer >>> >>>>>>>>>>> Neurotech Solutions Ltd. >>> >>>>>>>>>>> Flex|Air |3D|Unity| >>> >>>>>>>>>>> www.neurotechresearch.com >>> >> >>> >> ... >>> >> >>> >> read more ยป >>> >>> >>> >>> >>> -- >>> Michael Ivanov ,Programmer >>> Neurotech Solutions Ltd. >>> Flex|Air |3D|Unity| >>> www.neurotechresearch.com >>> http://blog.alladvanced.net >>> http://www.meetup.com/GO3D-Games-Opensource-3D/ >>> Tel:054-4962254 >>> [email protected] >>> [email protected] >>> >>
