osg鼠标点选类

OSG学习笔记13Pick点选物体 OSG鼠标单击点选事件的实现。单击牛模型后模型上的白线消失。 阅读详情

 

添加了注释便于理解


class mousehandle:public osgGA::GUIEventHandler
{
public:
	mousehandle(){}
	~mousehandle(){}
	void pick(osgViewer::View* view,float x,float y);
	bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);//ea,鼠标点击位置   //aa 控制显示参数,是Viewer的祖父类,由它可以得到viewer
protected:
	float _mx;
	float _my;
};
bool mousehandle::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
{
	osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
	if (!view) return false;

	switch(ea.getEventType())
	{
		//鼠标按下
	case(osgGA::GUIEventAdapter::PUSH):
		{
			if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)//鼠标左键
			{
				//更新鼠标位置
				_mx = ea.getX();
				_my = ea.getY();
				//pick(view, ea.getX(), ea.getY());
			}
			break;
		}
		//拖动鼠标
	case(osgGA::GUIEventAdapter::DRAG):
		//释放/抬起鼠标
	case(osgGA::GUIEventAdapter::RELEASE):
		{
			if (_mx==ea.getX() && _my==ea.getY())//判断当前抬起鼠标点位置与鼠标点击位置是否相同,即是否存在拖动鼠标
			{   
				pick(view, ea.getX(), ea.getY());//执行对象选取
			}
			break;
		}
	default:
		break;
	}
	return false;
}
//实现鼠标点选
void mousehandle::pick(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();
	node=nullptr;
	parent=nullptr;
	//创建一个线段交集检测//intersections 存放与射线相交的节点
	osgUtil::LineSegmentIntersector::Intersections intersections;
    //computeIntersections()函数判断鼠标与场景中对象交点
	if (view->computeIntersections(x, y, intersections))
	{
		osgUtil::LineSegmentIntersector::Intersections::iterator intersection=intersections.begin();  //获取第一个交点
		const osg::NodePath& nodePath = intersection->nodePath;//获取第一个交点的path	
		//得到选择的物体
		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学习笔记16 - 对点选物体平移(鼠标点选物体)(物体随鼠标移动)(屏幕坐标转世界坐标) 之前的一篇博文是有一篇对点选物体进行平移、缩放旋转。那一篇是很简单的调用了OSG中定义的一些dragger,但这些dragger都有坐标轴或者tapbox等在模型上,与我最近要做的事情的需求不同。网上也找了好久,最终还是自己一点一点,参考老师之前写的代码,然后在亲爱的童童师兄的帮助下,实现了这么一个小小的功能。虽然代码写的乱糟糟的。 这里就简单记录一下整个思路吧。 1、构造一个事件处理器,也就 阅读详情

相关推荐

OSG学习笔记11 物体控制—对点选物体进行平移、缩放、旋转

使用鼠标点选当前场景中的物体,然后旋转、平移、缩放。 使用了两个自带的Dragger, TrackballDragger实现旋转,选中哪一个环就使物体沿哪个环渲染 TabBoxDragger:盒式拖曳器,可在六个平面上实现缩放,平移 物体操作类osgManipulator的工作方式:操作Dragger,改变Module

吃货敲代码 5224

osg实现鼠标框选

有时需要在屏幕通过按住键盘上的某个键如Ctrl键且按住鼠标左键,拖出一个矩形,实现框选三维物体,如下效果:现在的问题是: 对第1节中提到的第1个问题,默认情况下osgViewer::Viewer事件处理器在鼠标左键按下并拖动时,整个场景会随鼠标一起转动。为了不让转动,可以通过改写osgViewer::Viewer的 osgGA::GUIEventHandler事件处理器,重载如下方法: 当按住键盘上的某个键如Ctrl键且按住鼠标左键,让该函数返回true,这样后续的流程就不会处理鼠标拖动事

danshiming的博客 2538

OSG实现鼠标拖拽物体

首先要具备射线拾取的基本知识和向量运算的基础知识,屏幕点转换为三维点怎么取转换。 现在先看一下屏幕的点如何转换为三维点,代码如下: osg::Vec3 screenToWorld(osgViewer::Viewer* viewer,double dx,double dy) { osg::Camera *camera = viewer->getCamera(); osg::Matrix viewMat = camera->getViewMatrix(); //获取当前视图矩阵 osg::Ma

Jeson_DeveloperWX 3547

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

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

欧特GO 1927

QtQuick中集成OSG渲染

从目前网上介绍OSG与Qml集成有两种方式: 在[QtQuick2OSGItem](https://bitbucket.org/leon_manukyan/qtquick2osgitem/src/master/sampleapp/)通过继承抽象类__QQuickFramebufferObject::Renderer__来重写渲染接口,在__QQuickFramebufferObject__渲染成...

hai7song的专栏 3150

OSG拾取点、线和面 -- 实现点云拾取

在计算机图形学中,点云是由大量的离散点组成的集合,常用于三维重建、模型生成等领域。在源代码中,我们首先创建了一个包含点云的场景,并将其渲染到视图中。然后,我们实现了一个拾取事件处理器,在用户点击时进行拾取操作,并得到被点击位置的坐标。点云拾取是指在三维场景中,根据用户鼠标点击位置确定其所在的点云位置,并进行相应的操作。综上所述,本文介绍了如何在OSG中实现对点云的拾取功能,并提供了相关的源代码。通过这些步骤,开发者可以方便地在三维场景中与点云进行交互,并进行相应的操作。希望本文能对您有所帮助!

QfcaLinux的博客 1183

OSG鼠标点选模型

OSG鼠标点选模型,选中的模型消失: 1.模型路径 1.创建两个模型,并且把这两个模型放到Group中,并且注册鼠标点击事件处理 void mousePick2() { osg::ref_ptr&lt;osgViewer::Viewer&gt; viewer = new osgViewer::Viewer(); viewer-&gt;addEventHandler(new osgViewer...

wb175208的专栏 3682

OSG开发笔记(十八):OSG鼠标拾取pick、拽托球体以及多光源

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.youkuaiyun.com/qq21497936 本文章博客地址:https://blog.youkuaiyun.com/qq21497936/article/details/97109615 目录 前言 OSG拾取动作概念:pick 鼠标拖动球体旋转的实现原理 光照亮度 代码 初始化模型代码 事件管理器代码 入坑 入坑一...

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

OSG获取鼠标点选事件的位置

OSG点选操作的思路是从osgGA::GUIEventHandler继承,并重新实现虚函数virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);。获取到点选信息后,此处我们不进行处理,而是单一的传出去,由外部需要此点选信息的地方进行处理。对于传出信息,我选择了Qt的信号槽操作,因而,在继承

kestiny的专栏 1万+

简单的OSG高亮选择

vs2008 调试通过,简单的OSG高亮选择代码

ModelViewer:OSG读取模型的顶点、法向量、纹理坐标并用随机颜色绘制出来

ModelViewer OSG读取模型的顶点、法向量、纹理坐标并用随机颜色绘制出来 简介 此程序是在使用OSG的过程中,需要获取模型的顶点、法向、纹理坐标等信息,然后使用不同的颜色绘制出来,以区别不同模型。为了知道模型的名称,在模型的周围增加了模型的名称显示。效果如下: 有关OSG中,怎么读取模型的坐标、纹理、法向量等信息,在我的博客中有详细的介绍,有兴趣的可以看看:

OSG 之学习四:OSG 鼠标键盘交互

文章目录说明1. 交互过程2. 交互详解3. pick 说明 OSG 入门看的,大佬绕道 示例来源于《OSG程序设计教程》 没有此电子书的小伙伴们,我已上传至优快云 1. 交互过程 2. 交互详解 函数功能:鼠标右键单击时牛和飞机都隐藏,鼠标左键双击时牛和飞机都显示,按键盘上面的 LEFT(方向左键) 键,显示牛, 按键盘上面的 RIGHT(方向右键) 键显示飞机。其中显示与隐藏结点我们...

Neverland_LY‘s Domain 4460

R语言dlnm包避坑指南:手把手教你配置交叉基矩阵(附温度分层与滞后多项式设置)

本文详细介绍了R语言dlnm包在配置交叉基矩阵时的实用技巧与避坑指南,特别针对温度分层与滞后多项式设置提供了具体参数配置建议。通过解析`crossbasis()`函数的核心参数、温度分析的分层策略以及不同基函数的适用场景,帮助研究者高效构建分布滞后非线性模型,避免常见错误并优化模型性能。

weixin_34094282的博客 402

OSG鼠标点选模型二

上一篇文章中说了,如果使用鼠标点选隐藏模型。当时如果是同一个模型经过缩放或者平移后再次显示出来,也就是就在了一份模型但是通过平移显示出两个模型,点击其中一个模型时候回怎么样?是隐藏当前模型还是隐藏所有同类模型? 创建一个这样的场景: void mousePick2() { osg::ref_ptr&amp;lt;osgViewer::Viewer&amp;gt; viewer = new osgViewer:...

wb175208的专栏 1319

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡 一、板卡概述 基于XC7Z100+ADRV9009的双收双发无线电射频板卡是基于XilinxZYNQFPGA和ADI的无线收发芯片ADRV9009开发的专用功能板卡,用于5G小基站,无线图传,数据收发...

9371

pagerank算法详解

目录一、pagerank定义两个重要假设二、pagerank算法公式定义计算演示矩阵化计算三、存在的两个问题问题1.Dead Ends问题2.Spider Traps 一、pagerank定义 入链数:指向该节点的链接数 出链数:由该节点指出的链接数 以上图为例:A的入链数为1,出链数为3,所以将由A指向其他节点的边权重设置为1/3,表示A访问B、C、D节点的概率均为1/3 两个重要假设 数量假设:在Web图模型中,如果一个页面节点接收到的其他网页指向的入链数量越多,那么这个页面越重要。 质量假设:指向

gary101818的博客 4万+

osg点选 框选对象

//点选 event事件虚函数调用的点选 void PointSelect( osgViewer::Viewer* viewer, const osgGA::GUIEventAdapter& ea ) { osgGroupPtr root = dynamic_cast<osg::Group*>(viewer->getSceneData()); if (r...

snowwind_51的博客 1279

串并装换器的设计及仿真结果

串/并转换是高速数据流处理的重要技巧之一。串/并转换的实现方法多种多样,根据数据的的顺序和数量要求,可以选用寄存器,双扣RAM,SRAM,FIFO,等实现。对于 数量比较小的设计可以采用移位寄存器完成串/并转换。       在工程中,如何体现串/并转换的设计思想呢? 怎样才能提高系统的处理速度呢 ?       一个简单的串/并转换框架如下图所示,串行输入的数据通过FPGA内部的 n 个移

stubben_bear的专栏 2273

OSG物体随鼠标移动(即点移动)

物体随鼠标移动:代码如下:#include#include#include#include#include#include#include#include#include#pragmacomment( lib, "osgd.lib"); //此库用于Release版本.在Debug版本下的库名都加d,如"osgd.lib"#pragmacomment( lib, "osgDB

tmljs1988的专栏 1万+

基于DO-178C/331的飞控软件研发环境的研究

本研究提出了一套基于DO-178C/331标准的飞控系统软件开发和验证框架。通过优化模型库的设计、代码生成配置和测试验证流程,显著提升了飞控系统软件的开发效率和安全性。未来的研究可以进一步扩展模型库的功能,以适应更复杂的飞控系统需求。

qq_41854911的博客 561

【Unity 实用工具篇】✨| 受击插件Feel 详细教程,开发游戏时更好的操控 游戏打击感

在一个游戏中,游戏手感对于游戏的整体游玩体验是非常重要的,而游戏手感中有一个很重要的点:打击感 那本篇文章就来讲一下打击感中的受击反馈部分。 在游戏中经常会用到攻击敌人,敌人扣血,执行某些受击功能的执行,尤其是对于有战斗场景的游戏来说,这就是标准的受击反馈。 所以引出本篇文章的主角:受击插件 Feel 的使用,2D和3D游戏都可以使用。

努力前行,总会成为自己心中的那道光 3万+

osg项目经验1<MFC+OSG中模型点选效果>

  点选主要是重载osg的GUIEventHandler, 1 class CPickHandler : public osgGA::GUIEventHandler{ //自定义回调函数名:CPickHandler 2 osgViewer::Viewer * mViewer; //在这里定义要在重载函数里使用的变量 3 osg::Group * m...

ajacn40402的专栏 382

LeRobot 入门教程(十四)Meta-World 机器人多任务与元强化学习操作仿真基准平台

Meta-World是一个开源机器人操作模拟基准平台,专注于多任务与元强化学习研究。该平台提供50项多样化任务(MT50套件),采用标准化评估协议测试算法泛化能力。LeRobot平台支持Meta-World任务评估,提供预处理数据集和训练工具。用户可通过命令行快速训练SmolVLA策略,并评估模型在简单、中等、困难等不同难度任务上的表现。文章还提供了兼容性问题和实用技巧建议,如使用完整MT50任务集测试泛化能力、采用one-hot任务条件化等。这些资源为研究人员开展机器人多任务学习提供了标准化实验环境。

2506_90492529的博客 1021

OSG鼠标选择求交

OSG鼠标选择求交 ////求交方法一:(用WINDOW坐标值,在相机下求交)            //osg::ref_ptr picker = new osgUtil::LineSegmentIntersector(            //  osgUtil::Intersector::WINDOW, ea.getX(), ea.getY());            //osg

tmljs1988的专栏 1万+

使用Clumsy和Process Explorer定位软件高CPU占用问题

使用弱网模拟工具Clumsy和进程查看工具Process Explorer定位软件高CPU占用问题。

dvlinker的技术专栏 5709

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

osg demo12 响应鼠标事件

//demo12//功能:响应鼠标事件//细节:鼠标右键单击时牛和飞机都隐藏,鼠标左键双击时牛和飞机都显示,按键盘上的LEFT键,显示牛,// 按 键盘上的RIGHT键显示飞机。其中显示与隐藏结点我们使用的是setNodeMask(bool).#include #include #include class UseEventHandler:public osgGA::GUIEventHandler

analyst_yuci 3387

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: osg绘制圆角矩形气泡
下一篇: osg各种枚举
l_null
博客等级 码龄9年 2粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值