【ThingJS | 3D可视化】开发框架,一站式数字孪生

news2025/1/12 13:22:47

在这里插入图片描述

博主:_LJaXi Or 東方幻想郷
专栏: 数字孪生 | 3D可视化框架
开发工具:ThingJS在线开发工具

ThingJs 低代码开发

  • ThingJs 低代码开发
    • 注意点
    • 场景效果配置
    • 层级
      • 层级常用API
      • 实例化 Thing,加载场景
      • load 加载函数
      • ThingJs 层级关系图
      • 查找层级
      • 层级切换完成
      • 飞行完成
    • 楼层
      • 层级事件常用API
      • 监听层级切换事件
      • 获取当前选中的物体
      • 停止进入物体层级默认行为
    • 创建按钮(两种方法)
    • 添加摄像头
    • 创建管线
      • 管线切换
    • 鼠标操作
    • 设置物体样式
    • 循环动作

ThingJs 低代码开发

注意点

有问题直接戳官网: ThingJs 在线开发工具

对象拾取: 只有物品编辑了 UserID Name 或者添加 自定义属性 之后, 导入到 ThingJs 中才能成为独立的管理对象,被程序读取或修改

场景效果配置

灯光配置

app.lighting = {}

后期设置(美化效果)

app.postEffect = {}

天气效果

app.fog = {} // 雾化效果
apep.create // 接口创建粒子,实现雨雪效果
例子类型:'ParticleSystem'

动态天空及天空盒

app.ksyEffect = {}

在这里插入图片描述

层级

层级常用API

app.level.change(object); // 层级切换到指定对象
app.level.back(); // 返回当前层级的父物体层级
app.level.current; // 获取当前的层级对象
app.level.previous; // 获取之前的层级对象

实例化 Thing,加载场景

var app = new THING.App({
    url: '', // 场景url
    background: '#00000', // 场景颜色
    env: ‘Seaside' // 主题吧,忘了
})

load 加载函数

app.on('load', (ev) => {
    app.level....
})

ThingJs 层级关系图

在这里插入图片描述

查找层级

app.query('.Building'); // 查找物体类是 Building 的对象
app.query("car01")[0]; // 查询名称(name)是 car01 的对象
app.query("[alarm]"); // 有物体类型属性的,无论值是什么
app.query('["userData/物体类型"="粮仓"]'); // 查询物体类型属性是粮仓的对象
app.query("[levelNum>2]"); // 查询levelNum大于2的对象,支持 <=, <, =, >, >=

// 支持链式查询
app.query('.Building').query("[alarm]");

// 正则表达式(RegExp)对象
app.query(/car/); 
/
var reg = new RegExp(/car/);
app.query(reg);

层级切换完成

complete() {
    console.log("层级切换完成")
}

飞行完成

flyComplete() {
    console.log("场景飞行完成")
}

楼层

层级事件常用API

EnterLevel; // 进入层级事件 (包含4个内置响应)
LeaveLevel; // 退出层级事件 (包含1个内哭响应)
LevelFlyEnd; // 层级切换飞行结束事件

进入层级时的场景控制 THING.EventTag.LevelSceneOperations,如进入建筑时显示所有楼层;进入物体时,设置兄弟物体半透明

进入层级时的飞行控制 THING.EventTag.LevelFly,如进入各个层级时的飞行控制 (飞行时间、视角等)

进入层级时背景热制 THING.EventTag,LevelSetBackground,如进入建筑后隐藏天空盒

进入层级时的 Pick 设置 THING.EventTag.LevelPickedResultFunc,如进入建筑后是只能 Pick 楼层还是也能 Pick 楼层下的物体

退出层级时的场景控制 THING.EventTag.LevelSceneOperations,如从园区进入建筑层级 (即退出园区) 后,园区隐藏

监听层级切换事件

//第二个参数可以输入.Building/.Floor/.Thing,来监听是建筑、楼层、物体的层级切换,不输入默认监听所有层级
// 监听进入楼层事件
app.on(THING.EventType.EnterLevel, '', function (ev) {
    if (ev.current.name == '1楼') {
        //进入一楼显示两个设备数据
    	//todo
		//...
    }else{
    	//todo
		//...
    }
}, '进入楼层显示面板')

获取当前选中的物体

app.on(THING.EventType.EnterLevel, '.Thing', function (ev) {
	var object = ev.object;
}, 'customEnterThingOperations')

停止进入物体层级默认行为

