OSGEarth模型点击事件
程序员文章站
2022-06-10 21:14:07
...
目录
使用OSGEarth进行开发时,有时需要实现点击添加的三维模型,触发某个事件。
一、实现模型点击事件
下列代码实现了点击模型时,当点击的模型名称与监听的模型名称一致时,就触发某个事件。
#include "StdAfx.h"
#include "PickNodeHandler.h"
CPickHandler::CPickHandler(osgViewer::Viewer *viewer) :m_pViewer(viewer)
{
}
CPickHandler::~CPickHandler(void)
{
}
bool CPickHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
switch (ea.getEventType())
{
case(osgGA::GUIEventAdapter::RELEASE):
{
if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)
{
pick(ea.getX(), ea.getY());
}
return true;
}
}
return false;
}
std::string DoubleToStringByStringStream(float value)
{
std::ostringstream stream;
stream << value;
return stream.str();
}
void CPickHandler::pick(float fX, float fY)
{
osgUtil::LineSegmentIntersector::Intersections intersections;
if (m_pViewer->computeIntersections(fX, fY, intersections))
{
auto itr = intersections.begin();
bool e = true;
while(itr != intersections.end() && e)
{
if (!itr->nodePath.empty())
{
const osg::NodePath& np = itr->nodePath;
int i = np.size() - 1;
bool entry = true;
while(i >= 0 && entry)
{
osg::ref_ptr<osg::Node> node = dynamic_cast<osg::Node *>(np[i]);
if (NULL != node && node->getName().compare("model_name") == 0)
{
//执行某个事件
}
i -= 1;
}
}
++itr;
}
}
}
二、添加并设置模型名称
下列代码实现了为添加的三维模型设置名称,当设置的模型名称与监听的模型名称一致时,就会触发点击事件。
model->setName("model_name");
三、绑定模型点击事件
下列代码将监听模型点击事件的Handler绑定到mViewer,以实现点击模型时触发某个事件。
mViewer->addEventHandler(new CPickHandler(mViewer));
上一篇: OpenGL光线六 opengl多光源 MultipleLights
下一篇: 双面渲染