2017-01-04 12 views
0

Я хочу использовать OpenSceneGraph Pickhandler, чтобы печатать имя узла при нажатии с помощью мыши. Я сделал файл заголовка PickHandler и включил то, что, по моему мнению, является правильным кодом, чтобы это произошло.Mouse event picker openscenegraph

После ошибок при запуске приложения не отображается имя узла при нажатии. Я пропустил что-то важное?

bool PickHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) 
{ 
    `if(ea.getEventType() != osgGA::GUIEventAdapter::RELEASE && 
    ea.getButton() != osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) 
    { 
return false; 
    } 

    osgViewer::View* viewer = dynamic_cast<osgViewer::View*>(&aa); 

    if(viewer) 
    { 
osgUtil::LineSegmentIntersector* intersector 
    = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, ea.getX(), ea.getY());`if(ea.getEventType() != osgGA::GUIEventAdapter::RELEASE && 
    ea.getButton() != osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) 
{ 
return false; 
} 

osgViewer::View* viewer = dynamic_cast<osgViewer::View*>(&aa); 

if(viewer) 
{ 
osgUtil::LineSegmentIntersector* intersector 
    = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, ea.getX(), ea.getY()); 

osgUtil::IntersectionVisitor iv(intersector); 

osg::Camera* camera = viewer->getCamera(); 
if(!camera) 
    return false; 

camera->accept(iv); 

if(!intersector->containsIntersections()) 
    return false; 

auto intersections = intersector->getIntersections(); 

std::cout << "Got " << intersections.size() << " intersections:\n"; 

for(auto&& intersection : intersections) 
    std::cout << " - Local intersection point = " << intersection.localIntersectionPoint << "\n"; 
} 

return true; 
} 
+0

Похоже, вы пропустили имя печать в вашем коде. Печатает ли размер пересечения и локальную точку пересечения как в коде? – vicrucann

+0

Да, он печатает следующую информацию, но не уверен, как получить имя узла в этой точке. Примера вывода: Got 2 перекрестков: - Локальная точка пересечения = -0,148942 -0,512957 0,357376 - Локальная точка пересечения = -0,159801 0,489366 0,363891 –

ответ

0

Вам необходимо извлечь имя узла, чтобы его распечатать. Если вы не используете какие-либо пользовательские узлы, используйте intersection.drawable->getName(). Убедитесь, что вы указали имя для этого объекта osg::Geometry, иначе имя по умолчанию пусто.

Код печати для вашего дела будет что-то вроде:

for(auto&& intersection : intersections) { 
    std::cout << " - Local intersection point = " << intersection.localIntersectionPoint << "\n"; 
    std::cout << "Intersection name = " << intersection.drawable->getName() << std::endl; 
} 
+0

Большого спасибо за вашу помощь. Однако последняя строка ошибок кода объясняет, что часть «пересечения» не определена. Я не понимаю этого, когда строка кода над ним работает. Я создал класс nodeVisitor, который возвращает имена узлов в порядке, поэтому я просто смогу использовать это? –

+0

@ unistudent123 Если вы скопировали код из моего ответа, я забыл поставить открывающий скобок '{' там. Я отредактировал свой ответ, чтобы исправить это. Убедитесь, что в вашем коде находятся скобки. – vicrucann

+0

Я только скопировал - std :: cout << "Intersection name =" << intersection.drawable-> getName() << std :: endl; Однако пересечения. показывает подчеркнутое в красном объяснении «идентификатор» пересечение »не определено. Сбивать с толку как intersection.localIntersectionPoint отлично работает –