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

相关文章

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

idea中project的显示问题及解决

《idea中project的显示问题及解决》:本文主要介绍idea中project的显示问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录idea中project的显示问题清除配置重China编程新生成配置总结idea中project的显示问题新建空的pr

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

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下