6、选中tiles的模型并高亮

news2024/9/24 23:26:09

        本节演示选中3dtiles的模型,选中模型与ceisum基本一致。通过鼠标左键单击模型并将选中的模型进行高亮。使用上一节的示例,再添加鼠标左键单击事件用于选中模型。

1、修改Handler类,添加静态函数onLeftClick,参数与右键单击函数一样。单击时获取鼠标位置然后获取选中的要素再将其高亮。

static void onLeftClick(void *handler, Cesium::ScreenEvent *event) {
    Handler *aggregator = (Handler *) handler;
    glm::dvec2 position = event->position;// 获取鼠标屏幕位置
    //获取选中要素
    Cesium::Feature *feature = aggregator->viewer->_scene->pick(position);
    if (feature == NULL) {
        if (aggregator->feautre != NULL) {
            glm::dvec4 co(1.0, 1.0, 1.0, 1.0);
            aggregator->feautre->color(co);//取消高亮
        }
    } else {
        if (feature->instanceof("Cesium3DTileFeature")) {
            Cesium::Cesium3DTileFeature *tfeautre = (Cesium::Cesium3DTileFeature *) feature;// 强制类型转换
            aggregator->feautre = tfeautre;
            glm::dvec4 co(1.5, 0.0, 0.0, 0.5);
            tfeautre->color(co);//高亮模型
            aggregator->attrname.clear();
            tfeautre->getPropertyNames(&aggregator->attrname);
            std::string id = tfeautre->getProperty("batchId");
            for (int i = 0; i < aggregator->attrname.size(); i++) {
                std::cout << aggregator->attrname[i] << std::endl;//打印属性
            }
        }
    }
}

2、主函数中添加鼠标左键函数

_eventHandler>setInputAction(&Handler::onLeftClick, 

                                                 Cesium::ScreenSpaceEventType::LEFT_CLICK);

3、鼠标右键函数是添加3dtiles模型,并平移到模型位置。

4、运行即可,鼠标右键添加模型后,使用左键单击一个模型即可选中模型并高亮,点击地图其他地方就取消高亮。过程与web端cesium基本一致。

 完整代码

/**
 * Created by IBM on 2021/3/3.
 */
#include <iostream>
#include <Widgets/Viewer/Viewer.h>
#include <Scene/Cesium3DTileset.h>

class Handler {
public:
    Cesium::Viewer *viewer;
    Cesium::Cesium3DTileset *tileset = NULL;
    Cesium::Cesium3DTileFeature *feautre = NULL;
    std::vector<std::string> attrname;

    /**
    * 鼠标右键加载tileset模型
    * @param handler
    * @param event 鼠标指针位置,屏幕坐标,与ceisum中的基本一致
    */
    static void mouseUp(void *handler, Cesium::ScreenEvent *event) {
        Handler *aggregator = (Handler *) handler;
        if (aggregator->tileset == NULL) {
            std::string url = "../data/BatchedColors/tileset.json";
            aggregator->tileset = new Cesium::Cesium3DTileset(url);
            aggregator->viewer->_scene->primitives()->add(aggregator->tileset);
            Cesium::HeadingPitchRoll *orientation = new Cesium::HeadingPitchRoll(0.0, -1.5707963267948966, 0.0);
            //因为已经有glm库使用没有写cesium的Cartesian3,但是Cartesian3的很多方法是写了的,也可以用glm库提供的
            glm::dvec3 initialPosition1 = Cesium::Cartesian3::fromDegrees(-75.60908200128681, 40.04159868719826, 1000);
            aggregator->viewer->_scene->_camera->setView(orientation, initialPosition1);

        }
    }

    static void onLeftClick(void *handler, Cesium::ScreenEvent *event) {
        Handler *aggregator = (Handler *) handler;
        glm::dvec2 position = event->position;// 获取鼠标屏幕位置
        //获取选中要素
        Cesium::Feature *feature = aggregator->viewer->_scene->pick(position);
        if (feature == NULL) {
            if (aggregator->feautre != NULL) {
                glm::dvec4 co(1.0, 1.0, 1.0, 1.0);
                aggregator->feautre->color(co);//取消高亮
            }
        } else {
            if (feature->instanceof("Cesium3DTileFeature")) {
                Cesium::Cesium3DTileFeature *tfeautre = (Cesium::Cesium3DTileFeature *) feature;// 强制类型转换
                aggregator->feautre = tfeautre;
                glm::dvec4 co(1.5, 0.0, 0.0, 0.5);
                tfeautre->color(co);//高亮模型
                aggregator->attrname.clear();
                tfeautre->getPropertyNames(&aggregator->attrname);
                std::string id = tfeautre->getProperty("batchId");
                for (int i = 0; i < aggregator->attrname.size(); i++) {
                    std::cout << aggregator->attrname[i] << std::endl;//打印属性
                }
            }
        }
    }
};

