五、3d场景的卡片展示的创建

        在我们3d的开发中,对某一些建筑和物体进行解释说明是非常常见的现象,那么就不得不说卡片的展示了,卡片展示很友好的说明了当前物体的状态,一目了然,下面就是效果图。

它主要有两个方法来实现,大量的图片建议使用canvas来实现,少量的可以使用标签实现。

1.canvas

思路:

        1将需要展示的内容画到canvas上。

        2将canvas生成为图片材质,创建一个Mesh对象放入场景中。

实现代码

 gltf.scene.traverse((child) => {if (child.type == 'Mesh') {child.toggle = (child) => {this.toppip(120,60,child.position.x,child.rotation.y + 160,child.position.z,child.name,);};}});
// 提示框的创建toppip (w, h, px, py, pz, text) {//用canvas生成图片let canvas = document.createElement('canvas');let ctx = canvas.getContext('2d');var devicePixelRatio = window.devicePixelRatio || 1;var backingStoreRatio = ctx.webkitBackingStorePixelRatio || 1;var dpr = devicePixelRatio / backingStoreRatio;canvas.width = Math.round(w * dpr);canvas.height = Math.round(h * dpr);canvas.style.width = w + 'px';canvas.style.height = h + 'px';ctx.scale(dpr, dpr);//制作矩形ctx.fillStyle = 'gray';ctx.fillRect(0, 0, w, h);//设置文字ctx.fillStyle = 'blue';ctx.font = '6px "楷体"';// ctx.fillText('这个平面将被贴在正方体前表面', 0, 20)let textWord = text;//文字换行let len = parseInt(textWord.length / 10);for (let i = 0; i < len + 1; i++) {let space = 10;if (i === len) {space = textWord.length - len * 10;}let word = textWord.substr(i * 10, space);ctx.fillText(word, 2, 4 * (i + 1));}
 //生成图片let url = canvas.toDataURL('image/png');let texture = new THREE.TextureLoader().load(url);//将图片构建到纹理中let geometry1 = new THREE.PlaneGeometry(w, h);let material1 = new THREE.MeshBasicMaterial({map: texture,side: THREE.DoubleSide,opacity: 1,transparent: true,});let rect = new THREE.Mesh(geometry1, material1);rect.rotation.y = Math.PI;rect.position.set(px, py, pz);this.scene.add(rect);return rect;}

2.div标签法

思路:1.在主页面创建一个空的DIV

  1. 将需要加入的标签加入,并创建CSS3DObject对象,
  2. 将css3dObject加入Scene

点击增加标签,判断是否已经存在,存在就不增加了

eventHub.on('spriteClick', (ele) => {var isCreateTag = falsefloor2Tags.forEach(p => {if (p.name == (ele.event.name + ele.i)) {isCreateTag = true}})if (!isCreateTag) {const css3dObject = createTag(ele.event, ele.i);css3dObject.visible = true;floor2Tags.push(css3dObject)scene.add(css3dObject)}})

创建标签

