Re: [osg-users] Using PolytopeIntersector from the root of the scene graph instead of camera
Hi Julien-Charles, Julien-Charles Lévesque schrieb: Hi Peter, What do you mean by a degenerated polytope of volume 0 ? That polytope definitely doesn't have a null volume since I've been using it to select objects in my application and it works. The four planes all have the same starting point because I want the polytope to be a pyramid coming out from a user's hand, so the planes -should- all intersect at the summit, no ? You are right. I did not look closely enough and assumed you where trying to build a parallel polytope. The polytope looks to be alright. Julien-Charles On Thu, Feb 4, 2010 at 8:35 AM, Peter Hrenka mailto:p.hre...@science-computing.de>> wrote: Hi Julien-Charles, Julien-Charles Lévesque schrieb: [...] Here is my code... stripped down to a minimum. I assume that you have a 4x4 matrix containing orientation of your selector (lOrientation) and a vec3 containing it's position (lPosition). I built the polytope to point in the direction of positive y-axis. Sorry for the french variable names and comments here and there... I don't think they hurt readability much at this level :P However, I wasn't able to extract a reliable 3x3 rotation matrix from mouse coordinates. I can only say that this code works well with the raw 3x3 orientation and position provided by my tracker. Do you have any idea for a desktop variation ? I can implement it. I could also integrate all this in the examplekeyboardmouse, once I've figured out how to do it with a mouse :P I would suggest to control the rotation and position using the keyboard. This should be enough for the purpose of an osg-example. I think it would be nice if the polytope would be visualized as a wireframe model. I also would suggest of creating a new osgpolytopeintersector- example because nobody really looks into osgkeyboardmouse when looking for polytope-intersection functionality... Cheers, Peter -- Vorstand/Board of Management: Dr. Bernd Finkbeiner, Dr. Roland Niemeier, Dr. Arno Steitz, Dr. Ingrid Zech Vorsitzender des Aufsichtsrats/ Chairman of the Supervisory Board: Michel Lepert Sitz/Registered Office: Tuebingen Registergericht/Registration Court: Stuttgart Registernummer/Commercial Register No.: HRB 382196 ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Using PolytopeIntersector from the root of the scene graph instead of camera
Hi Peter, What do you mean by a degenerated polytope of volume 0 ? That polytope definitely doesn't have a null volume since I've been using it to select objects in my application and it works. The four planes all have the same starting point because I want the polytope to be a pyramid coming out from a user's hand, so the planes -should- all intersect at the summit, no ? Julien-Charles On Thu, Feb 4, 2010 at 8:35 AM, Peter Hrenka wrote: > Hi Julien-Charles, > > Julien-Charles Lévesque schrieb: > >> [...] >> >> >> Here is my code... stripped down to a minimum. I assume that you have a >> 4x4 matrix containing orientation of your selector (lOrientation) and a vec3 >> containing it's position (lPosition). I built the polytope to point in the >> direction of positive y-axis. Sorry for the french variable names and >> comments here and there... I don't think they hurt readability much at this >> level :P >> >> However, I wasn't able to extract a reliable 3x3 rotation matrix from >> mouse coordinates. I can only say that this code works well with the raw 3x3 >> orientation and position provided by my tracker. Do you have any idea for a >> desktop variation ? I can implement it. I could also integrate all this in >> the examplekeyboardmouse, once I've figured out how to do it with a mouse :P >> > > You seem to use the same base-point for all but one > plane: > > lPlane.set(lNorm, lPosition); > > This will give you a degenerated polytope of > volume 0. > Try using > lPlane.set(lNorm, lPosition-radius*lNorm); > with some radius > 0 > > > > Cheers, > > Peter > -- > Vorstand/Board of Management: > Dr. Bernd Finkbeiner, Dr. Roland Niemeier, Dr. Arno Steitz, Dr. Ingrid Zech > Vorsitzender des Aufsichtsrats/ > Chairman of the Supervisory Board: > Michel Lepert > Sitz/Registered Office: Tuebingen > Registergericht/Registration Court: Stuttgart > Registernummer/Commercial Register No.: HRB 382196 > ___ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > -- Julien-Charles ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Using PolytopeIntersector from the root of the scene graph instead of camera
Hi Julien-Charles, Julien-Charles Lévesque schrieb: [...] Here is my code... stripped down to a minimum. I assume that you have a 4x4 matrix containing orientation of your selector (lOrientation) and a vec3 containing it's position (lPosition). I built the polytope to point in the direction of positive y-axis. Sorry for the french variable names and comments here and there... I don't think they hurt readability much at this level :P However, I wasn't able to extract a reliable 3x3 rotation matrix from mouse coordinates. I can only say that this code works well with the raw 3x3 orientation and position provided by my tracker. Do you have any idea for a desktop variation ? I can implement it. I could also integrate all this in the examplekeyboardmouse, once I've figured out how to do it with a mouse :P You seem to use the same base-point for all but one plane: lPlane.set(lNorm, lPosition); This will give you a degenerated polytope of volume 0. Try using lPlane.set(lNorm, lPosition-radius*lNorm); with some radius > 0 Cheers, Peter -- Vorstand/Board of Management: Dr. Bernd Finkbeiner, Dr. Roland Niemeier, Dr. Arno Steitz, Dr. Ingrid Zech Vorsitzender des Aufsichtsrats/ Chairman of the Supervisory Board: Michel Lepert Sitz/Registered Office: Tuebingen Registergericht/Registration Court: Stuttgart Registernummer/Commercial Register No.: HRB 382196 ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Using PolytopeIntersector from the root of the scene graph instead of camera
Hi Peter, Julien-Charles Levesque schrieb: > >> Hi, >> >> I'm trying to use a PolytopeIntersector in my scene and so far I have >> succeeded but only by using the camera (i.e. mCamera->accept(PolyVisitor)) >> with a PolytopeIntersector built from x and y coordinates in window frame. >> However I would rather pass the visitor the root of my scene. I am doing >> this in a virtual reality project, and using the camera seems to complicate >> things a fair bit because we modify projection matrices and viewports a >> whole lot. >> For my LineSegmentIntersector I have used 3D points in model space, which >> worked fine when visiting the root of the scene. For the PolytopeIntersector >> I am unsure how to do this... Only examples I have found so far used either >> coordinates in projection space or coordinates in window space. >> > > Yes, the examples do not use all available constructors of > PolytopeIntersector. > That is something that has been sitting on my to-do-list for a long time... > Here is my code... stripped down to a minimum. I assume that you have a 4x4 matrix containing orientation of your selector (lOrientation) and a vec3 containing it's position (lPosition). I built the polytope to point in the direction of positive y-axis. Sorry for the french variable names and comments here and there... I don't think they hurt readability much at this level :P However, I wasn't able to extract a reliable 3x3 rotation matrix from mouse coordinates. I can only say that this code works well with the raw 3x3 orientation and position provided by my tracker. Do you have any idea for a desktop variation ? I can implement it. I could also integrate all this in the examplekeyboardmouse, once I've figured out how to do it with a mouse :P osg::Vec3 lPosition; osg::Matrixd lOrientation; osg::Vec3d lEnd = lPosition + lOrientation * osg::Vec3d(0,LENGTH, 0); //pointe vers Y à l'origine //construction d'un polytope dans le repere monde. osg::Polytope lPolytope; osg::Plane lPlane; osg::Vec3d lNorm; //This is the angle by which your planes are rotated. Wider angle = larger selection. double lTheta = 0.5 * PI / 180.; //Left X Plane lNorm.set(cos(lTheta),sin(lTheta),0); lNorm = lOrientation*lNorm; lPlane.set(lNorm, lPosition); lPolytope.add(lPlane); //Right X Plane lNorm.set(-cos(lTheta),sin(lTheta),0); //car cos(theta) = cos(-theta) et sin(theta)=-sin(-theta) lNorm = lOrientation*lNorm; lPlane.set(lNorm, lPosition); lPolytope.add(lPlane); //Top Z Plane lNorm.set(0,sin(lTheta),-cos(lTheta)); lNorm = lOrientation*lNorm; lPlane.set(lNorm, lPosition); lPolytope.add(lPlane); //Bottom Z Plane lNorm.set(0,sin(lTheta),cos(lTheta)); lNorm = lOrientation*lNorm; lPlane.set(lNorm, lPosition); lPolytope.add(lPlane); //Far Y Plane. lNorm.set(0,-1,0); lNorm = lOrientation*lNorm; lPlane.set(lNorm, lEnd); lPolytope.add(lPlane); osg::ref_ptr lIntersecteur = new osgUtil::PolytopeIntersector(lPolytope); // Création d'un visiteur. osg::ref_ptr lVisiteur = new osgUtil::IntersectionVisitor; lVisiteur->setIntersector(lIntersecteur); //Set mask only if you must... in our //application it was for focusable objects. //lVisiteur->setTraversalMask(OBJET_DESIGNABLE); //Accept node at root of scene. mRootNode->accept(lVisiteur); if(lIntersecteur->containsIntersections()) { // Récupère les objets en intersection avec la droite. osgUtil::PolytopeIntersector::Intersections lIntersections = lIntersecteur->getIntersections(); //Parcours la liste des intersections, en commençant par les objets les plus près for (osgUtil::PolytopeIntersector::Intersections::iterator lII = lIntersections.begin(); lII != lIntersections.end(); lII++) { const osg::NodePath& lNodePath = lII->nodePath; //Do whatever you have to here! } } Cheers, Julien-Charles ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Using PolytopeIntersector from the root of the scene graph instead of camera
Hi Julien-Charles, Julien-Charles Levesque schrieb: Hi, I'm trying to use a PolytopeIntersector in my scene and so far I have succeeded but only by using the camera (i.e. mCamera->accept(PolyVisitor)) with a PolytopeIntersector built from x and y coordinates in window frame. However I would rather pass the visitor the root of my scene. I am doing this in a virtual reality project, and using the camera seems to complicate things a fair bit because we modify projection matrices and viewports a whole lot. For my LineSegmentIntersector I have used 3D points in model space, which worked fine when visiting the root of the scene. For the PolytopeIntersector I am unsure how to do this... Only examples I have found so far used either coordinates in projection space or coordinates in window space. Yes, the examples do not use all available constructors of PolytopeIntersector. That is something that has been sitting on my to-do-list for a long time... Now I have seen the CoordinateFrame MODEL or VIEW in the PolytopeIntersector constructor, but I am unsure as how to use it. I have seen that the Znear plane is fixed to 0 for MODEL and VIEW coordinate frames.. Does this mean that any object behind Z=0 could not be intersected? I also have a bad feeling that building and using the PolytopeIntersector in MODEL and VIEW coordinate frames will make it just rectangular instead of pyramidal. There are two constructors that should be suitable for your use-case: /** Construct a PolytopeIntersector using specified polytope in MODEL coordinates.*/ PolytopeIntersector(const osg::Polytope& polytope); /** Construct a PolytopeIntersector using specified polytope in specified coordinate frame.*/ PolytopeIntersector(CoordinateFrame cf, const osg::Polytope& polytope); You can pass an arbitrary Polytope which does not have to be rectangular. To recapitulate : I am trying to build a polytpe intersector from one 3d point in model space (or world space) and it's orientation. I would prefer this polytope intersector to be independent from the cameras or viewports. I am stuck at this point. Am I assuming something wrong? Did I miss something that could make this simpler? Do you have any clue that could help me? Am I even making sense? :D Try using one of the contructors above with a polytope that you provide and use the MODEL coordinate frame. That should work. Thank a lot, Sincerely, Julien-Charles Cheers, Peter -- Vorstand/Board of Management: Dr. Bernd Finkbeiner, Dr. Roland Niemeier, Dr. Arno Steitz, Dr. Ingrid Zech Vorsitzender des Aufsichtsrats/ Chairman of the Supervisory Board: Michel Lepert Sitz/Registered Office: Tuebingen Registergericht/Registration Court: Stuttgart Registernummer/Commercial Register No.: HRB 382196 ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
[osg-users] Using PolytopeIntersector from the root of the scene graph instead of camera
Hi, I'm trying to use a PolytopeIntersector in my scene and so far I have succeeded but only by using the camera (i.e. mCamera->accept(PolyVisitor)) with a PolytopeIntersector built from x and y coordinates in window frame. However I would rather pass the visitor the root of my scene. I am doing this in a virtual reality project, and using the camera seems to complicate things a fair bit because we modify projection matrices and viewports a whole lot. For my LineSegmentIntersector I have used 3D points in model space, which worked fine when visiting the root of the scene. For the PolytopeIntersector I am unsure how to do this... Only examples I have found so far used either coordinates in projection space or coordinates in window space. Now I have seen the CoordinateFrame MODEL or VIEW in the PolytopeIntersector constructor, but I am unsure as how to use it. I have seen that the Znear plane is fixed to 0 for MODEL and VIEW coordinate frames.. Does this mean that any object behind Z=0 could not be intersected? I also have a bad feeling that building and using the PolytopeIntersector in MODEL and VIEW coordinate frames will make it just rectangular instead of pyramidal. To recapitulate : I am trying to build a polytpe intersector from one 3d point in model space (or world space) and it's orientation. I would prefer this polytope intersector to be independent from the cameras or viewports. I am stuck at this point. Am I assuming something wrong? Did I miss something that could make this simpler? Do you have any clue that could help me? Am I even making sense? :D Thank a lot, Sincerely, Julien-Charles -- Read this topic online here: http://forum.openscenegraph.org/viewtopic.php?p=23242#23242 ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org