int main(int argc, char *argv[]) {
    Handler *handler = new Handler();
    Cesium::Viewer viewer = Cesium::Viewer(500, 300);
    handler->viewer = &viewer;
    std::string url = "https://dev.virtualearth.net";
    std::string key = "AmXdbd8UeUJtaRSn7yVwyXgQlBBUqliLbHpgn2c76DfuHwAXfRrgS5qwfHU6Rhm8";
    Cesium::BingMapsImageryProvider *imageryProvider1 = new Cesium::BingMapsImageryProvider(url, key);
    viewer.imageryLayers()->addImageryProvider(imageryProvider1);
    //创建事件
    Cesium::ScreenSpaceEventHandler *_eventHandler = new Cesium::ScreenSpaceEventHandler(handler);
    _eventHandler->setInputAction(&Handler::mouseUp, Cesium::ScreenSpaceEventType::RIGHT_CLICK);//设置鼠标点击事件
    _eventHandler->setInputAction(&Handler::onLeftClick, Cesium::ScreenSpaceEventType::LEFT_CLICK);
    viewer.startAnimating(true);//启动opengl循环
    system("pause");
    return 0;
}

返回目录

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

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

相关文章

ubuntu无法定位软件包 tfpd-hpa

安装sudo apt-get install tftp-hpa tftpd-hpa 提示无法定位软件包tfpd-hpa 搜索一下解决方法是需要sudo apt-get update之后才可 结果sudo apt-get update提示索引文件下载失败 按照网上的解决办法更改/etc/apt/sources.list里面的下载源问题依旧&#xff0c;然后又把source…

怎么把word转换成只有一页的长页PDF?

来百度APP畅享高清图片 要将Word文档打印成一长页的PDF格式&#xff0c;我们得先知道word转PDF的工作原理。word转pdf其实就是将word打印出来&#xff0c;就是跟你用物理打印机打印的原理是差不多的&#xff0c;所不同的是&#xff0c;PDF虚拟打印的原理是利用虚拟打印机驱动程…

新手入门深度学习 | 6-2:AlexNet(2012)详解

&#x1f517; 运行环境&#xff1a;python3&#x1f6a9; 作者&#xff1a;K同学啊&#x1f947; 精选专栏&#xff1a;《深度学习100例》&#x1f525; 推荐专栏&#xff1a;《新手入门深度学习》&#x1f4da; 选自专栏&#xff1a;《Matplotlib教程》&#x1f9ff; 优秀专栏…

oracle新建库(表空间)表

文章目录 前言一、sqlplus登录二、表空间1.新建表空间2. 查看表空间3. 查看表空间和对应数据文件4.表空间增加数据文件5.删除单个数据文件&#xff08;只有一个默认的会删除失败&#xff09;6.删除表空间及数据文件(慎用) 三、创建新用户并指定表空间1.去掉前缀2.新建用户&…

C语言是一种通用的、面向过程的编程语言

具有以下特点&#xff1a; 简洁而高效&#xff1a;C语言的语法相对简单&#xff0c;同时提供了丰富的编程结构和功能&#xff0c;使得开发者能够用较少的代码实现复杂的任务。C语言的执行效率高&#xff0c;能够直接操作计算机硬件&#xff0c;提供了底层的控制和优化能力。 可…

时间序列预测 | Matlab基于极限梯度提升树XGBoost时间序列预测,XGBoost时间序列预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测 | Matlab基于极限梯度提升树XGBoost时间序列预测,XGBoost时间序列预测模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码

后端开发常见技术场景

文章目录 1、单点登录这块怎么实现的1.1 概述1.2 JWT解决单点登录1.3 回答要点 2、权限认证是如何实现的2.1 概述2.2 RBAC权限模型2.3 回答要点 3、上传数据的安全性你们怎么控制&#xff1f;3.1 概述3.2 对称加密3.3 非对称加密3.4 回答要点 4、你负责项目的时候遇到了哪些比较…

【Ubuntu学习MySQL——导出数据报错ERROR1290】

将数据表 runoob_tbl 数据导出到 /tmp/runoob.txt 文件中出错&#xff1a; 这是因为mysql有个安全变量限制。可以通过以下语句查看设置的路径&#xff0c;然后将要导入到的文件名称改到此路径下即可。

现场工程师宝典-流式处理的异常现象以及提高吞吐能力的常见优化策略

流式处理区别于按包处理&#xff0c;指的是对处理者而言&#xff0c;面对的是逻辑上无头无尾的数据流。因此&#xff0c;在提取数据流中的包时&#xff0c;就需要遵循其内在的格式&#xff0c;进行头部捕获、提取、校验。然而&#xff0c;如果不考虑TCP等流式数据的异常情况&am…