//添加标签和视频
function createTag (object3d, index) {// 创建各个区域的元素const element = document.createElement("div");var perNum = index * 10 + 10var percent = Math.ceil((perNum / 100) * 100);var deg1 = ((45 + 135) * percent) / 50 - 135;var deg2 = ((45 + 135) * (percent - 50)) / 50 - 135;element.className = "elementTag";element.innerHTML = `<div class="elementContent"><h3>实时监控${object3d.name + index}</h3><div class="elementProgress"><div class="circle_process"><div class="wrapper right"><div class="circle rightcircle" style="transform:rotate(${percent < 50 ? deg1 : 45}deg)"></div></div><div class="wrapper left"><div class="circle leftcircle" style="transform:rotate(${percent < 50 ? 'none' : deg2}deg)"></div></div><div class="wrapper_num"><p>${percent}</p><p>mg/m³</p></div></div><div class="elementPm"><p>0.094<span>TSP</span></p><p>0.044<span>PM2.5</span></p><p>0.085<span>PM10</span></p></div></div></div>`;const objectCSS3D = new CSS3DObject(element);//加载视频objectCSS3D.name = object3d.name + indexobjectCSS3D.position.set(object3d.position.x / 5 + 20,100,object3d.position.y / 5 - 10,);objectCSS3D.scale.set(0.2, 0.2, 0.2);return objectCSS3D;}

以上就是两种创建标签的方法,如果还有更好的方法可能我还没有发现,如果有兴趣交流可以私信或者留言,看到会第一时间回复,下期我们说说如何让这个卡片一直面向观察摄像头。

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

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

相关文章

maven找不到jar包

配置settings.xml文件之后出现报错找不到jar包 先改maven设置: 然后在重新清理构建项目: 可以通过执行以下命令清理本地 Maven 仓库 mvn dependency:purge-local-repository

渗透测试之打点

请遵守中华人民共和国网络安全法 打点的目的是获取一个服务器的控制权限 1. 企业架构收集 &#xff08;1&#xff09;官网 &#xff08;2&#xff09;网站或下属的子网站&#xff0c;依次往下 天眼查 企查查 2. ICP 备案查询 ICP/IP地址/域名信息备案管理系统 使用网站…

京东大型API网关实践之路

概述 1、背景 京东作为电商平台&#xff0c;近几年用户、业务持续增长&#xff0c;访问量持续上升&#xff0c;随着这些业务的发展&#xff0c;API网关应运而生。 API网关&#xff0c;就是为了解放客户端与服务端而存在的。对于客户端&#xff0c;使开放给客户端的接口标准统…

26342-2010 国际运尸 木质棺柩.

声明 本文是学习GB-T 26342-2010 国际运尸 木质棺柩. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了国际运尸木质棺柩的分类、规格、技术要求、检验方法、包装、运输和储存。 本标准适用于为国际运尸木质棺柩的设计、生产、检测…

第七天:gec6818开发板QT和Ubuntu中QT安装连接sqlite3数据库驱动环境保姆教程

sqlite3数据库简介 帮助文档 SQL Programming 大多数关系型数的操作步骤&#xff1a;1&#xff09;连接数据库 多数关系型数据库都是C/S模型 (Client/Server)sqlite3是一个本地的单文件关系型数据库&#xff0c;同样也有“连接”的过程 2&#xff09;操作数据库 作为程序员&am…

如何将matlab中的mat矩阵文件在python中读取出来

先安装hdf5storage这个包 pip3 install hdf5storage 然后在当前目录下放入要读取的mat文件 # 将matlab中的mat文件读取出来 import hdf5storagedata hdf5storage.loadmat(inputWeights.mat) print(data[inputWeights])

分布式搜索引擎Elasticsearch

一、Elasticsearch介绍 1.Elasticsearch产生背景 大数据量的检索NoSql: not only sql,泛指非关系型的数据库Nginx的7层负载均衡和4层负载均衡2.Elasticsearch是什么 一个基于Lucene的分布式搜索和分析引擎,一个开源的高扩展的分布式全文检索引擎 Elasticsearch使用Java开发…

RNN模型与NLP应用(1/9):数据处理基础Data Processing Basics

文章目录 处理分类特征把分类特征转化为数值特征应用one-hot编码indice要从1开始而不能从0开始数据处理为什么使用one-hot向量 处理文本数据Step1&#xff1a;将文本分割成单词Step2&#xff1a;计算单词的频度按频度递减的方式排序 Step3&#xff1a;One-Hot编码 处理分类特征…

Stm32_标准库_GPIOA初始化

代码&#xff1a; #include "stm32f10x.h" // Device headerGPIO_InitTypeDef GPIO_InitStructur;//定义变量结构体int main(void){/*使用RCC开启GPIO的时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启PA端口时钟/*使用GPIO_I…

黑马VUE3视频笔记

目录 一、使用create-vue创建项目 二、setup选项 三、reactive和ref函数 1.reactive() 2.ref() 三、computed 四、watch ​五、生命周期函数 六、父传子、子传父 父传子defineProps 子传父defineEmits 七、模板引用 ref defineExpose 八、跨层传递普通数据 prov…

JAXB(Java Architecture for XML Binding)下载、使用

简介 JAXB&#xff08;Java Architecture for XML Binding&#xff09;就是XML数据绑定的java架构。JAXB可以根据XML Schema生成java类&#xff0c;也能根据java类生成XML Schema&#xff0c;能将XML数据unmarshall到Java内容树&#xff0c;也能将Java内容树持久化为XML数据。…

【煤矿虚拟仿真体验】VR采煤机技能培训有效提高训练效果

在我们的社会中&#xff0c;能源是至关重要的。它是推动我们日常生活和工作的主要动力。然而&#xff0c;我们在获取这种能源的过程中&#xff0c;也带来了许多环境问题。煤矿开采是其中的一个重要部分&#xff0c;因此我们需要寻找更环保、更安全的方式来进行煤矿开采。VR&…

手把手教你用 Milvus 和 Towhee 搭建一个 AI 聊天机器人

作为向量数据库的佼佼者&#xff0c;Milvus 适用于各种需要借助高效和可扩展向量搜索功能的 AI 应用。 举个例子&#xff0c;如果想要搭建一个聊天机器人&#xff0c;Milvus 一定是其进行数据管理的首选。那么&#xff0c;如何让这个应用程序开发变得易于管理及更好理解&#x…

LeetCode算法二叉树—222. 完全二叉树的节点个数

目录 222. 完全二叉树的节点个数 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; 运行结果&#xff1a; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能…

2023-09-28 monetdb-db,schema,user,role-分析

摘要: 对moentdb的database,schema,user,role和权限做分析, 以与mysql中的概念做对比分析. 备份: https://stoneatom.yuque.com/staff-ft8n1u/qfqtnb/gfqc62fozh0qsyqm 上下文相关: 2023-09-28 mysql-代号m-schema调研-文档记录-CSDN博客 2023-09-28 monetdb-databae的概念和…

湖南软件测评公司简析:软件功能测试和非功能测试的联系和区别

一、软件功能测试   软件功能测试旨在验证软件是否按照需求规格说明书的要求正常工作。具体而言&#xff0c;功能测试会对软件的所有功能进行测试&#xff0c;以确保其满足用户的需求和预期。在进行功能测试时&#xff0c;根据需求规格说明书编写测试用例&#xff0c;并在测试…

时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-BiLSTM鹈鹕算…

ad18学习笔记十一:显示和隐藏网络、铺铜

如何显示和隐藏网络&#xff1f; Altium Designer--如何快速查看PCB网络布线_ad原理图查看某一网络的走线_辉_0527的博客-CSDN博客 AD19(Altium Designer)如何显示和隐藏网络 如何显示和隐藏铺铜&#xff1f; Altium Designer 20在PCB中显示或隐藏每层铺铜-百度经验 AD打开与…

优化Python开发环境的几个神技巧

用Python编代码体验极佳&#xff0c;并且随着新版本的发布越来越好&#xff01; 对于很多人而言&#xff0c;Python提供的大量免费函数库、高可读性的程序和新引入的类型注释让很多爱不释手。 然而&#xff0c;数据科学家特别容易使自己的Jupyter notebook变得庞大而杂乱&…

计算机里的神灵(SCIP)

计算机程序的构造和解释 我找到计算机里的神灵了&#xff0c;开心一刻 下面是从MIT官网下载的 SCIP求值器&#xff08;解释器&#xff09;的代码&#xff0c;这个官网是个宝藏库 还有其他视频课程和 SCIP的问题答案和可运行代码 链接&#xff1a;https://ocw.mit.edu/courses/6…