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

相关文章

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

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

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo