8.OsgEarth 鼠标位置及LabelControl中文显示

news2024/11/24 7:34:22

愿你出走半生,归来仍是少年!

        在人机交互中,最常用的就是鼠标。获取鼠标在三维场景中的空间位置是保证交互结果正确的保障。

1.LabelControl

        文本标签控件,可方便的添加在场景顶层。

        设置编码及字体可正确的显示出中文。

setFont(osgText::readFontFile("Fonts/simhei.ttf"));

setEncoding(osgText::String::ENCODING_UTF8); 


	bottomStateLabel = new osgEarth::Util::Controls::LabelControl("底部状态栏", osg::Vec4f(1, 1, 1, 1), 14);
	 
	bottomStateLabel->setHorizAlign(osgEarth::Util::Controls::Control::ALIGN_CENTER);

	bottomStateLabel->setVertAlign(osgEarth::Util::Controls::Control::ALIGN_BOTTOM);

	bottomStateLabel->setBackColor(0, 0, 0, 0.8);

	 

	bottomStateLabel->setFont(osgText::readFontFile("Fonts/simhei.ttf"));

 

	bottomStateLabel->setEncoding(osgText::String::ENCODING_UTF8);

	bottomStateLabel->setPadding(5);

	 
	   
	ref_ptr<osgEarth::Util::Controls::ControlCanvas> canvas = osgEarth::Util::Controls::ControlCanvas::get(this);
	 

	canvas->addControl(bottomStateLabel);

2.MousePositionEvenHandler

        通过继承osgGA::GUIEventHandler进行实现,仅用于鼠标移动时进行鼠标的空间位置解算。分别解算了鼠标所在的地形位置以及空间位置。

#include "MousePositionEvenHandler.h"

Cv::EventHandlers::MousePositionEvenHandler::MousePositionEvenHandler(MapNode* node, osgEarth::Util::Controls::LabelControl* control)
{

	this->mapNode = node;

	this->label = control;
}

bool Cv::EventHandlers::MousePositionEvenHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
	osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);

	if (viewer)
	{
		std::string positionStr;

		//鼠标移动
		if (ea.getEventType()==ea.MOVE)
		{
  
			osg::Vec3d world;
			 
			if (mapNode->getTerrain()->getWorldCoordsUnderMouse(aa.asView(), ea.getX(), ea.getY(), world))
			{
				GeoPoint pt;

				pt.fromWorld(mapNode->getMapSRS(), world);
				  

				positionStr.append("  经度:"); 
				positionStr.append(boost::lexical_cast<std::string>(pt.x()));
				positionStr.append("  纬度:"); 
				positionStr.append(boost::lexical_cast<std::string>(pt.y()));
				positionStr.append("  地形高程:");
				positionStr.append(boost::lexical_cast<std::string>(pt.z())); 
			}
			  


			osgUtil::LineSegmentIntersector::Intersections hits;

			if (viewer->computeIntersections(ea.getX(),ea.getY(),hits))
			{
				auto first = hits.begin()->getWorldIntersectPoint();

				GeoPoint pt;

				pt.fromWorld(mapNode->getMapSRS(), first);

				positionStr.append("  交点经度:");
				positionStr.append(boost::lexical_cast<std::string>(pt.x()));
				positionStr.append("  交点纬度:");
				positionStr.append(boost::lexical_cast<std::string>(pt.y()));
				positionStr.append("  交点高程:");
				positionStr.append(boost::lexical_cast<std::string>(pt.z()));
			}

			this->label->setText(positionStr);
		}
		 
		 

	}

	return false;   
}

3.坐标获取原理

        一个屏幕坐标通过两种方式获取到的平面位置相差不大,主要集中在高程上

3.1.地形坐标

        通过mapNode->getTerrain()->getWorldCoordsUnderMouse获取屏幕位置在地形中的世界位置,然后转换为空间位置。当场景中有倾斜等地物时,无法捕捉到在倾斜表面作为鼠标的位置。

3.2.空间位置

        通过viewer->computeIntersections计算交点位置,当场景中有倾斜等地物时,可捕捉到在倾斜表面的交点作为鼠标的位置。

4.效果

鼠标移动时的坐标

         下图为地面无地物情况的情况下,两种方式获取的坐标、高程相差很小。

