场景交互与场景漫游-对象选取(8-2)

这篇具有很好参考价值的文章主要介绍了场景交互与场景漫游-对象选取(8-2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        对象选取示例的代码如程序清单8-11所示:

/******************************************* 对象选取示例 *************************************/
// 对象选取事件处理器
class PickHandler :public osgGA::GUIEventHandler
{
public:
	PickHandler() :_mx(0.0f), _my(0.0f)
	{

	}
	~PickHandler()
	{

	}

	// 事件处理函数
	bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa)
	{
		osg::ref_ptr<osgViewer::View> view = dynamic_cast<osgViewer::View*> (&aa);
		if (!view)
		{
			return false;
		}

		switch (ea.getEventType())
		{
			// 鼠标按下
			case(osgGA::GUIEventAdapter::PUSH) :
			{
				// 更新鼠标位置
				_mx = ea.getX();
				_my = ea.getY();
				break;
			}
			case(osgGA::GUIEventAdapter::RELEASE) :
			{
				if (_mx == ea.getX() && _my == ea.getY())
				{
					// 执行对象选取
					pick(view.get(), ea.getX(), ea.getY());
				}
				break;
			}
			default:
				break;
		}

		return false;
	}

	// 对象选取事件处理器
	void pick(osg::ref_ptr<osgViewer::View> view, float x, float y)
	{
		osg::ref_ptr<osg::Node> node = new osg::Node();
		osg::ref_ptr<osg::Group> parent = new osg::Group();

		// 创建一个线段交集检测函数
		osgUtil::LineSegmentIntersector::Intersections intersections;
		if (view->computeIntersections(x, y, intersections))
		{
			osgUtil::LineSegmentIntersector::Intersection intersection = *intersections.begin();
			osg::NodePath &nodePath = intersection.nodePath;

			// 得到选择的物体
			node = (nodePath.size() >= 1) ? nodePath[nodePath.size() - 1] : 0;
			parent = (nodePath.size() >= 2) ? dynamic_cast<osg::Group*>(nodePath[nodePath.size() - 2]) : 0;
		}

		// 用一种高亮显示来显示物体已经被选中
		if (parent.get() && node.get())
		{
			osg::ref_ptr<osgFX::Scribe> parentAsScribe = dynamic_cast<osgFX::Scribe*>(parent.get());
			if (!parentAsScribe)
			{
				// 如果对象选择列,高亮显示
				osg::ref_ptr<osgFX::Scribe> scribe = new osgFX::Scribe();
				scribe->addChild(node.get());
				parent->replaceChild(node.get(), scribe.get());
			}
			else
			{
				// 乳沟没有选择到,则移除高亮显示的对象
				osg::Node::ParentList parentList = parentAsScribe->getParents();
				for (osg::Node::ParentList::iterator itr = parentList.begin(); itr != parentList.end(); ++itr)
				{
					(*itr)->replaceChild(parentAsScribe.get(), node.get());
				}
			}
		}
	}
public:
	// 得到鼠标的位置
	float _mx;
	float _my;
};

/* 对象选取示例 */
void pickObject_8_11(const string &strDataFolder);

/* 对象选取示例 */
void pickObject_8_11(const string &strDataFolder)
{
	// 创建Viewer对象,场景浏览器
	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
	viewer->addEventHandler(new PickHandler());

	osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
	traits->x = 40;
	traits->y = 40;
	traits->width = 600;
	traits->height = 480;
	traits->windowDecoration = true;
	traits->doubleBuffer = true;
	traits->sharedContext = 0;

	osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());

	osg::ref_ptr<osg::Camera> camera = new osg::Camera;
	camera->setGraphicsContext(gc.get());
	camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
	GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
	camera->setDrawBuffer(buffer);
	camera->setReadBuffer(buffer);

	viewer->addSlave(camera.get());

	// 创建场景租节点
	osg::ref_ptr<osg::Group> root = new osg::Group();

	// 创建一个节点,读取牛的模型
	string strDataPath = strDataFolder + "cow.osg";
	osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);

	// 添加到场景
	root->addChild(node);

	// 优化场景数据
	osgUtil::Optimizer optimizer;
	optimizer.optimize(root);
	viewer->setSceneData(root);
	viewer->realize();
	viewer->run();
}

        运行程序,截图如图8-24所示。

场景交互与场景漫游-对象选取(8-2),OSG,交互,c++,图形渲染,3d

图8-24对象选取示例截图文章来源地址https://www.toymoban.com/news/detail-751825.html

