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