<div dir="ltr">Now, a conclusion on this thread: here is how I solved that issue: I'm "registering" all the cameras where I have contain to intersect with, and then I take them one by one to perform an intersection test, but you need to modify the view amtrix, projection matrix and viewport (using those from the main camera), and then I use a modified IntersectionVisitor to "correct" the projection matrix before entering a camera. So here it the most important code parts if someone is interested in introducing that in the core OSG libs one day (sorry I'm really late on my job, so I don't have time for a submission right now :-( ).<br>
<br>main function to do some intersection tests:<br><br><span style="color: rgb(0, 0, 153);">bool Tools::handleViewIntersections(osgViewer::View * view, double x, double y)</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">{</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">  // Bouml preserved body begin 00043B04</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    if(!view) {</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        vLog::logError("invalid view object in tools::handleViewIntersections()");</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        return false;</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    }</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    osgUtil::LineSegmentIntersector::Intersections hits;</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    float local_x, local_y = 0.0;    </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    view->getCameraContainingPosition(x, y, local_x, local_y);</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    osg::Camera* camera = view->getCamera();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    osg::Matrixd pm,vm;</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    osg::ref_ptr<osg::Viewport> vp;</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    osgUtil::LineSegmentIntersector::CoordinateFrame cf = camera->getViewport() ? osgUtil::Intersector::WINDOW : osgUtil::Intersector::PROJECTION;</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    osg::ref_ptr< osgUtil::LineSegmentIntersector > picker = new osgUtil::LineSegmentIntersector(cf, local_x, local_y);</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    vDisplay::DisplayManager::CameraDeq& cams = vDisplay::DisplayManager::getRegisteredCameras(view);</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    for(vDisplay::DisplayManager::CameraDeq::iterator it = cams.begin(); it != cams.end(); ++it) {</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        //osgUtil::IntersectionVisitor iv(picker.get());</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        vOGL::ExtendedIntersectionVisitor iv(picker.get());</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        iv.setFrameStamp(vDisplay::DisplayManager::getViewer()->getFrameStamp());</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        iv.setTraversalMask(vOGL::PICKABLE);</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        vm = (*it)->getViewMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        pm = (*it)->getProjectionMatrix();</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        vp = (*it)->getViewport();</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        (*it)->setViewMatrix(camera->getViewMatrix());</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        (*it)->setProjectionMatrix(camera->getProjectionMatrix());</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        (*it)->setViewport(camera->getViewport());</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        (*it)->accept(iv);   </span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        (*it)->setViewMatrix(vm);</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        (*it)->setProjectionMatrix(pm);</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        (*it)->setViewport(vp.get());</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        if (picker->containsIntersections())</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        {</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">            hits = picker->getIntersections();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">            vLog::logInfo("Got %d intersections",hits.size());</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">            return true;</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        }</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    }</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    vLog::logInfo("Got 0 intersections");</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    return false;</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">  // Bouml preserved body end 00043B04</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">}</span><br><br>the modified function in my ExtendedIntersectionVisitor:<br>
<br><span style="color: rgb(0, 0, 153);">void ExtendedIntersectionVisitor::apply(osg::Camera & camera) {</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">  // Bouml preserved body begin 00043C84</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    // Use a simplified cull traversal here to correct the projection:</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    osg::RenderInfo _renderInfo;</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    _renderInfo.setState(new osg::State);</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    _renderInfo.setView(camera.getView());</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    osg::ref_ptr<osgUtil::CullVisitor> cv = osgUtil::CullVisitor::create();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    cv->setTraversalMask(getTraversalMask()); // Use the same mask to retrieve the good extend of the pickable objects.</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    osg::ref_ptr<osgUtil::RenderStage> renderStage = new osgUtil::RenderStage();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    osg::ref_ptr<osgUtil::StateGraph> rendergraph = new osgUtil::StateGraph();</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    cv->setStateGraph(rendergraph.get());</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    cv->setRenderStage(renderStage.get());</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    cv->reset();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    cv->setFrameStamp(const_cast<osg::FrameStamp*>(getFrameStamp()));</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    if (getFrameStamp())</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    {</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">         cv->setTraversalNumber(getFrameStamp()->getFrameNumber());</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    }</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    //cv->inheritCullSettings(*this);</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    cv->setClearNode(NULL); // reset earth sky on each frame.</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    </span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    cv->setStateGraph(rendergraph.get());</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    cv->setRenderStage(renderStage.get());</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    cv->setRenderInfo( _renderInfo );</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    renderStage->reset();</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    rendergraph->clean();</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    renderStage->setViewport(camera.getViewport());</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    renderStage->setClearColor(camera.getClearColor());</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    renderStage->setClearMask(camera.getClearMask());</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    renderStage->setCamera(&camera);</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    cv->pushViewport(camera.getViewport());</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    cv->pushProjectionMatrix(new osg::RefMatrix(camera.getProjectionMatrix()));</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    cv->pushModelViewMatrix(new osg::RefMatrix(camera.getViewMatrix()),osg::Transform::ABSOLUTE_RF);</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    for(unsigned int childNo=0;</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        childNo<camera.getNumChildren();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        ++childNo)</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    {</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        camera.getChild(childNo)->accept(*cv);</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    }</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    cv->popModelViewMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    cv->popProjectionMatrix();</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    cv->popViewport();</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    renderStage->sort();</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    rendergraph->prune();</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    // Projection correction:</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    osg::Matrixd proj = camera.getProjectionMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    osgUtil::CullVisitor::value_type zNear = cv->getCalculatedNearPlane();</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    osgUtil::CullVisitor::value_type zFar = cv->getCalculatedFarPlane();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    cv->clampProjectionMatrix(proj,zNear,zFar);</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    // Normal process:</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    if (camera.getViewport()) pushWindowMatrix( camera.getViewport() );</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    pushProjectionMatrix( new osg::RefMatrix(proj) );</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    pushViewMatrix( new osg::RefMatrix(camera.getViewMatrix()) );</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    pushModelMatrix( new osg::RefMatrix() );</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    // now push an new intersector clone transform to the new local coordinates</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    push_clone();</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    traverse(camera);</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    // pop the clone.</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    pop_clone();</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    popModelMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    popViewMatrix();</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">    popProjectionMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    if (camera.getViewport()) popWindowMatrix();</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">  // Bouml preserved body end 00043C84</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">}</span><br><br>... I'm not sure we need to setup the CullVisitor so much : but I just took most of the implementation from SceneView::cullstate(...) and it's working like that... and as I said, I'm in an hurry now :-)<br>
<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">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 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 osgIntrospection to manipulate OSG stuff) :<br><br><span style="color: rgb(0, 0, 153);">local root = osg.Group()            </span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">root:setName("Universe")        </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">-- we want to add this root object as a scene in the current project (otherwise it will never be found)</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">-- this root object will be assigned as the scenedata for the master camera.</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">local proj = vProj.ProjectManager.instance():getCurrent()</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">proj:add_Scene(root)</span><br style="color: rgb(0, 0, 153);"><br><span style="color: rgb(0, 0, 153);">local view = vDisplay.DisplayManager.getViewer():getView(0)</span>  <span style="color: rgb(255, 0, 0);">-- here, getViewer() returns our osgViewer::CompositeViewer object</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">local manip = reflection.cast(view:getCameraManipulator(),"vGA::ArcBallManipulator")</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">-- now create the LTS project:</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">require('LTS')</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">local cam = view:getCamera() <span style="color: rgb(255, 0, 0);"> </span><font style="color: rgb(255, 0, 0);" color="#000000">-- this is the "main" camera, the scene data for this camera is the previously declared "root" object </font></span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">local subcam = osg.Camera()</span>  <span style="color: rgb(255, 0, 0);">-- we create a sub camera than we will add to the main scene (so an inderect child for the main camera...)</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">subcam:setGraphicsContext(cam:getGraphicsContext())</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">subcam:setViewport(cam:getViewport())</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">subcam:setRenderOrder(osg.Camera.RenderOrder.POST_RENDER,3) <span style="color: rgb(255, 0, 0);">-- We post render this subcamera with an arbitrary order.</span></span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">subcam:setClearMask(GL.Mode.GL_DEPTH_BUFFER_BIT)<span style="color: rgb(255, 0, 0);"> -- We want to render Universe scale scenes that's why we introduced this multi pass system.</span></span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">root:addChild(subcam)</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">local st = vOGL.SceneTools;</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">local pat = osg.PositionAttitudeTransform()</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">pat:addChild(LTS.createDoubleCraft("K1")) </span><span style="color: rgb(0, 0, 153);"><span style="color: rgb(255, 0, 0);"> -- Here we create a satellit object </span></span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">subcam:addChild(pat)</span><span style="color: rgb(0, 0, 153);"></span><span style="color: rgb(0, 0, 153);"><span style="color: rgb(255, 0, 0);"> -- And we add the object to the sub camera...</span></span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);"><br><br><font color="#000000">... this scene is rendered perfectly... but now I'm trying to "pick" items in the scene using the implementation found in osgViewer::View::computeIntersections(...) : If I put my "K1" object directly "in" the "main" camera everything is perfect, and I can pick intersections correctly. But when using this "subcam"  as parent then I get incorrect results :-( (intersections found when clicking on nothing, or no intersections found when cliking on sub parts of the object...)<br>