视频怎么做成二维码?一招轻松制作二维码

怎么把视频做成二维码&#xff1f;现在用二维码来做载体存储视频&#xff0c;这种方法能够有效的减少内存占用&#xff0c;可以将视频储存在云端&#xff0c;他人只需要扫码就能够查看视频。下面来教大家一招关于视频二维码制作&#xff08;音视频二维码制作-一键免费生成音视频…

Kafka传输数据到Spark Streaming通过编写程序java、scala程序实现操作

一、案例说明 现有一电商网站数据文件&#xff0c;名为buyer_favorite1&#xff0c;记录了用户对商品的收藏数据&#xff0c;数据以“\t”键分割&#xff0c;数据内容及数据格式如下&#xff1a; 二、前置准备工作 项目环境说明 Linux Ubuntu 16.04jdk-7u75-linux-x64scal…

(LFPAK56)BUK7Y7R0-40HX 40V、N 通道BUK9Y6R5-40HX表面贴装汽车用MOSFET器件

汽车用MOSFET将低压超级结技术与先进的封装设计相结合&#xff0c;以实现高性能和耐用性。Trench 9 MOSFET系列产品全部符合AEC-Q101标准&#xff0c;且超越了这一国际汽车级标准的要求&#xff0c;在包括温度循环 (TC)、耐高温栅极偏置 (HTGB)、耐高温反向偏置 (HTRB) 和断续工…

DBETR-1X/180G24K4M反馈型比例压力阀放大器

DBETR-1X/30G24K4M&#xff0c;DBETR-1X/315G24K4M&#xff0c;DBETR-1X/80G24K4M&#xff0c;DBETR-1X/180G24K4M&#xff0c;DBETR-1X/230G24K4M&#xff0c;DBETR-1X/350G24K4M比例溢流阀是一种遥控阀。其设计结构为座阀式直动溢流阀&#xff0c;搭配外置式比例放大器。 这…

挑选适合自己的英文原版书

很多人在阅读英文原版小说时感觉十分吃力&#xff0c;有很多生词或长难句。如何寻找适合自己英文阅读水平的书籍呢&#xff1f;下面推荐一种按蓝思值挑选英文原版书的方法。 首先根据自己的受教育程度&#xff0c;选择对应蓝思级别的英文书。如博士可以选择蓝思值为1300L的英文…

图神经网络:(图像分割)三维网格图像分割

文章说明&#xff1a; 1)参考资料&#xff1a;PYG的文档。文档超链。斯坦福大学的机器学习课程。课程超链。(要挂梯子)。博客原文。原文超链。(要挂梯子)。原文理论参考文献。提取码8848。 2)我在百度网盘上传这篇文章的jupyter notebook以及预训练模型。提取码8848. 3)博主水平…

qt信号与槽

信号与槽的概念&#xff1a; 1>信号&#xff1a;信号就是信号函数&#xff0c;可以是组件自身提供&#xff0c;也可以是用户自己定义&#xff0c;自定义时&#xff0c;需要类体的signals权限下进行定义&#xff0c;该函数是一个不完整的函数&#xff0c;只有声明&#xff0…

输入一个链表,输出该链表的倒数第 k 的结点

一、思路 假设 K 是 2&#xff0c;根据下面的图片可以看出&#xff0c;倒数第 K 个结点就是 45。 需要注意的前提是&#xff0c;K 不能是负数也不能是 0 并且也不能超过链表的结点个数&#xff0c;因为要保证 K 是在链表的范围里&#xff0c;才能找到 K&#xff0c;然后返回这…

【网络】TCP三次握手和四次挥手(感性理解)

目录 三次握手 文字描述三次握手过程 为什么是三次握手&#xff1f; 什么是SYN洪水&#xff1f; 连接和半连接队列 一次、两次握手行不行&#xff0c;四/五/六次握手行不行&#xff1f; 三次握手一定会成功吗&#xff1f; 三次握手的过程中可不可以携带数据 TCP中的IS…

模块化规范

常用模块化有两种规范&#xff0c;commonJS和ES6 一&#xff1a;两者区别 二&#xff1a;如何转义&#xff1f; 我们常遇到的使用场景是&#xff0c;在commonJS的模块里需要引入ES6规范的模块。这时就需要把ES6模块转译为commonJS规范的模块&#xff0c;否则报错 转义工具有…

javassist 02 implement interface

创建 interface package com.wsd;public interface AccountDao {int delete(); }利用 javassist 生产一个 类A, Class A implements AccountDao package com.wsd;import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.Modifi…