2017-01-04 53 views
0

我想使用OpenSceneGraph Pickhandler來打印用鼠標點擊時節點的名稱。我製作了一個PickHandler頭文件,幷包含了我認爲是正確的代碼來實現此目的。鼠標事件選取器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

是的,它會打印以下信息,但不知道如何獲取該點的節點名稱。輸出的 例子: 了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

非常感謝您的幫助。然而,最後一行代碼錯誤解釋了'intersection'部分是未定義的。當它上面的代碼行起作用時,我不明白這一點。 我已經建立了一個nodeVisitor類,它返回節點的名字,所以我可以使用它嗎? –

+0

@ unistudent123如果您從我的答案中複製了代碼,我忘了在其中放置一個前括號。我編輯了我的答案來修復它。確保代碼中的括號完全正確。 – vicrucann

+0

我只複製 - std :: cout <<「Intersection name =」<< intersection.drawable-> getName()<< std :: endl; 但是交集。顯示紅色下劃線解釋'標識符'交叉口「是未定義的。 混淆爲intersection.localIntersectionPoint工作正常 –