无地物,只有地形

        下图为地面存在地物(模型)的情况下。两种方式获取的坐标相差很小,但是高程相差很大。一种只是获取到地形高度,一种获取到了模型的顶面高度。 

有地物

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1163222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android studio app红叉无法编译

1.起源 今天前台小姐姐穿了一个白色的超短裙,和小姐姐聊了聊人生梦想,聊生活趣事,回到工位你马....报了一个这错误,无法运行了,明天就要打包测试了,顿时菊花一紧,急了一头汗,这你马咋回事,看了旁边的产品肥仔,迷着小眼露出了银建的笑容.开始排雷.... 意思就是说gradle初始化失…

如何使用 NFTScan NFT API 在 BNB Chain 网络上开发 Web3 应用

BNB Chain 是一条以太坊虚拟机兼容的区块链&#xff0c;是加密资产行业顶尖项目的测试和前沿探索。通过引入权益权威证明&#xff08;PoSA&#xff09;共识机制&#xff0c;BNB Chain 创建了验证一个允许节点、代币持有者、开发者和用户都能够从区块链中获益的生态系统&#xf…

Sentinel 哨兵数据 更新下载地址 2023年11月

1. 欧空局官方下载 2023年11月开始&#xff0c;原来欧空局的下载地址和应用有了变化&#xff0c;现在迁移到以下新地址下载&#xff1a; https://dataspace.copernicus.eu/ 我这边测试需要重新注册用户才能进行登录和使用&#xff0c;界面使用和之前差不多&#xff0c;具体操作…

如何在校园跑腿系统小程序中构建稳健的订单处理与分配系统?

1. 数据库设计 首先&#xff0c;设计订单数据结构。使用数据库&#xff08;例如MySQL、MongoDB等&#xff09;&#xff0c;创建订单表以存储订单相关信息&#xff0c;包括订单ID、用户信息、交付地址、订单状态等。 CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMAR…

掌握口才与演讲技巧,让你职场中脱颖而出

在职场竞争日趋激烈的今天&#xff0c;口才和演讲能力已经成为一个人成功的重要标志之一。掌握了优秀的口才与演讲技巧&#xff0c;不仅可以帮助你在工作中更好地表达自己和传达信息&#xff0c;同时也可以让你在同事和上级心中留下深刻印象&#xff0c;从而在职场中脱颖而出&a…

突发,50亿美元芯片订单被取消? | 百能云芯

11月2日消息&#xff0c;据华尔街日报&#xff0c;美国新推出的出口管制规定可能迫使AI芯片巨头英伟达取消明年数十亿美元的对华先进制程芯片订单&#xff0c;此举可能令中国科技公司无法获得关键的AI资源。 据知情人士透露&#xff0c;此前&#xff0c;英伟达今年对中国的先进…

.NET桌面程序如何设置任务栏图标右键菜单中的名称

右键任务栏中应用程序图标时会显示程序名称&#xff0c;例如&#xff1a; 这里显示的并不是程序文件名DingTalk&#xff0c;而是文件属性中详细信息选显卡下的“文件说明”。 在.NET桌面程序中&#xff0c;是通过修改程序集名称&#xff08;AssemblyTitle&#xff09;来设置…

2024年天津医科大学临床医学院专升本招生对口专业限制专科目录

2024年天津医科大学临床医学院高职升本科招生对口专业目录 药学&#xff1a; 药学 护理&#xff1a; 护理、助产 公共事业管理&#xff1a; 医药卫生大类&#xff1a;护理、助产、临床医学、口腔医学、中医学、中医骨伤、针灸推拿、蒙医学、藏医学、维医学、傣医学、哈医学…

sso简单记录

首先我们再次复习一下&#xff0c;多个系统之间为什么无法同步登录状态&#xff1f; 前端的Token无法在多个系统下共享。后端的Session无法在多个系统间共享。 关于第二点&#xff0c;我们已在 "SSO模式一" 章节中阐述&#xff0c;使用 Alone独立Redis插件 做到权限…

2023-11-02 LeetCode每日一题(环和杆)

2023-11-02每日一题 一、题目编号 2103. 环和杆二、题目链接 点击跳转到题目位置 三、题目描述 总计有 n 个环&#xff0c;环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings &#xff0c;表示这 n 个环在…

