欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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));

 

相关标签: OSG