<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>