Linux下使用vscode编写Python项目

我此处是使用VScode远程连接的服务器&#xff0c;具体方法可看如下&#xff1a; 1、vscode中安装Python插件 按上面步骤安装好Python插件后&#xff0c;重启vscode&#xff1b; 2、选择Python解释器 创建Python项目结构&#xff1a; 按下F1&#xff0c;打开vscode命令栏&am…

智安网络|数据库设计与规范:构建高效可靠的数据存储系统

在信息化时代&#xff0c;数据库设计与规范是构建高效可靠的数据存储系统的关键。一个合理的数据库设计可以提高数据的存储效率、保证数据的一致性和完整性&#xff0c;提供高效的数据查询和处理能力。 一、数据库设计的基本原则 数据库范式&#xff1a;数据库设计应符合范式的…

nmap 使用方法详细介绍

nmap的使用 前言nmap 作用Nmap使用教程 nmap的基本输入&#xff1a;扫描参数&#xff1a;端口扫描&#xff1a;端口状态扫描&#xff1a;UDP扫描协议扫描 总结 Nmap的基础知识Nmap的扫描技术 Nmap的OS检测&#xff08;O&#xff09;Nmap的操作系统指纹识别技术&#xff1a; 前…

管理类联考——英语二——考点+记忆篇——小作文

文章目录 考点整体写作结构法记忆宫殿法第一句绘图记忆法 局部第一段第二段第三段 本篇思路&#xff1a;根据各方的资料&#xff0c;比如名师的资料&#xff0c;按大纲或者其他方式&#xff0c;收集/汇总考点&#xff0c;即需记忆点&#xff0c;在通过整体的记忆法&#xff0c;…

PHP 字符串常用函数

PHP 字符串常用函数 字符串属性strlen 筛选查找strposstrrposstrstrstrrchr查找方法之间区别总结 拼接&#xff0c;拆分字符串explodestrtokimplodesubstr 替换字符串str_replace 格式化字符串trimltrimrtrim 字符串属性 strlen 获取指定字符串长度 语法: strlen (字符串变…

Transformer的Q、K、V和Mutil-Head Self-Attention(超详细解读)

目录 一.什么是Q、K、V 二.Mutil-Head Self-Attention Transformer大行其道&#xff0c;在众多领域取得了不可忽视的成就。如今大火的语言大模型LLM也都是基于Transformer&#xff0c;但是Transformer中的Q、K、V和多头注意力到底是什么呢&#xff1f;这里简单做个学习记录&a…

实景三维信创产品与智能硬件重磅发布 | 大势智慧2023秋季新品发布会圆满落幕

10月27日&#xff0c;大势智慧2023秋季新品发布会取得圆满成功。本次发布会以“全国产、真安全”为主题&#xff0c;重磅发布了一系列国产化软硬件产品和新型智能装备&#xff0c;用于满足实景三维全流程的安全生产和应用需求。大会同步在官方微信视频号、bilibili直播间进行线…

如何记录每天的工作日程?电脑手机通用的日程管理软件

在工作时间有限&#xff0c;但工作任务愈加繁多的现在职场中&#xff0c;要求每一个职场人士做好高效日程管理。通过高效管理日程&#xff0c;我们可以更好地组织和安排任务&#xff0c;合理分配时间和优先级&#xff0c;这有助于我们更专注地进行工作&#xff0c;减少时间的浪…

分析报告有样板了-奥威BI数据可视化报表模板

述职报告、月度数据分析报告、季度数据分析报告、区域数据分析报告……人在职场&#xff0c;数据分析报告少不了。那么&#xff0c;怎么才能在极短的时间内做出一张既好看又突出重点、分析逻辑在线的数据可视化分析报表&#xff1f;奥威BI软件的建议是采用BI数据可视化报表模板…

批量调整图片尺寸方案(比例不变)

最近又有一个问题,需要把一堆图片调整成统一的尺寸大小(例如100*100像素)。 网上或者很多工具都是直接把图片尺寸调整到对应尺寸。 这就出现了一个问题—— 整个图片会被压缩拉伸,图片里的物体/人等都变形了。 原图(200*270): 直接调整尺寸后(200*200): 我们需…