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

相关文章

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Python实现中文文本处理与分析程序的示例详解

《Python实现中文文本处理与分析程序的示例详解》在当今信息爆炸的时代,文本数据的处理与分析成为了数据科学领域的重要课题,本文将使用Python开发一款基于Python的中文文本处理与分析程序,希望... 目录一、程序概述二、主要功能解析2.1 文件操作2.2 基础分析2.3 高级分析2.4 可视化2.5

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

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的路径