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

2023-11-02 19:36

本文主要是介绍8.OsgEarth 鼠标位置及LabelControl中文显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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.效果

鼠标移动时的坐标

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

无地物,只有地形

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

有地物

 

 

这篇关于8.OsgEarth 鼠标位置及LabelControl中文显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/332829

相关文章

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Java下载文件中文文件名乱码的解决方案(文件名包含很多%)

《Java下载文件中文文件名乱码的解决方案(文件名包含很多%)》Java下载文件时,文件名中文乱码问题通常是由于编码不正确导致的,使用`URLEncoder.encode(filepath,UTF-8... 目录Java下载文件中文文件名乱码问题一般情况下,大家都是这样为了解决这个问题最终解决总结Java下

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取