<div dir="ltr">Some more news:<br><br>I reverted to OSG 2.2 (I have the same problems with that version), and retrieved a full debug support, first I'm trying to solve the latest problem I faced (with the hidden node described in my previous mail), I'm using a scene like that:<br>
<br><br>- Main camera<br>    - Root group<br>        - Hidden group<br>            - Position Attitude Transform<br>                - Geode (with a sphere geometry inside).<br><br>- On the main camera I use a cull mask of 0x1<br>
- on the Hidden group I switch between node mask 0x100 [not visible]  and 0x101 [visible]<br>- And my intersectionVisitor still uses the traversal mask 0x100<br><br>I went through all the process step by step (now that I retrieved my debug support, thanks god :-) !!!), and the conclusion I have for the moment is:<br>
<br>--> This is all a Projection Matrix story !!!!<br><br>-> In the BAD case (when I hide the "hidden group") my proj matrix has a certain value when I start the call view->computeIntersection(x,y,hits,mask) and this matrix is used in the push_clone() function in IntersectionVisitor::apply(osg::Camera&) to create a cloned Intersector (and thus this new LineSegmentIntersector gets an incorrect _start vector and the call IntersectionVisitor::enter(osg::Node&) fails when trying to enter the "Root group", and no intersection is found !).<br>
<br>Now, I tried to put a breakpoint on both Camera::setProjectionMatrix(osg::Matrixf/d& ) as this seems to be the only "entry point" to modify a camera projection matrix... But I just CAN'T get on the point when the good camera projection is <i>correctly</i> set !!! is that done some other way ??? I keep investigating, I have no choice any way...<br>
<br>regards,<br>Manu.<br><br><br><br><br><div class="gmail_quote">2008/9/24 Emmanuel Roche <span dir="ltr"><<a href="mailto:roche.emmanuel@gmail.com">roche.emmanuel@gmail.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div dir="ltr">:-(... I'm really going to cry now...<br>
<br>
Guys, I tried something else and I feel like I'm loosing my mind:<br>
<br>
Since I cannot pick anything when traversing a sub camera, I tried to build my scene this way:<br>- the main View camera  (with cull mask set to 0x1)<br>  - my root group<br>    - a sub camera (with node mask set to 0x1)<div class="Ih2E3d">
<br>
      - a PositionAttitudeTransform (with a scale set)<br>
        - an object<br></div>    - An hidden group (with node mask set to 0x100)<br>      - a link to the SAME previous PositionAttitudeTransform object.<br><br>... With that I still have a proper display (the default node mask is 0xFFFFFFFF): only my sub camera is rendered and the hidden group is not visible as expected.<br>

<br>then for my IntersectionVisitor I obviously use the traversal mask 0x100 : this way I was expecting to traverse my main camera and the hidden group, but none of the sub camera... and guess what ? It's just not working !!!! :-( It works if I don't hide my hidden group (giving it a node mask of 0x101, but of course this doesn't make sense considering the goal I have....)... So the IntersectionVisitor traversal also depends on the cull mask or something like that ? I could really use some explanations on that...<br>

<br>By the way I'm using OSG 2.6... <br><div><div></div><div class="Wj3C7c"><br>regards,<br>Manu.<br><br><br><br><div class="gmail_quote">2008/9/23 Emmanuel Roche <span dir="ltr"><<a href="mailto:roche.emmanuel@gmail.com" target="_blank">roche.emmanuel@gmail.com</a>></span><br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div dir="ltr">Okay...<br><br> I think I tried everything I could think about, unsuccessfully... unfortunately, I'm currently on WinXP with Visual Studio and for some obscure reason, I just cannot get/use the debug symbols from some of the OSG libraries (maybe beacuse I'm accessing those functions introspectively though a Lua release binary ? not sure about all that...) an as a result I cannot go deeper into those tests :-(<br>


<br>But I've just discovered a new fact: this is at least partially linked to the scale of my object, I tried the following scene graph:<br><br>- the main View camera<br>  - my root group<br>    - a sub camera<br>      - a PositionAttitudeTransform (with a scale set)<br>


        - an object<br><br>---> then depending on the scale applied in the PositionAttitudeTransform I can pick parts of my object or not : the bigger the scale, the closer to the object I need to be to get some intersections (and I'm not even sure those intersections are correct...). So could there be a scale factor not applied somewhere ?? Or maybe, since my main camera renders no objects its near/far planes are set to minimal values and then those settings are not modified accordingly when going though a sub camera in an intersectionVisitor [this could explain why I cannot select objects if I'm not very very close to them (and depending on their scale)...] ?<br>


<br>Is there an other way to render Univers scale + high precision scenes without using multiple cameras as children ??? I did a quick test using ClearNodes and setting the only camera left to "DO_NOT_COMPUTE_NEAR_FAR", but the results are not good (it seems to me that the ClearNodes clear the color buffer even when I only set the DEPTH_BUFFER_BIT mask... I really don't get it...).<br>


<br>regards,<br>Manu.<br><br><div><div></div><div><br><div class="gmail_quote">2008/9/23 Emmanuel Roche <span dir="ltr"><<a href="mailto:roche.emmanuel@gmail.com" target="_blank">roche.emmanuel@gmail.com</a>></span><br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div dir="ltr">Hi Robert,<br><br>unfortunately I don't think this an available option in my current project: our software is already relying quite heavily on our current CompositteViewer / View structure  (a view per window [using wxWidgets], a camera manipulator, a single scene graph that should not be cut into pieces, etc... and any way, I think there is a real problem here (expect if there is still something I missed) so I think for me  (in both cases) it's important to solve this issue instead of just bypassing it.<br>



<br>I hope you will find some time to give a deeper look to this thread later ;-), meanwhile I'm not giving up: I checked the setSceneData(node) methods and it's basically the same just a camera->addChild(node) call... so I may have the finger on something [as I expected a noticable difference]. I'll keep you informed.<br>



<br>regards,<br>Manu.<br><br><div class="gmail_quote">2008/9/23 Robert Osfield <span dir="ltr"><<a href="mailto:robert.osfield@gmail.com" target="_blank">robert.osfield@gmail.com</a>></span><div><div></div><div>
<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi Manu,<br>
<br>
I don't have the head for complex emails or logic right now, so I<br>
won't five into the details of thread.  What does jump out from speed<br>
reading this email is why you don't use osgViewer::CompositeViewer<br>
with multipler Views as this would totally clear up an ambiguity about<br>
what camera each intersection test is made against.<br>
<br>
Robert.<br>
<div><div></div><div><br>
On Tue, Sep 23, 2008 at 5:42 PM, Emmanuel Roche<br>
<<a href="mailto:roche.emmanuel@gmail.com" target="_blank">roche.emmanuel@gmail.com</a>> wrote:<br>
> Hello again...<br>
><br>
> I did other tests, my idea was:<br>
><br>
> I have a single main camera displaying a root object [an osg::Group] and<br>
> this root object contains 5 or 6 osg::Camera object as direct children. And<br>
> those "sub cameras" contain pieces of the scene I want to display. Since (I<br>
> don't know why, but) using an IntersectVisitor gives completely incorrect<br>
> result on the main camera in that case, I decided to use my<br>
> intersectionvisitor with each sub camera one by one... in that case<br>
> everything should behave as if each of my sub camera was the root object<br>
> when it's traversed, no ?... but the answer is: NO... :-( this case doesn't<br>
> seem to be the same as using a single camera containing objects as the<br>
> intersection results are still completely false<br>
><br>
> So my big question is now : what's the difference (from a "camera point of<br>
> view when it comes to intersections") between view->setSceneData(node) and<br>
> camera->addChild(node) ??? I keep investigating... :-) but any shortcut<br>
> would really be appreciated :-).<br>
><br>
> regards,<br>
> Manu.<br>
><br>
> PS: here is the main part of the code concerning the previous idea I<br>
> mentioned if someone wants to have a look...<br>
><br>
>     osg::Camera* cam = view->getCamera();<br>
>     osg::Matrixd vm;<br>
>     osg::Matrixd pm;<br>
>     osg::ref_ptr<osg::Viewport> vp;<br>
><br>
>     osgUtil::LineSegmentIntersector::Intersections hits;<br>
><br>
>     vDisplay::DisplayManager::CameraDeq& cams =<br>
> vDisplay::DisplayManager::getRegisteredCameras(view);<br>
>     for(vDisplay::DisplayManager::CameraDeq::iterator it = cams.begin(); it<br>
> != cams.end(); ++it) {<br>
><br>
>         osgUtil::LineSegmentIntersector::CoordinateFrame cf =<br>
> osgUtil::Intersector::PROJECTION; //(*it)->getViewport() ?<br>
> osgUtil::Intersector::WINDOW : osgUtil::Intersector::PROJECTION;<br>
>         osg::ref_ptr< osgUtil::LineSegmentIntersector > picker = new<br>
> osgUtil::LineSegmentIntersector(cf, x, y);<br>
><br>
>         //osgUtil::IntersectionVisitor iv(picker.get());<br>
>         vOGL::ExtendedIntersectionVisitor iv(picker.get());<br>
>         iv.setTraversalMask(0xFFFFFFFF);<br>
><br>
>         // Reconfigure the camera:<br>
>         vm = (*it)->getViewMatrix();  // these are actually identity<br>
> matrices as only the main camera is manipulated....<br>
>         pm = (*it)->getProjectionMatrix();<br>
>         vp = (*it)->getViewport();<br>
><br>
>         (*it)->setViewMatrix(cam->getViewMatrix());<br>
>         (*it)->setProjectionMatrix(cam->getProjectionMatrix());<br>
>         (*it)->setViewport(cam->getViewport());<br>
><br>
>         if ((*it)->getViewport()) iv.pushWindowMatrix( (*it)->getViewport()<br>
> );<br>
>         iv.pushProjectionMatrix( new<br>
> osg::RefMatrix((*it)->getProjectionMatrix()) );<br>
>         iv.pushViewMatrix( new osg::RefMatrix((*it)->getViewMatrix()) );<br>
>         iv.pushModelMatrix( new osg::RefMatrix() );<br>
><br>
>         (*it)->accept(iv);<br>
><br>
>         iv.popModelMatrix();<br>
>         iv.popViewMatrix();<br>
>         iv.popProjectionMatrix();<br>
>         if ((*it)->getViewport()) iv.popWindowMatrix();<br>
><br>
>         (*it)->setViewMatrix(vm);<br>
>         (*it)->setProjectionMatrix(pm);<br>
>         (*it)->setViewport(vp.get());<br>
><br>
>         if (picker->containsIntersections())<br>
>         {<br>
>             hits = picker->getIntersections();<br>
>             vLog::logInfo("Got %d intersections",hits.size());<br>
>             return true;<br>
>         }<br>
>     }<br>
><br>
><br>
><br>
><br>
> 2008/9/23 Emmanuel Roche <<a href="mailto:roche.emmanuel@gmail.com" target="_blank">roche.emmanuel@gmail.com</a>><br>
>><br>
>> Hi everyone,<br>
>><br>
>> I have an interesting issue here:<br>
>><br>
>> I'm building a scene this way (the following is a lua script using<br>
>> osgIntrospection to manipulate OSG stuff) :<br>
>><br>
>> local root = osg.Group()<br>
>> root:setName("Universe")<br>
>><br>
>> -- we want to add this root object as a scene in the current project<br>
>> (otherwise it will never be found)<br>
>> -- this root object will be assigned as the scenedata for the master<br>
>> camera.<br>
>> local proj = vProj.ProjectManager.instance():getCurrent()<br>
>> proj:add_Scene(root)<br>
>><br>
>> local view = vDisplay.DisplayManager.getViewer():getView(0)  -- here,<br>
>> getViewer() returns our osgViewer::CompositeViewer object<br>
>> local manip =<br>
>> reflection.cast(view:getCameraManipulator(),"vGA::ArcBallManipulator")<br>
>><br>
>> -- now create the LTS project:<br>
>> require('LTS')<br>
>><br>
>> local cam = view:getCamera()  -- this is the "main" camera, the scene data<br>
>> for this camera is the previously declared "root" object<br>
>> local subcam = osg.Camera()  -- we create a sub camera than we will add to<br>
>> the main scene (so an inderect child for the main camera...)<br>
>> subcam:setGraphicsContext(cam:getGraphicsContext())<br>
>> subcam:setViewport(cam:getViewport())<br>
>> subcam:setRenderOrder(osg.Camera.RenderOrder.POST_RENDER,3) -- We post<br>
>> render this subcamera with an arbitrary order.<br>
>> subcam:setClearMask(GL.Mode.GL_DEPTH_BUFFER_BIT) -- We want to render<br>
>> Universe scale scenes that's why we introduced this multi pass system.<br>
>> root:addChild(subcam)<br>
>><br>
>> local st = vOGL.SceneTools;<br>
>> local pat = osg.PositionAttitudeTransform()<br>
>> pat:addChild(LTS.createDoubleCraft("K1")) -- Here we create a satellit<br>
>> object<br>
>> subcam:addChild(pat) -- And we add the object to the sub camera...<br>
>><br>
>><br>
>> ... this scene is rendered perfectly... but now I'm trying to "pick" items<br>
>> in the scene using the implementation found in<br>
>> osgViewer::View::computeIntersections(...) : If I put my "K1" object<br>
>> directly "in" the "main" camera everything is perfect, and I can pick<br>
>> intersections correctly. But when using this "subcam"  as parent then I get<br>
>> incorrect results :-( (intersections found when clicking on nothing, or no<br>
>> intersections found when cliking on sub parts of the object...)<br>
>><br>
>> I gave a look at the osgUtil::IntersectionVisitor implementation... and I<br>
>> think everything is happening in this function:<br>
>><br>
>> void IntersectionVisitor::apply(osg::Camera& camera)<br>
>> {<br>
>>     // osg::notify(osg::NOTICE)<<"apply(Camera&)"<<std::endl;<br>
>><br>
>>     // note, commenting out right now because default Camera setup is with<br>
>> the culling active.  Should this be changed?<br>
>>     // if (!enter(camera)) return;<br>
>><br>
>>     // osg::notify(osg::NOTICE)<<"inside apply(Camera&)"<<std::endl;<br>
>><br>
>>     if (camera.getViewport()) pushWindowMatrix( camera.getViewport() );<br>
>>     pushProjectionMatrix( new osg::RefMatrix(camera.getProjectionMatrix())<br>
>> );<br>
>>     pushViewMatrix( new osg::RefMatrix(camera.getViewMatrix()) );<br>
>>     pushModelMatrix( new osg::RefMatrix() );<br>
>><br>
>>     // now push an new intersector clone transform to the new local<br>
>> coordinates<br>
>>     push_clone();<br>
>><br>
>>     traverse(camera);<br>
>><br>
>>     // pop the clone.<br>
>>     pop_clone();<br>
>><br>
>>     popModelMatrix();<br>
>>     popViewMatrix();<br>
>>     popProjectionMatrix();<br>
>>     if (camera.getViewport()) popWindowMatrix();<br>
>><br>
>>     // leave();<br>
>> }<br>
>><br>
>> I created my own "ExtendedIntersectorVisitor" (derived from this class) to<br>
>> override this function and I made multiple tests to handle the "main" camera<br>
>> and the "sub" cameras differently:<br>
>><br>
>> void ExtendedIntersectionVisitor::apply(osg::Camera & camera) {<br>
>>     if(!cameraInitialized) {<br>
>>         cameraInitialized = true;<br>
>>         // The first time we get a camera object we use it to setup the<br>
>> camera details normaly:<br>
>><br>
>>         if (camera.getViewport()) pushWindowMatrix( camera.getViewport()<br>
>> );<br>
>>         pushProjectionMatrix( new<br>
>> osg::RefMatrix(camera.getProjectionMatrix()) );<br>
>>         pushViewMatrix( new osg::RefMatrix(camera.getViewMatrix()) );<br>
>>         pushModelMatrix( new osg::RefMatrix() );<br>
>><br>
>>         // now push an new intersector clone transform to the new local<br>
>> coordinates<br>
>>         push_clone();<br>
>><br>
>>         traverse(camera);<br>
>><br>
>>         // pop the clone.<br>
>>         pop_clone();<br>
>><br>
>>         popModelMatrix();<br>
>>         popViewMatrix();<br>
>>         popProjectionMatrix();<br>
>>         if (camera.getViewport()) popWindowMatrix();<br>
>>     }<br>
>>     else {<br>
>>         // here I did multiple tests (one by one):<br>
>><br>
>>         // Test 1: treat the camera as a transform  (took implementation<br>
>> from IntersectionVisitor::apply(osg::Transform&) )<br>
>>         if (!enter(*(camera.asTransform()))) return;<br>
>><br>
>>         osg::ref_ptr<osg::RefMatrix> matrix = _modelStack.empty() ? new<br>
>> osg::RefMatrix() : new osg::RefMatrix(*_modelStack.back());<br>
>>         camera.computeLocalToWorldMatrix(*matrix,this);<br>
>><br>
>>         pushModelMatrix(matrix.get());<br>
>><br>
>>         // now push an new intersector clone transform to the new local<br>
>> coordinates<br>
>>         push_clone();<br>
>><br>
>>         traverse(camera);<br>
>><br>
>>         // pop the clone.<br>
>>         pop_clone();<br>
>><br>
>>         popModelMatrix();<br>
>><br>
>>         // tidy up an cached cull variables in the current intersector.<br>
>>         leave();<br>
>>        // End of Test 1<br>
>><br>
>>        // Test 2: treat the camera as a osg::Group only!<br>
>>         if (!enter(*(camera.asGroup()))) return;<br>
>><br>
>>         traverse(*(camera.asGroup()));<br>
>><br>
>>         leave();<br>
>>        // End of test 2<br>
>><br>
>>        // Test 3: just try not to push the model matrix, view matrix,<br>
>> projection or viewport, one by one:<br>
>><br>
>>         if (camera.getViewport()) pushWindowMatrix( camera.getViewport()<br>
>> );<br>
>>         pushProjectionMatrix( new<br>
>> osg::RefMatrix(camera.getProjectionMatrix()) );<br>
>>         pushViewMatrix( new osg::RefMatrix(camera.getViewMatrix()) );<br>
>>         //pushModelMatrix( new osg::RefMatrix() );<br>
>><br>
>>         // now push an new intersector clone transform to the new local<br>
>> coordinates<br>
>>         push_clone();<br>
>><br>
>>         traverse(camera);<br>
>><br>
>>         // pop the clone.<br>
>>         pop_clone();<br>
>><br>
>>         //popModelMatrix();<br>
>>         popViewMatrix();<br>
>>         popProjectionMatrix();<br>
>>         if (camera.getViewport()) popWindowMatrix();<br>
>>         // End of Test 3<br>
>>     }<br>
>> }<br>
>><br>
>><br>
>> .. But none of this tests gave interesting result :-(... I really don't<br>
>> know where this problem may comes from then, and I really need to be able to<br>
>> pick objects in a Camera containing other sub cameras :-S. Do you have any<br>
>> clue about all that ? What am I doing wrong ?<br>
>><br>
>> regards,<br>
>> Manu.<br>
>><br>
><br>
><br>
</div></div>> _______________________________________________<br>
> osg-users mailing list<br>
> <a href="mailto:osg-users@lists.openscenegraph.org" target="_blank">osg-users@lists.openscenegraph.org</a><br>
> <a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
><br>
><br>
_______________________________________________<br>
osg-users mailing list<br>
<a href="mailto:osg-users@lists.openscenegraph.org" target="_blank">osg-users@lists.openscenegraph.org</a><br>
<a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
</blockquote></div></div></div><br></div>
</blockquote></div><br></div></div></div>
</blockquote></div><br></div></div></div>
</blockquote></div><br></div>