I think I figured it out. It looks like even with culling turned off,
nodes that are behind the "eye point" are culled. See
osgUtil/CullVisitor.cpp line 645.

I now calculate the view matrix as follows.

  osg::Matrixd matrix = osg::Matrixd::translate( -center );
  matrix.postMultRotate( osg::Quat( PI, osg::Vec3d( 1.0, 0.0, 0.0 ) ) );
  matrix.postMultTranslate( osg::Vec3d( 0.0, 0.0, -0.5 ) );

Adding the last translation transform to push the nodes away from the
"eye point" made the problem go away.

Is this a bug?

Frank

On Thu, Nov 13, 2008 at 11:38:14AM -0500, [EMAIL PROTECTED] wrote:
> Hi Robert,
> 
> Thanks for the quick response. That was a good suggestion. However it
> looks like that is not the problem. All of my nodes live on the z=0.0
> plane and my projection matrix is
> 
>   osg::Matrixd::ortho( -aspectRatio, aspectRatio, -1.0, 1.0, -1.0, 1.0 )
> 
> I have attached a small code sample that exhibits the problem.
> 
> Frank
> 
> On Thu, Nov 13, 2008 at 04:24:37PM +0000, Robert Osfield wrote:
> > Hi Frank,
> > 
> > My best guess is that your projection matrix isn't wide enough to
> > encompass your scene and near/far clipping is clipping out the
> > fragments.  This may well look like culling, often users do mistake
> > clipping with culling so chase up the wrong part of the pipeline.
> > 
> > Robert.
> > 
> > On Thu, Nov 13, 2008 at 4:18 PM,  <[EMAIL PROTECTED]> wrote:
> > > Greetings osg community,
> > >
> > > I'm have written a custom MatrixManipulator for a 2D scene and I am
> > > experiencing a strange problem. As I pan and zoom around, some of the
> > > nodes in the scene disappear abruptly as if they are being culled
> > > inappropriately. However, disabling culling has no effect.
> > >
> > > The behavior is erratic and unpredictable which smells to me like I'm on
> > > the border of a floating point inequality. I have discovered two ways
> > > that seem to make the problem go away.
> > >
> > > One:
> > >
> > >  One of the transformations I use to construct the view matrix is
> > >
> > >    osg::Matrixd::rotate( osg::Quat( PI, osg::Vec3d( 1.0, 0.0, 0.0 ) ) )
> > >
> > >  If I replace that with
> > >
> > >    osg::Matrixd::scale( osg::Vec3d( 1.0, -1.0, 1.0 ) )
> > >
> > >  the problem seems to go away.
> > >
> > > Two:
> > >
> > >  All of the nodes in my seen that exhibit this problem have a 2D
> > >  bounding box. i.e.
> > >
> > >     osg::BoundingBox const & bb = pGeode->getBoundingBox();
> > >     assert( bb.zMax() - bb.zMin() < 1e-5 );
> > >
> > >  If I give the nodes some depth so that the above assert would fail,
> > >  the problem seems to go away.
> > >
> > > I suspect that these are not actual solutions. In any case, I would like
> > > to understand what is happening under the covers. Any ideas?
> > >
> > > Frank
> > >
> > > _______________________________________________
> > > 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