到了这里,关于场景交互与场景漫游-对象选取(8-2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OSG交互:选中场景模型并高亮显示

      可以在osg视图中选中指定模型实体,并高亮显示。共分为两种,一种鼠标点选,一种框选。 2.1 功能说明 生成两组对象,一组cow对象可以被选中,另一组robot不能被选中; 点击cow对象被选中高亮,点击robot被选中不高亮; 点击空白处,弹出“select nothing!”提示未选择任何

    2024年02月05日
    浏览(136)
  • OSG三维渲染引擎编程学习之八十八:“第八章:OSG文字” 之 “8.7 osgText3D”

    目录   第八章 OSG文字 8.7 osgText3D 8.7.1 osgText3D介绍 8.7.2 osgText3D实例       适当的文字信息对于显示场景信息是非常重要的。在OSG中,osgText提供了向场景中添加文字的强大功能,由于有第三方插件FreeType的支撑,可完全支持TrueType字体。       TrueType是由AppleComputer公司和Micro

    2024年02月13日
    浏览(49)
  • 【OSG案例详细分析与讲解】之五:【3D交互式动画】

           OpenSceneGraph是一个强大的3D图形引擎,用于创建高质量、交互式的3D图形应用程序。其中一个常见的应用场景是 创建动画效果 。本节文章将介绍如何使用OSG和 osgWidget 库创建一个 交互式的3D动画程序 ,包括创建动画几何体、定义动画更新、具有鼠标事件的颜色标签、具

    2024年02月01日
    浏览(46)
  • 【图形学】30 前向渲染多光照场景代码理解

    来源:《UNITY SHADER入门精要》   我们现在要注意光源的 5 个属性: 位置、方向、颜色、强度、衰减 。   在理解代码之前,我们依然需要熟悉我们的理论,主要我们要设置两个 Pass,注意它们的不同的特性,和要做的事情。   注意,据书中所说,注意两个 Pass 中的 #

    2023年04月20日
    浏览(37)
  • 【Unity 3D绳索】基于图形渲染的3D绳索模拟

            前一段被要求模拟一根绳索,因为种种原因,笔者最后决定通过数学函数和Mesh模拟出一根绳索,具体的思路是首先利用Verlet函数模拟绳索的刚性,之后利用Mesh渲染圆柱体将绳索模拟出来。                  首先,利用Verlet进行逻辑上的绳索创建,具体思路参考

    2024年04月29日
    浏览(37)
  • 高级 Matplotlib:3D 图形和交互性

    Matplotlib 是 Python 中最重要的数据可视化库之一。在之前的文章中,我们讨论了如何使用基础和中级功能来创建各种图形。在本文中,我们将深入研究 Matplotlib 的高级特性,特别是如何创建 3D 图形和交互式图形。 Matplotlib 提供了一组用于创建 3D 图形的 API,如 3D 散点图、3D 折

    2024年02月15日
    浏览(44)
  • 3d效果图的应用场景和3d渲染的发展前景

    3D效果图一直都是视觉行业非常重要的一部分,它在不同领域都有广泛应用,通过效果图,设计师能够准确展示设计方案,方便沟通。本文将深入分析3D效果图在不同场景中的应用和未来发展趋势。 1、建筑领域 在建筑领域中,3D效果图被用于房屋、商场和酒店等的设计,通过

    2024年01月23日
    浏览(64)
  • 同屏实时渲染百万级独立的3D可渲染对象

    大规模渲染在游戏、家装、或者其他生产制造相关的环境下有直接的刚需,能独立渲染的3D对象越多,越容易实现复杂的场景需求。 下图是WebGPU版200多万(2 * 1024 * 1024)个可渲染的3D对象,的实时渲染情况截图。

    2024年02月08日
    浏览(50)
  • 计算机视觉与图形学-神经渲染专题-pi-GAN and CIPS-3D

    《pi-GAN: Periodic Implicit Generative Adversarial Networks for 3D-Aware Image Synthesis 》 摘要 我们见证了3D感知图像合成的快速进展,利用了生成视觉模型和神经渲染的最新进展。然而,现有的方法在两方面存在不足:首先,它们可能缺乏底层的3D表示,或者依赖于视图不一致的渲染,从而合

    2024年02月14日
    浏览(64)
  • Unity3D学习记录01:URP渲染管线以及3D游戏场景设置

    以下内容所使用的版本均为Unity2022.3 先在 Window-Package Manager-Unity Registry 里面搜索添加Universal RP   Unity中,创建渲染管线的方式为Asset文件夹下右键 Create-Readering-URP Asset(with Universal Asset) 会创建以下两个Pipeline:  接着在图中的设置里添加这两个渲染管线(Project Setting在Edit窗口下

    2024年02月08日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包