Hi Jen,

I haven't personally used the OcclusionQueryNode for work myself, perhaps
Paul Martz the author of this feature might be able to chip in.

Robert.

On 12 December 2012 12:39, Jen Hunter <[email protected]> wrote:

> Hi Robert,
>
> thank you for your reply. I appreciate your help :)
>
> I'm sorry if I didn't express myself correctly. I also have to admit I'm
> not quite the expert on computer graphics.
>
> Let's try to make it clearer. I want to know which of the lines on my
> model are visible in a rendered image. That would be the case if a line
> results in at least one drawn pixel.
>
> I need to have this information for an AR application which performs edge
> tracking. Such approaches work with 2D-3D correspondences for each frame to
> estimate the camera parameters.
> The recorded webcam image of an object shows of course only the edges of
> the object which are visible from the cameras point of view. To get the
> correspondences I need excactly the same lines on the model (from the last
> frame).
>
> I programmed a working OPENGL example for finding out the visible lines
> using occlusion query glGetOcclusionQueryuivNV.
>
> At the moment I fail to understand how to make that work for OSG. I had a
> look at osgocclusionquery and the used OcclusionQueryNode and understand
> that it uses ARB_occlusion_query to check the pixel count.
>
> I tried the following but the output of the visible lines is still
> incorrect:
>
>
> Code:
>
> osg::Node* scene = osgDB::readNodeFile("file.dae");
> if (!scene) return 1;
>
> osg::Group* rootnode = new osg::Group;
> rootnode->addChild(scene);
> viewer.setSceneData(rootnode);
>
> GetLinesVisitor lineFinder;
> scene->accept(lineFinder);
> lines = lineFinder.getLineVector();
>
> for(int i = 0; i < lines.size(); i++){
>
>         osg::ref_ptr<osg::OcclusionQueryNode> parent = new
> osg::OcclusionQueryNode;
>         parent->setVisibilityThreshold( 0 );
>
>         osg::Geometry* linesGeom = new osg::Geometry();
>         osg::Vec3Array* vertices = new osg::Vec3Array;
>         vertices->push_back(lines.at(i).start);
>         vertices->push_back(lines.at(i).end);
>         linesGeom->setVertexArray(vertices);
>         linesGeom->addPrimitiveSet(new
> osg::DrawArrays(osg::PrimitiveSet::LINES,0,2));
>
>         osg::Geode* geode = new osg::Geode();
>         geode->addDrawable(linesGeom);
>         parent->addChild(geode);
>
>
>         //A std::vector for all OcclusionQueryNodes. I later ask in a loop
> for each element oqNodes.at(i).get()->getPassed() and count the trues
>         oqNodes.push_back(parent);
>         rootnode->addChild(parent);
> }
>
>
>
>
>
>
> So here are my questions:
>
> (1) How do I set up an OcclusionQueryNode for each line?
>
> (2) Why does the approach from my previous post not work? Is the
> calculation of screen coordinates (using MVPW matrix) for a given vertex
> really so imprecise that I cannot count on this being the correct
> coordinates to look up in the depth buffer?
>
>
> Cheers,
> Dakota
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=51538#51538
>
>
>
>
>
> _______________________________________________
> 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

Reply via email to