2017-01-04 1 views
0

Je souhaite utiliser OpenSceneGraph Pickhandler pour imprimer le nom d'un noeud lorsque je clique dessus avec une souris. J'ai fait un fichier PickHandler Header et inclus ce que je pense être le code correct pour que cela se produise.Sélecteur d'événements de souris openscenegraph

Après aucune erreur lors de l'exécution de l'application n'affiche pas le nom du nœud lorsque vous cliquez dessus. Ai-je manqué quelque chose d'important?

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

On dirait que vous avez manqué l'impression de nom dans votre code. Imprime-t-il la taille de l'intersection et le point d'intersection local comme dans le code? – vicrucann

+0

Oui, il imprime les informations suivantes, mais ne sait pas comment obtenir le nom du nœud à ce moment-là. Exemple de sortie: Got 2 intersections: - point d'intersection local = -0,148942 -0,512957 0,357376 - point d'intersection local = -0,159801 0,489366 0,363891 –

Répondre

0

Vous devez extraire le nom de votre noeud pour l'imprimer. Si vous n'utilisez aucun noeud personnalisé, utilisez intersection.drawable->getName(). Assurez-vous de définir un nom pour osg::Geometry de ce particulier, sinon le nom est vide par défaut.

Le code d'impression pour votre cas serait quelque chose comme:

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

Merci beaucoup pour votre aide. Cependant, la dernière ligne d'erreurs de code expliquant que la partie 'intersection' est indéfinie. Je ne comprends pas cela lorsque la ligne de code ci-dessus fonctionne. J'ai mis en place une classe nodeVisitor qui retourne bien les noms des noeuds, donc serais-je capable de l'utiliser? –

+0

@ unistudent123 Si vous avez copié le code à partir de ma réponse, j'ai oublié de mettre une parenthèse d'ouverture '{' là. J'ai édité ma réponse pour le réparer. Assurez-vous que les crochets sont bien dans votre code. – vicrucann

+0

J'ai seulement copié - std :: cout << "Intersection name =" << intersection.drawable-> getName() << std :: endl; Cependant l'intersection. est affiché souligné en rouge expliquant 'identifiant' intersection "est indéfini. Confondre que l'intersection.localIntersectionPoint fonctionne bien –