<br>I gave a look at the osgUtil::IntersectionVisitor implementation... and I think everything is happening in this function:<br><br><span style="color: rgb(0, 0, 153);">void IntersectionVisitor::apply(osg::Camera& camera)</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">{</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    // osg::notify(osg::NOTICE)<<"apply(Camera&)"<<std::endl;</span><br style="color: rgb(0, 0, 153);">

<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    // note, commenting out right now because default Camera setup is with the culling active.  Should this be changed?</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">    // if (!enter(camera)) return;</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    // osg::notify(osg::NOTICE)<<"inside apply(Camera&)"<<std::endl;</span><br style="color: rgb(0, 0, 153);">

<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    if (camera.getViewport()) pushWindowMatrix( camera.getViewport() );</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    pushProjectionMatrix( new osg::RefMatrix(camera.getProjectionMatrix()) );</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">    pushViewMatrix( new osg::RefMatrix(camera.getViewMatrix()) );</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    pushModelMatrix( new osg::RefMatrix() );</span><br style="color: rgb(0, 0, 153);">

<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    // now push an new intersector clone transform to the new local coordinates</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    push_clone();</span><br style="color: rgb(0, 0, 153);">

<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    traverse(camera);</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    // pop the clone.</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">    pop_clone();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    popModelMatrix();</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">    popViewMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    popProjectionMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    if (camera.getViewport()) popWindowMatrix();</span><br style="color: rgb(0, 0, 153);">