> 
> #include <osg/Geode>
> #include <osg/Geometry>
> #include <osgViewer/Viewer>
> 
> #include <iostream>
> #include <cassert>
> 
> osg::ref_ptr< osg::Node > CreateGraph()
>   {
>   osg::ref_ptr< osg::Geode >    pGeode    = new osg::Geode();
>   osg::ref_ptr< osg::Geometry > pGeometry = new osg::Geometry();
>   pGeode->addDrawable( pGeometry.get() );
> 
>   // Vertices
>   osg::ref_ptr< osg::Vec3Array > pVerts = new osg::Vec3Array( 4 );
>   (*pVerts)[ 0 ] = osg::Vec3( 0.0, 0.0, 0.0 );
>   (*pVerts)[ 1 ] = osg::Vec3( 1.0, 0.0, 0.0 );
>   (*pVerts)[ 2 ] = osg::Vec3( 1.0, 1.0, 0.0 );
>   (*pVerts)[ 3 ] = osg::Vec3( 0.0, 1.0, 0.0 ); // dosen't work
>   //(*pVerts)[ 3 ] = osg::Vec3( 0.0, 1.0, 0.1 ); // works as expected
>   pGeometry->setVertexArray( pVerts.get() );
> 
>   pGeometry->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::QUADS, 
> 0, 4 ) );
> 
>   osg::ref_ptr< osg::Vec4Array > pColors = new osg::Vec4Array( 4 );
>   (*pColors)[ 0 ] = osg::Vec4( 1.0f, 1.0f, 1.0f, 1.0f );
>   (*pColors)[ 1 ] = osg::Vec4( 1.0f, 0.0f, 0.0f, 1.0f );
>   (*pColors)[ 2 ] = osg::Vec4( 0.0f, 1.0f, 0.0f, 1.0f );
>   (*pColors)[ 3 ] = osg::Vec4( 0.0f, 0.0f, 1.0f, 1.0f );
>   pGeometry->setColorArray( pColors.get() );
>   pGeometry->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
> 
>   osg::ref_ptr< osg::StateSet > pState = pGeode->getOrCreateStateSet();
>   pState->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
> 
>   osg::BoundingBox const & bb = pGeode->getBoundingBox();
>   std::cout
>     << "BoundingBox = ("
>     << bb.xMin() << ","
>     << bb.yMin() << ","
>     << bb.zMin() << ","
>     << bb.xMax() << ","
>     << bb.yMax() << ","
>     << bb.zMax() << ")"
>     << std::endl;
> 
>   return pGeode.get();
>   }
> 
> int main( int argc, char * argv[] )
>   {
>   int const x = 100;
>   int const y = 100;
>   int const w = 800;
>   int const h = 800;
> 
>   osg::ref_ptr< osg::GraphicsContext::Traits > pTraits = new 
> osg::GraphicsContext::Traits();
>   pTraits->x                = x;
>   pTraits->y                = y;
>   pTraits->width            = w;
>   pTraits->height           = h;
>   pTraits->windowDecoration = true;
>   pTraits->doubleBuffer     = true;
>   pTraits->sharedContext    = 0;
> 
>   osg::ref_ptr< osg::GraphicsContext > pContext =
>     osg::GraphicsContext::createGraphicsContext( pTraits.get() );
>   assert( pContext.valid() );
> 
>   osgViewer::Viewer viewer;
> 
>   viewer.getCamera()->setGraphicsContext( pContext.get() );
>   viewer.getCamera()->setClearColor( osg::Vec4( 0.0, 0.0, 0.0, 1.0 ) );
>   viewer.getCamera()->setViewport( new osg::Viewport( 0, 0, w, h ) );
>   viewer.getCamera()->setGraphicsContext( pContext.get() );
>   viewer.getCamera()->setCullingMode( osg::CullSettings::NO_CULLING );
> 
>   double const aspectRatio = double(w)/double(h);
>   //osg::Matrixd ortho = osg::Matrixd::ortho2D( -aspectRatio, aspectRatio, 
> -1.0, 1.0 );
>   osg::Matrixd ortho = osg::Matrixd::ortho( -aspectRatio, aspectRatio, -1.0, 
> 1.0, -1.0, 1.0 );
>   viewer.getCamera()->setProjectionMatrix( ortho );
> 
>   osg::ref_ptr< osg::Node > pGraph = CreateGraph();
> 
>   viewer.setSceneData( pGraph );
> 
>   viewer.realize();
> 
>   int               n = 0;
>   int const         N = 4000; // adjust for your computer speed
>   osg::Vec3d const  initialCenter( 0.5, 0.5, 0.0 );
> 
>   while ( !viewer.done() )
>     {
>     n = ( n + 1 ) % N;
>     double d = -double(n)/double(N);
> 
>     osg::Vec3d center = initialCenter + osg::Vec3d( 0.0, d, 0.0 );
>     //std::cout
>     //  << "center = ("
>     //  << center[0] << ","
>     //  << center[1] << ","
>     //  << center[2] << ")"
>     //  << std::endl;
> 
>     osg::Matrixd matrix = osg::Matrixd::translate( -center );
> 
>     // doesn't work
>     double const PI = 3.14159265;
>     matrix.postMultRotate( osg::Quat( PI, osg::Vec3d( 1.0, 0.0, 0.0 ) ) );
> 
>     // works as expected, but left handed coordinate system is not desired
>     //matrix.postMultScale( osg::Vec3d( 1.0, -1.0, 1.0 ) );
> 
>     viewer.getCamera()->setViewMatrix( matrix );
> 
>     viewer.frame();
>     }
> 
>   return 0;
>   }
> 

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