Threejs物联网,工厂3D可视化,加载模型,水流监测,标签动态数据展示

本文主要是介绍Threejs物联网,工厂3D可视化,加载模型,水流监测,标签动态数据展示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1,介绍

该示例使用的是 r95版本Three.js库。

主要实现功能:引用水厂模型进行展示,模拟水流效果,动态显示数据信息。效果图如下:

2,主要说明

1,加载模型设置模型颜色效果并添加到场景中。

2,创建管道并添加纹理,这里不过多介绍具体可查看上一篇文章。

3,添加标签并实时刷新渲染实时数据

引入模型设置颜色效果并添加到场景中,这里只介绍添加模型方法

function initShuiChang() {var loader = new THREE.GLTFLoader();// assets/models/fang/shapan.glb'loader.load('assets/models/shuichang/shuichang.glb', function(result) {var object = result.scene;console.log(object)object.traverse(function(item) {if (item instanceof THREE.Mesh) {item.material.color.set(0x1DA9FC);item.material.transparent = true;item.material.opacity = 0.5;}});object.scale.set(2, 2, 2);object.rotateY(3.14);scene.add(object);});
}

 添加标签并实时刷新渲染实时数据

function createPath(pointsArr) {pointsArr = pointsArr.map((point) => new THREE.Vector3(...point)); // 将参数数组转换成点数组的形式// 方法一:自定义三维路径 curvePathconst path = new THREE.CurvePath();for (let i = 0; i < pointsArr.length - 1; i++) {const lineCurve = new THREE.LineCurve3(pointsArr[i], pointsArr[i + 1]); // 每两个点之间形成一条三维直线path.curves.push(lineCurve); // curvePath有一个curves属性,里面存放组成该三维路径的各个子路径}return path;
}const count = 200
const gColor = '#28f260'
const prop1 = {width: 416,height: 112,pos: [60, 35, 30],// scale:[24, 6, 0]scale: [0.24375 * count, 0.065625 * count, 0]
}
const tab1 = [['一级高压泵后压力:', '20.2bar', gColor],['一级循环泵后压力:', '0.2bar', ]
]const prop2 = {width: 352,height: 196,pos: [-60, 40, 0],scale: [0.20625 * count, 0.11484375 * count, 0],
}const tab2 = [['进水情况', ''],['进水温度:', '25.6℃', gColor],['进水流量:', '2.5m³', ],['进水电导:', '28.5ms/cm', gColor],
]const prop3 = {width: 384,height: 256,pos: [5, 60, -60],scale: [0.225 * count, 0.15 * count, 0]
}
const tab3 = [['产水情况', ''],['一级回收率:', '58%', gColor],['一级产水流量:', '1.75㎡', ],['一级产水电量:', '980.5/cm', gColor],['一级产水电量:', '0.5bar', gColor],
]const prop4 = {width: 256,height: 64,pos: [-85, 30, 40],scale: [0.15 * count, 0.0375 * count, 0],
}
const tab4 = [['泵机状态 ', '• 开启', gColor],
]const prop5 = {width: 256,height: 64,pos: [-10, 50, 30],scale: [0.15 * count, 0.0375 * count, 0],
}
const tab5 = [['阀门状态 ', '• 开启', gColor],
]
const props = [prop1, prop2, prop3, prop4, prop5]
const tabs = [tab1, tab2, tab3, tab4, tab5]// 调用渲染标签,并定时刷新
handleDatachange();
setInterval(handleDatachange, 2000)function handleDatachange() {let r = (Math.random() * 10 + 20).toFixed(2)tab2[1][1] = r + '℃'if (r > 25) tab2[1][2] = 'red'else tab2[1][2] = gColorr = Math.random().toFixed(2)tab3[4][1] = r + 'bar'if (r > 0.5) tab3[4][2] = 'red';else tab3[4][2] = gColorif (Math.random() > 0.5) {tab5[0][1] = '• 开启'tab5[0][2] = gColor} else {tab5[0][1] = '• 关闭'tab5[0][2] = 'red'}console.time('render sprite')initSprite()console.timeEnd('render sprite')
}function initSprite() {clearSprite();(scene.children || []).forEach((v, idx) => {if (v.type == 'Mesh') {const borderColor = 'rgba(39, 179, 236, 1)'const color = 'rgba(255,255,255, 1)'makeTextSprite(scene, tabs, props, {color: color,borderColor,backgroundColor: 'rgba(255,255,255,0.05)'});}});
}// 清空雪碧图
function clearSprite(type = 'Sprite') {const children = [];(scene.children || []).forEach((v, idx) => {if (v.type !== type) {children.push(v);}});scene.children = children;
}
/* 创建字体精灵 */
function makeTextSprite(scene, tabs, props, parameters) {if (parameters === undefined) parameters = {}tabs.forEach((tab, k) => {let {width,height} = props[k]/* 创建画布 */let canvas = document.createElement('canvas');let context = canvas.getContext('2d')canvas.width = widthcanvas.height = heightlet gap = 10let fontface = parameters.hasOwnProperty("fontface") ? parameters["fontface"] : "sans-serif"/* 字体大小 */let fontsize = parameters.hasOwnProperty("fontsize") ?parameters["fontsize"] : 30let color = parameters.hasOwnProperty("color") ? parameters["color"] : 'rgba(0, 0, 0, 1.0)'/* 边框厚度 */let borderWith = parameters.hasOwnProperty("borderWith") ? parameters["borderWith"] : 2/* 边框颜色 */let borderColor = parameters.hasOwnProperty("borderColor") ? parameters["borderColor"] : {r: 0,g: 0,b: 0,a: 1.0}/* 背景颜色 */let backgroundColor = parameters.hasOwnProperty("backgroundColor") ? parameters["backgroundColor"] : {r: 255,g: 255,b: 255,a: 1.0}/* 字体加粗 */// context.font = "Bold " + fontsize + "px " + fontfacecontext.font = fontsize + "px " + fontfacelet unit = gap + fontsize/* 背景颜色 */context.fillStyle = backgroundColor/* 边框的颜色 */context.strokeStyle = borderColorcontext.lineWidth = borderWith/* 绘制圆角矩形 */roundRect(context, gap, gap, width - gap, height - gap, 4)tab.forEach((d, i) => {context.fillStyle = color;context.fillText(d[0], gap * 2, gap + unit * (i + 1))if (d[2]) {context.fillStyle = d[2]}context.fillText(d[1], gap * 2 + measureText(d[0], context), gap + unit * (i + 1))})/* 画布内容用于纹理贴图 */let texture = new THREE.Texture(canvas);texture.needsUpdate = truelet spriteMaterial = new THREE.SpriteMaterial({map: texture,// sizeAttenuation:false,// transparent:true});let sprite = new THREE.Sprite(spriteMaterial)// console.log(sprite.spriteMaterial)/* 缩放比例 */sprite.scale.set(...props[k].scale)sprite.center = new THREE.Vector2(0, 0);scene.add(sprite);sprite.position.set(...props[k].pos);})
}function measureText(text, ctx, font) {if (font) ctx.font = fontreturn ctx.measureText(text).width;
}
/* 绘制圆角矩形 */
function roundRect(ctx, x, y, w, h, r) {ctx.beginPath();ctx.moveTo(x + r, y);ctx.lineTo(x + w - r, y);ctx.quadraticCurveTo(x + w, y, x + w, y + r);ctx.lineTo(x + w, y + h - r);ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);ctx.lineTo(x + r, y + h);ctx.quadraticCurveTo(x, y + h, x, y + h - r);ctx.lineTo(x, y + r);ctx.quadraticCurveTo(x, y, x + r, y);ctx.closePath();// ctx.shadowColor = "#qb95cf";// ctx.shadowOffsetX = 0;// ctx.shadowOffsetY = 0;// ctx.shadowBlur = 4;ctx.fill();ctx.stroke();ctx.shadowColor = "";ctx.shadowOffsetX = 0;ctx.shadowOffsetY = 0;ctx.shadowBlur = 0;
}

在线预览:左本的博客 (zuoben.top) 

这篇关于Threejs物联网,工厂3D可视化,加载模型,水流监测,标签动态数据展示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817658

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费