Hi,
i have got the problem with position line - Intersector, more informations in
part of the code:
(the scene is only rectangle face, it's z=0.0f)
1) creating x,y,z position line:
osg::Vec3f v3f_start(33.0f, -23.0f, 10.0f); //init position ( start )
osg::Vec3d v3f_end(33.0f, -23.0f, -5.0f); //init position ( end )
2) Intersector group:
osg::ref_ptr<osgUtil::IntersectorGroup> intersectorGroup = new
osgUtil::IntersectorGroup();
osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new
osgUtil::LineSegmentIntersector(v3f_start, v3f_end);
intersectorGroup->addIntersector( intersector.get() );
osgUtil::IntersectionVisitor intersectVisitor( intersectorGroup.get(),
new MyReadCallback );
model->accept(intersectVisitor);
3) Check intersect
if ( intersectorGroup->containsIntersections() )
{
...
intersection.getWorldIntersectPoint(); //interscetion point is in 33.0f, -
23.0f, 0.0f
...
}
4) Update position line
osgUtil::IntersectorGroup::Intersectors& ints =
intersectorGroup->getIntersectors();
for(osgUtil::IntersectorGroup::Intersectors::iterator intersector_itr2
= ints.begin();
intersector_itr2 != ints.end();
++intersector_itr2)
{
osgUtil::LineSegmentIntersector* lsi =
dynamic_cast<osgUtil::LineSegmentIntersector*>(intersector_itr2->get());
if (lsi)
{
v3f_start.set(33.0f, 23.0f, 10.0f); //new position
( start )
v3f_end.set(33.0f, 23.0f, -5.0f); //new position
( end )
lsi->setStart( v3f_start );
lsi->setEnd( v3f_end );
}
}
5) Check intersect
if ( intersectorGroup->containsIntersections() )
{
...
intersection.getWorldIntersectPoint();
//interscetion point is still the same(!) 33.0f, - 23.0f, 0.0f
//i thought that correct point must be 33.0f, 23.0f, 0.0f because
LineSegmentIntersector contains correct new (start - end) position
...
}
Where is the problem?
full code here:
Code:
void check_face(osgUtil::IntersectorGroup *intersectorGroup)
{
if ( intersectorGroup->containsIntersections() )
{
osgUtil::IntersectorGroup::Intersectors& intersectors =
intersectorGroup->getIntersectors();
for(osgUtil::IntersectorGroup::Intersectors::iterator
intersector_itr = intersectors.begin();
intersector_itr != intersectors.end();
++intersector_itr)
{
osgUtil::LineSegmentIntersector* lsi =
dynamic_cast<osgUtil::LineSegmentIntersector*>(intersector_itr->get());
if (lsi)
{
osgUtil::LineSegmentIntersector::Intersections&
intersections = lsi->getIntersections();
for(osgUtil::LineSegmentIntersector::Intersections::iterator itr =
intersections.begin();
itr != intersections.end();
++itr)
{
const
osgUtil::LineSegmentIntersector::Intersection& intersection = *itr;
osg::Vec3f lv_pos;
lv_pos =
intersection.getWorldIntersectPoint();
const osg::NodePath my_nodePath =
intersection.nodePath;
unsigned int lun_nsize =
my_nodePath.size();
osg::Node * ln_node = 0;
osg::Group * ln_parent = 0;
ln_node =
(lun_nsize>=1)?my_nodePath[my_nodePath.size()-1]:0;
std::string name = ln_node->getName();
//name
unsigned int mask =
ln_node->getNodeMask(); //
//2nd group
ln_parent =
(lun_nsize>=2)?dynamic_cast<osg::Group*>(my_nodePath[1]):0;
if (ln_parent)
{
std::string name2 =
ln_parent->getName(); //name parent
unsigned int mask2 =
ln_parent->getNodeMask(); //mask parent
}
}
}
}
}
}
//intersection
osg::Vec3f v3f_start(33.0f, -23.0f, 10.0f); //init position ( start
)
osg::Vec3d v3f_end(33.0f, -23.0f, -5.0f); //init position ( end )
osg::ref_ptr<osgUtil::IntersectorGroup> intersectorGroup = new
osgUtil::IntersectorGroup();
osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new
osgUtil::LineSegmentIntersector(v3f_start, v3f_end);
intersectorGroup->addIntersector( intersector.get() );
osgUtil::IntersectionVisitor intersectVisitor( intersectorGroup.get(),
new MyReadCallback );
model->accept(intersectVisitor);
check_face(intersectorGroup);
osgUtil::IntersectorGroup::Intersectors& ints =
intersectorGroup->getIntersectors();
for(osgUtil::IntersectorGroup::Intersectors::iterator intersector_itr2
= ints.begin();
intersector_itr2 != ints.end();
++intersector_itr2)
{
osgUtil::LineSegmentIntersector* lsi =
dynamic_cast<osgUtil::LineSegmentIntersector*>(intersector_itr2->get());
if (lsi)
{
v3f_start.set(33.0f, 23.0f, 10.0f); //new position
( start )
v3f_end.set(33.0f, 23.0f, -5.0f); //new position
( end )
lsi->setStart( v3f_start );
lsi->setEnd( v3f_end );
}
}
check_face(intersectorGroup);
Thank you!
Cheers,
petr[/code]
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=11984#11984
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org