<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    // leave();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">}</span><br><br>I created my own "ExtendedIntersectorVisitor" (derived from this class) to override this function and I made multiple tests to handle the "main" camera and the "sub" cameras differently:<br>

<br><span style="color: rgb(0, 0, 153);">void ExtendedIntersectionVisitor::apply(osg::Camera & camera) {</span><span style="color: rgb(0, 0, 153);"></span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    if(!cameraInitialized) {</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">        cameraInitialized = true;</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);"><span style="color: rgb(255, 0, 0);">        // The first time we get a camera object we use it to setup the camera details normaly:</span><br style="color: rgb(255, 0, 0);">

<br style="color: rgb(0, 0, 153);"></span><span style="color: rgb(0, 0, 153);">        if (camera.getViewport()) pushWindowMatrix( camera.getViewport() );</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        pushProjectionMatrix( new osg::RefMatrix(camera.getProjectionMatrix()) );</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">        pushViewMatrix( new osg::RefMatrix(camera.getViewMatrix()) );</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        pushModelMatrix( new osg::RefMatrix() );</span><br style="color: rgb(0, 0, 153);">

<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        // now push an new intersector clone transform to the new local coordinates</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        push_clone();</span><br style="color: rgb(0, 0, 153);">

<br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        traverse(camera);</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        </span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">        // pop the clone.</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        pop_clone();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        </span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">        popModelMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        popViewMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        popProjectionMatrix();</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">        if (camera.getViewport()) popWindowMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    }</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    else {<br>

<span style="color: rgb(255, 0, 0);">        // here I did multiple tests (one by one):</span><br><br>  <span style="color: rgb(255, 0, 0);">      // Test 1: treat the camera as a transform  (took implementation from IntersectionVisitor::apply(osg::Transform&) )</span><br>

</span></font></span><span style="color: rgb(0, 0, 153);"><font color="#000000"><span style="color: rgb(0, 0, 153);">        if (!enter(*(camera.asTransform()))) return;</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">       
osg::ref_ptr<osg::RefMatrix> matrix = _modelStack.empty() ? new
osg::RefMatrix() : new osg::RefMatrix(*_modelStack.back());</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        camera.computeLocalToWorldMatrix(*matrix,this);</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        pushModelMatrix(matrix.get());</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        // now push an new intersector clone transform to the new local coordinates</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        push_clone();</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        traverse(camera);</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        </span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        // pop the clone.</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        pop_clone();</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        </span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        popModelMatrix();</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        // tidy up an cached cull variables in the current intersector.</span><br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        leave();<br><span style="color: rgb(255, 0, 0);">       // End of Test 1</span><br><br><span style="color: rgb(255, 0, 0);">       // Test 2: treat the camera as a osg::Group only!</span><br>

</span></font></span><span style="color: rgb(0, 0, 153);"><font color="#000000"><span style="color: rgb(0, 0, 153);">        if (!enter(*(camera.asGroup()))) return;</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        traverse(*(camera.asGroup()));</span><br style="color: rgb(0, 0, 153);">
<br style="color: rgb(0, 0, 153);">
<span style="color: rgb(0, 0, 153);">        leave();</span></font></span><br><span style="color: rgb(0, 0, 153);"><font color="#000000"><span style="color: rgb(0, 0, 153);"><span style="color: rgb(255, 0, 0);">       // End of test 2</span><br>

<br><span style="color: rgb(255, 0, 0);">       // Test 3: just try not to push the model matrix, view matrix, projection or viewport, one by one:</span><br style="color: rgb(255, 0, 0);"><br style="color: rgb(0, 0, 153);">

</span></font></span><span style="color: rgb(0, 0, 153);"><font color="#000000"><span style="color: rgb(0, 0, 153);"></span><span style="color: rgb(0, 0, 153);">        if (camera.getViewport()) pushWindowMatrix( camera.getViewport() );</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">        pushProjectionMatrix( new osg::RefMatrix(camera.getProjectionMatrix()) );</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        pushViewMatrix( new osg::RefMatrix(camera.getViewMatrix()) );</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">        //pushModelMatrix( new osg::RefMatrix() );</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        // now push an new intersector clone transform to the new local coordinates</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">        push_clone();</span><br style="color: rgb(0, 0, 153);"><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        traverse(camera);</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">        </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        // pop the clone.</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        pop_clone();</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">        </span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        //popModelMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        popViewMatrix();</span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">        popProjectionMatrix();</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">        if (camera.getViewport()) popWindowMatrix();</span><span style="color: rgb(0, 0, 153);"></span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);"></span><span style="color: rgb(0, 0, 153);"></span><span style="color: rgb(255, 0, 0);">        // End of Test 3</span><br style="color: rgb(0, 0, 153);"><span style="color: rgb(0, 0, 153);">    }</span><span style="color: rgb(0, 0, 153);"></span><br style="color: rgb(0, 0, 153);">

<span style="color: rgb(0, 0, 153);">}</span><br style="color: rgb(0, 0, 153);"><br><br>.. But none of this tests gave interesting result :-(... I really don't know where this problem may comes from then, and I really need to be able to pick objects in a Camera containing other sub cameras :-S. Do you have any clue about all that ? What am I doing wrong ?<br style="color: rgb(0, 0, 153);">

</font></span><br>regards,<br>Manu.<br><br></div>
</blockquote></div><br></div>