Wow, so this is odd. I found a way to fix this. I was using a linesegment length of 2.0, as I had a 2 ft stick attached to the wand. But, if I make the linesegment longer, to a length of 200.0, the intersection works like a charm. Is this the intended behavior?
Dave Pugmire wrote: > Hi, > I'm scratching my head on this one. > I have a line segment, that is aligned to the tracked wand. I'm trying > to intersect it with the scene, which is composed of a single box. > However, the intersections that I get are not making sense. > > Here is the line segment, made from two points: > p1 = ( -.24, 5.5, .033 ) p2 = (-.24 5.5 -1.96) > Note that this is a line of constant Y=5.5 > Length of 2 along the -Z direction. > > The box is cenetered at 0, 4.5, -1, and has unit dimensions. > The bounding box of the box is: > xyzMin = [-.5, 4, -1.5] xyzMax = [.5, 5, -.5] > The box has no transformations above it, it's a direct child of the > scene root. > > When I run IntersectVisitor on the graph, it detects an intersection > with the box at: [-.17, 4.0, -.88] > Which is NOT on the LineSegment. > I'm confused. Here is the code that I'm using. > m_wandP1 and m_wandP2 are the two points mentioned above. > > > Thanks, > -dave > > > void CWand::UpdateIntersect( osg::Group *pSceneRoot ) > { > osg::Vec3 wandDir = m_wandP2 - m_wandP1; > > //Create a line segment for the wand end points. > > osg::ref_ptr<osg::LineSegment> wandStick = new osg::LineSegment( > m_wandP2, -wandDir ); > > //Intersect with the scene graph. > osgUtil::IntersectVisitor intersectVisitor; > intersectVisitor.setLODSelectionMode( > osgUtil::IntersectVisitor::USE_HIGHEST_LEVEL_OF_DETAIL ); > intersectVisitor.addLineSegment( wandStick.get() ); > pSceneRoot->accept( intersectVisitor ); > > if ( m_bPrintUpdate ) > printf( "Poke: P0 <%f %f %f> P1 <%f %f %f> Dir:[%f %f %f]\n\n", > m_wandP1[0],m_wandP1[1],m_wandP1[2], > m_wandP2[0],m_wandP2[1],m_wandP2[2], > wandDir[0],wandDir[1],wandDir[2] ); > > osgUtil:: IntersectVisitor::HitList htl = > intersectVisitor.getHitList( wandStick.get() ); > vector<osg::Geode*> geodeHits; > int numHits = 0; > if ( htl.size() > 0 ) // We always hit the wand, so only consider > "additional" hits. > { > for ( int i = 0; i < htl.size(); i++ ) > { > osg::Vec3 pt = htl[i].getWorldIntersectPoint(); > osg::Vec3 n = htl[i].getWorldIntersectNormal(); > osg::NodePath np = htl[i].getNodePath(); > //osg::Vec3 pt = htl[i].getLocalIntersectPoint(); > osg::Vec3 dir = m_wandP1-pt; > > if ( true ) > { > numHits++; > geodeHits.push_back( htl[i].getGeode() ); > > if ( m_bPrintUpdate ) > { > printf( "\tIsect[%d]: %s D=%f [%f %f %f] Pt=<%f %f %f> N<%f > %f > %f>\n", numHits, > htl[i].getGeode()->getName().c_str(), > dir.length(), > dir[0],dir[1],dir[2],pt[0],pt[1],pt[2], > n[0],n[1],n[2] ); > osg::BoundingBox bb = htl[i].getGeode()->getBoundingBox(); > printf( "\tBBOX: [%f %f %f] [%f %f %f]\n", > bb.xMin(),bb.yMin(),bb.zMin(), > bb.xMax(),bb.yMax(),bb.zMax() ); > printf( "\t Node path:\n" ); > for ( int j = 0; j < np.size(); j++ ) > { > osg::Node *node = np[j]; > printf( "\t%d: %s\n", j, node->className() ); > > osg::MatrixTransform *pMT = > dynamic_cast<osg::MatrixTransform*>(node); > osg::PositionAttitudeTransform *pPAT = > dynamic_cast<osg::PositionAttitudeTransform*>(node); > if ( pMT != NULL ) //node->className() == > "MatrixTransform" ) > { > osg::MatrixTransform *pMtx = (osg::MatrixTransform > *) node; > osg::Matrix mtx = pMtx->getMatrix(); > printf( "\t T[%f %f %f] [%f %f %f] [%f %f %f] [%f > %f %f]\n", > mtx(3,0),mtx(3,1),mtx(3,2), > mtx(0,0),mtx(0,1),mtx(0,2), > mtx(1,0),mtx(1,1),mtx(1,2), > mtx(2,0),mtx(2,1),mtx(2,2) ); > } > else if ( pPAT != NULL ) > { > osg::Vec3 p = pPAT->getPosition(); > osg::Quat Q = pPAT->getAttitude(); > osg::Vec4 q = Q.asVec4(); > printf( "\t T[ %f %f %f] Q[%f %f %f %f]\n", > p[0],p[1],p[2], q[0],q[1],q[2],q[3] ); > } > else > printf( "??\n" ); > } > > //osg::Matrix *mtx = (osg::Matrix*)htl[i].getMatrix(); > //printf( "\tRM: [%f %f %f]\n", (*mtx)(0,0), (*mtx)(0,1), > (*mtx)(0,2) ); > } > } > } > } > > m_wandShapeDrawable->setColor( (numHits > 0 ? m_IntersectColor : > m_Color) ); > > } > > _______________________________________________ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org _______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org