// 停止进入物体层级的默认行为
app.pauseEvent(THING.EventType.EnterLevel, '.Thing', THING.EventTag.LevelSceneOperations);

在应用程序中,THING.EventType.EnterLevel 事件代表进入楼层的事件类型。当用户进入某个楼层时,系统会默认执行一些与层级场景相关的操作,比如加载和显示该楼层的模型、摄像机切换等

使用 app.pauseEvent 方法可以暂停或停止特定事件的默认行为。在您的代码中,通过调用 app.pauseEvent 方法来停止 ‘THING.EventType.EnterLevel’ 事件与 ‘.Thing’ 类相关的默认行为

换句话说,当用户进入楼层并且当前对象是 ‘.Thing’ 类的实例时,通过停止默认行为,您可以自定义处理事件并阻止系统默认的操作

创建按钮(两种方法)

new THING.widget.Button('按钮文本', function () {
	// 写逻辑
}, "方法描述(随便写)")
new THING.widget.Button('文本',绑定方法(注意不是字符串))

添加摄像头

// 视频url地址,但是url必须是https协议的,
// 其本质是将https协议的一个摄像头html网页引入一个iframe的panel面板中。
var panel2 = null;
// 将视频嵌入到3D场景中
if (panel2) {
    panel2.destroy();
    panel2 = null;
} else {
    // 将视频页面作2D界面元素 通过快捷界面库 panel 的iframe组件进行添加
    panel2 = new THING.widget.Panel({
        titleText: "视频监控",
        dragable: true,
        hasTitle: true,
        width: "400px",
        closeIcon: true
    });
    var iframe = panel2.addIframe({ url: 'https://jiafei.imdo.co/test2/play.html?serial=34020000001320001293&code=34020000001320000001' }, 'url').caption("").setHeight('400px');
    panel2.position = [50, 50];
    // 关闭 panel 时,移除嵌入视频的 iframe 页面
    panel2.on("close", function() {
        // panel.remove(iframe);
        panel2.destroy();
        panel2 = null;
    });
}

创建管线

var pos = [[10.298, 3, -6.635], [-8.702, 3, -6.635], [-8.702, 3, 3.365], [-5.702, 3, 3.365], [-5.702, 3, 1.365]];
// 创建管线
line1 = app.create({
  type: 'PolygonLine',
  points: pos,
  width: 0.15,
  style: {
    image:'https://www.thingjs.com/static/images/poly_line_01.png', // 管线中的纹理资源
  }
});
line1.scrollUV = true;
app.query('.PolygonLine').style.alwaysOnTop = true;
line1.play({
  time: 8000
})

在这里插入图片描述

管线切换

var pos = [[10.298, 3, -6.635], [-8.702, 3, -6.635], [-8.702, 3, 3.365], [-5.702, 3, 3.365], [-5.702, 3, 1.365]];
// 创建管线
line1 = app.create({
    type: 'PolygonLine',
    points: pos,
    width: 0.1,
    style: {
        image: 'https://www.thingjs.com/static/images/line01.png', // 管线中的纹理资源
    }
});
line1.scrollUV = true;
app.query('.PolygonLine').style.alwaysOnTop = true;
line1.play({
    time: 8000
})

在这里插入图片描述

鼠标操作

app.on(THING.EventType.MouseEnter,'.Deploy',(ev)=>{
	//触发事件后执行的操作
	ev.object.hoverState();
},'mouseEnterDeploy');

app.on(THING.EventType.MouseLeave,'.Deploy',(ev)=>{
	//触发事件后执行的操作
	ev.object.hoverState();
},'mouseLeaveDeploy');

app.on(THING.EventType.Click,'.Deploy',(ev)=>{
	//触发事件后执行的操作
	ev.object.hoverState();
});

设置物体样式

/**
 * 获取当前楼层的屋顶
 */
function getFloorRoof() {
    var floor = app.level.current; // 当前楼层
    var roof = floor.roof; // 楼层屋顶
    roof.style.opacity = 0.8; // 设置屋顶透明度
    roof.style.color = '#0000ff'; // 设置屋顶颜色
    roof.visible = true;
}

循环动作

function carmove(){
    car.moveTo({
        // position: [-8.967, 0.02, -2.714], // 移动到世界位置
        offsetPosition: [0, 10, 0], // 相对自身 向后移动到 10m 处
        time: 0.5 * 1000,
        'complete': function () {
            carinit();
        }
        // lerpType:null, // 插值类型 默认为线性插值
    });
}

