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