function carinit(){
    car.moveTo({
        // position: [-8.967, 0.02, -2.714], // 移动到世界位置
        offsetPosition: [0, -10, 0], // 相对自身 向后移动到 10m 处
        time: 0 * 1000,
        'complete': function () {
            carmove();
        }
        // lerpType:null, // 插值类型 默认为线性插值
    });
}

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

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

相关文章

带你走进 字节跳动 消息队列

区别于#创作活动那一篇文章&#xff0c;这篇文章有我自己的重点内容颜色标记等注释&#xff0c;有注释的参加不了那个活动&#xff0c;所以发了两篇&#xff0c;不久之后那篇文章将会删除 消息队列前世今生 1.1 案例一&#xff1a; 系统崩溃 首先大家跟着我想象一下下面的这个的…

(2023)Linux安装pytorch并使用pycharm远程编译运行

&#xff08;2023&#xff09;Linux安装pytorch并使用pycharm远程编译运行 安装miniconda 这部分参考我这篇博客的前半部分Linux服务器上通过miniconda安装R&#xff08;2022&#xff09;_miniconda 安装r_Dream of Grass的博客-CSDN博客 创建环境 创建一个叫pytorch的环境…

Nodejs-nrm:快速切换npm源 / npm官方源和其他自定义源之间切换

一、理解 Nodejs nrm Nodejs nrm 是一个管理 npm 源的工具。由于 npm 在国内的速度较慢&#xff0c;很多开发者会使用淘宝的 npm 镜像源&#xff0c;但是也会遇到一些问题&#xff0c;例如某些包在淘宝镜像源中不存在&#xff0c;或者淘宝镜像源本身也会有问题。 Nodejs nrm …

【C++ 学习 ⑯】- 继承(上)

目录 一、继承的概念和定义 1.1 - 概念 1.2 - 定义 二、继承时的对象内存模型 三、向上转型和向下转型 四、继承时的名字遮蔽问题 4.1 - 有成员变量遮蔽时的内存分布 4.2 - 重名的基类成员函数和派生类成员函数不构成重载 一、继承的概念和定义 1.1 - 概念 C 中的继承…

java八股文面试[java基础]——浅拷贝和深拷贝

自验证&#xff1a;创建Class Student两个类&#xff0c; Student中含有Class对象 public class Class implements Cloneable {public String getName() {return name;}public void setName(String name) {this.name name;}private String name;public Class(String name) {t…

无涯教程-PHP - IntlChar类

在PHP7中&#xff0c;添加了一个新的 IntlChar 类&#xff0c;该类试图公开其他ICU函数。此类定义了许多静态方法和常量&#xff0c;可用于操作unicode字符。使用此类之前&#xff0c;您需要先安装 Intl 扩展名。 <?phpprintf(%x, IntlChar::CODEPOINT_MAX);print (IntlCh…

构建智慧停车场:4G DTU实现无线数据高速传输

物联网技术的快速发展使得各种设备能够实现互联互通&#xff0c;无线网络技术给我们的日常生活带来了极大的便利。其中的网络技术如无线WiFi及4G网络已经成为了物联网应用中不可或缺的组成部分。而在工业领域中对4G无线路由器的应用是非常广泛的&#xff0c;人们通过4G工业路由…

python中 * 的用法,超详细教程

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 python中 * 是非常常见的一个运算符&#xff0c;它主要有以下几个功能&#xff1a; 乘法运算符&#xff1b; 函数形参表示可变参数&#xff1b; 函数实参代表tuple&#xff1b; 序列解包为tuple&#xff1b; zip解包运算&…

知识蒸馏Demo,非常详细,适合入门

文章来自&#xff1a;Ai浩的“知识蒸馏实战&#xff1a;使用CoatNet蒸馏ResNet”&#xff0c;文章地址为&#xff1a;知识蒸馏实战&#xff1a;使用CoatNet蒸馏ResNet_知识蒸馏实例_AI浩的博客-CSDN博客 感谢作者&#xff01;&#xff01;&#xff01; 摘要 知识蒸馏&#xf…

nvm安装使用教程

文章目录 下载配置安装最新稳定版 node安装指定版本查看版本切换版本删除版本 常见问题安装node后 显示拒绝访问的问题使用cnpm会报错的问题降低cnpm版本npm镜像 下载 NVM for Windows 下载地址&#xff1a;https://link.juejin.cn/?targethttps%3A%2F%2Fgithub.com%2Fcoreyb…

《动手学深度学习》-19卷积层

沐神版《动手学深度学习》学习笔记&#xff0c;记录学习过程&#xff0c;详细的内容请大家购买书籍查阅。 b站视频链接 开源教程链接 卷积 使用一个12M像素的相机采集图片&#xff0c;因为是RGB图片所以有36M元素。 使用MLP来做分类会遇到的问题&#xff1a; 参数太大&#…

goland 中的调试器 -- Evaluate

今天一个好朋友 找到我&#xff0c;问我关于goland中Evaluate 小计算器的使用方式&#xff0c;说实话&#xff0c;我在此之前也没用过这个东西&#xff0c;然后我就找一些相关文档&#xff0c;但是这类文档少的可怜&#xff0c;所以我就稍微研究一下&#xff0c;找找材料&#…

【附安装包】Vero visi2021安装教程

软件介绍 Vero visi是世界领先的CAD/CAM解决方案&#xff0c;又简称为visi&#xff0c;由多个模块组成&#xff0c;包括VISI Modelling、VISI Analysis、VISI Mould、VISI Flow、VISI Electrode、VISI Progress、VISI Multi-Slides、VISI Machining 2D、VISI PEPS-Wire、WorkX…

《操作系统真象还原》学习笔记:第七章 中断

由于 CPU 获知了计算机中发生的某些事&#xff0c;CPU 暂停正在执行的程序&#xff0c;转而去执行处理该事件的程序&#xff0c;当这段程序执行完毕后&#xff0c;CPU 继续执行刚才的程序。整个过程称为中断处理&#xff0c;也称为中断。 把中断按事件来源分类&#xff0c;来自…

nginx:正向代理与反向代理

所谓代理服务器&#xff0c;就是位于发起请求的客户端与原始服务器端之间的一台跳板服务器&#xff0c; 正向代理可以隐藏客户端&#xff1a;想要实现正向代理&#xff0c;得配置一台转发请求的跳板服务器&#xff0c;同时客户端还得配置跳板服务器的代理地址。 我的电脑访问这…

5大轻量开源的项目管理软件推荐,更适合中小团队!

随着互联网的发展&#xff0c;项目管理软件越来越受到企业和团队的重视。不仅可以提高工作效率&#xff0c;还可以帮助团队协作、进度跟踪和资源管理等方面&#xff0c;简化复杂的项目管理流程。那么&#xff0c;对于中小团队来说&#xff0c;有没有一款轻量易上手的适合他们的…

网络防御与蓝队实践:探讨网络防御策略、入侵检测系统、安全事件响应等蓝队方面的实际案例和方法

第一章&#xff1a;引言 网络安全一直是当今信息社会中至关重要的话题。随着技术的不断发展&#xff0c;网络威胁也愈发复杂和隐匿。在这样的背景下&#xff0c;网络防御变得尤为重要&#xff0c;蓝队作为网络防御的重要一环&#xff0c;起着至关重要的作用。本文将深入探讨网…

libdrm全解析一 —— 总述

本文参考以下博文&#xff1a; Linux libdrm代码完全解析 LIBDRM使用 最简单的DRM应用程序 &#xff08;single-buffer&#xff09; Linux libdrm库入门教程 10. DRM图形显示框架 LIBDRM 特此致谢&#xff01; 一、介绍 BLFS中给出的介绍 libdrm提供了一个用户空间库&…

2023年湖北中级工程师职称申报专业有哪些?甘建二告诉你

中级职称职称申报专业&#xff1a;环境工程、 土木建筑、土建结构、土建监理、土木工程、岩石工程、岩土、土岩方、风景园林、园艺、园林、园林建筑、园林工程、园林绿化、古建筑园林、工民建、工民建安装、建筑、建筑管理、建筑工程、建筑工程管理、建筑施工、建筑设计、建筑装…

36k字从Attention解读Transformer及其在Vision中的应用(附pytorch代码)

文章目录 0.卷积操作1.注意力1.1 注意力概述&#xff08;Attention&#xff09;1.1.1 Encoder-Decoder1.1.2 查询、键和值1.1.3 注意力汇聚&#xff1a; Nadaraya-Watson 核回归 1.2 注意力评分函数1.2.1 加性注意力1.2.2 缩放点积注意力 1.3 自注意力&#xff08;Self-Attenti…