基于 HTML5 WebGL 的医疗物流系统

前言

物联网( IoT ),简单的理解就是物体之间通过互联网进行链接。世界上的万事万物,都可以通过数据的改变进行智能化管理。ioT 的兴起在医疗行业中具有拯救生命的潜在作用。
不断的收集用户信息并且实时的进行诊断,所以未来 iot 肯定在医疗行业的应用会呈覆盖性。下面是我最近做的一个医疗物流系统,用来观察医疗物流过程。

ht官网链接:http://www.hightopo.com/cn-index.html

demo链接: https://www.hightopo.com/demo/pivas/

实现过程

增加光源

整个原场景其实是非常暗的,所以需要使用灯光的效果照亮整个场景,使其接近真实世界的场景。

我们看下对比。

light 的一些属性:

type 代表灯光的类型

color 代表灯光的颜色

intensity 代表灯光的强度(1是最大值)

range 代表范围

addLight() {
        const skyBox = this.dm.getDataByTag(‘skyBox‘)

        // 限制视野在天空球之内
        this.gv.setSkyBox(skyBox)
        const light = new ht.Light()
        const lightSource = this.dm.getDataByTag(‘sunlight‘).p3()

        const config = {
            ‘light.type‘: ‘point‘,
            ‘light.color‘: ‘white‘,
            ‘light.intensity‘: 0.3,
            ‘light.range‘: 10000
        }

        light.s(config)
        light.p3(lightSource)this.dm.add(light)
 }

看向物体

 看到左下角的一个小窗口,其实是另一个3d场景,把它定位到左下角的,两个场景都使用了反序列化( deserialize )。

因为要定位医疗箱移动,所以这里使用到了 flyTo 方法 。

var renderCanvas = function (medical, duration) {
    ht.Default.startAnim({
       duration,
       easing(v, t) {
         return t
       },
       action(v, t) {
         outScreenG3d.flyTo(medical, { direction: [-5, 3, 5], distance: 300 })
       }
    })
 }

封装动画

如果要实现这么多的动画,首先想到的是一个个物体进行移动的过程。医疗箱的行走、电梯的升降、传送带运送医疗箱等我们都可以对他们的动作进行封装。

如图可以看到医疗箱总是在动,所以定义了一个行走的动画,每次医疗箱行走的距离、行走方向、动画的配置都进行传参。

这里要说明的参数:

1.node(对应的元素)

2.fn(动画执行完进行回调的函数)

3.config(动画配置)

4.coord(方向轴)

    // 行走动画
    walkAnim(node, fn, config, coord) {
        const { duration, space } = config
        const positionArray = node.p3()

        let isShadow = false
        let ShadowNode = null
        // 如果移动的元素是icu车或者供应车的话 获取它的阴影跟随元素移动
        if (node.getTag() === ‘supply‘ || node.getTag() === ‘icuCar‘) {
            isShadow = true
            ShadowNode = this.dm.getDataByTag(`${node.getTag()}Shadow`)
        }

        ht.Default.startAnim({
            duration,
            easing: function (t) {
                return t
            },
            action(v, t) {
                if (coord === ‘x‘) {
                    node.p3(positionArray[0] + t * space, positionArray[1], positionArray[2])
                    isShadow && ShadowNode.p3(positionArray[0] + t * space, positionArray[1], positionArray[2])
                } else if (coord === ‘y‘) {
                    node.p3(positionArray[0], positionArray[1] + t * space, positionArray[2])
                    isShadow && ShadowNode.p3(positionArray[0], positionArray[1] + t * space, positionArray[2])
                } else {
                    node.p3(positionArray[0], positionArray[1], positionArray[2] + t * space)
                    isShadow && ShadowNode.p3(positionArray[0], positionArray[1], positionArray[2] + t * space)
                }
            },
            finishFunc() {
                typeof fn === ‘function‘ && fn(node)
            }
        })
    }

物体之间的影响

电梯的升降会影响很多东西,比如频台的移动会带着传送带和医疗箱,这里我用到了 sethost 吸附方法(吸附:节点指定宿主,宿主进行改变会影响节点)。

很多场景下非常合适,我需要电梯升降的过程中带用医疗箱和频台一起上升,还有医疗箱放到传送带的时候,医疗箱要动起来,感觉是这真的传送带在带动医疗箱进行运动。

这里要说明的参数:

1.node(操作的电梯元素)

2.medicalKit(医疗箱)

3.fn(动画执行完进行回调的函数)

4.status (电梯上升和下降的状态)

5.config(动画配置)

// 电梯升降动画
    elevatorAnim(node, medicalKit, fn, status, config) {
        const self = this
        // 获取电梯的index 让对应的频台也跟着动
        const elevatorIndex = node.getTag().replace(/[^0-9]/ig, ‘‘) - 0

        // 获取医疗箱的index 控制电梯升降的距离
        const medicalKitIndex = medicalKit.getTag().replace(/[^0-9]/ig, ‘‘) - 0
        const positionArray = node.p3()
        const station = self.dm.getDataByTag(`station${elevatorIndex}`)

        //吸附宿主
        station.setHost(node)
        medicalKit.setHost(node)

        // 设置升降状态
        if (elevatorIndex === 3) self.elevatorRunning = true
        // 升降距离 status 为 0 的时候是下降 最低部位的距离是固定的 所以只需要控制上升的距离
        const medicalKitLevel = self.returnMedicalKitLevel(medicalKitIndex)

        // 电梯的属性
        // 最低点的位置 Lowest
        // 如果有轨道的话 就去轨道的位置  否则就按照层数 orbitalP
        // 第一层的位置  distance
        let space
        const addSpace = medicalKitIndex === 7 ? 100 : 0
        if (status == 1) {
            space = config.orbitalP ? config.orbitalP : config.distance + addSpace + (400 * medicalKitLevel)
        } else {
            space = config.Lowest
        }

        // 下降状态时 医疗箱不会做动作
        if (status === 0) {
            medicalKit.setHost()
        }

        return ht.Default.startAnim({
            duration: config.orbitalP ? 2000 : (medicalKitLevel === 0 && elevatorIndex == 3 ? 700 : 2500 + (medicalKitLevel * 1000)),
            action(v, t) {
                node.p3(
                    positionArray[0],
                    positionArray[1] + ((space - positionArray[1]) * t),
                    positionArray[2]
                )
            },
            finishFunc() {
                station.setHost()
                typeof fn === ‘function‘ && fn(node)
            }
        })
    }

动画暂停

动画的过程中有个问题需要处理就是等待电梯的动画,医疗箱在动画过程中,需要判断电梯是否在上升,如果不在地面的话,需要等待。

我的思路是,当医疗箱走到离电梯一点距离的时候,需要判断电梯是否在上升状态,如果是的话,需要调用动画暂停的方法。

elevatorRunning 为 false 的时候代表电梯没有运动,否则在运动中。

电梯动画开始的时候设置为 true,结束后设置变量为 false,  就可以监控它的状态了。

ht.Default.startAnim 方法会返回一个实例,通过实例的方法可以对当前动画进行一些操作。

const anim = ht.Default.startAnim({
            duration,
            action(v, t) {
                node.p3(
                    positionArray[0],
                    positionArray[1],
                    positionArray[2] - (tpMax - positionArray[2]) * t
                );
                if (index > 1 && self.elevatorRunning === true) {
                    if (node.p3()[2] <= stopMax) {
                        anim.pause();
                        const t = setInterval(() => {
                            if (self.elevatorRunning === false) {
                                anim.resume();
                                clearInterval(t);
                            }
                        }, 100);
                    }
                }
            },
            finishFunc() {
                typeof fn === "function" && fn();
            }
        });
        return anim;

事件监听(发布、订阅)

因为需要监听某个当前动画的结束,然后进行相机位移。

如图,我需要监听第一个 3d 场景中显示提示文字动画结束,然后执行第二个 3d 场景的显示。因为2个是不同的场景,是不能用回调的方法监听到的,所以这里就用到了 eventBus 事件总线。

下面是 eventBus 的使用,第一个参数代表要监听的注册函数名,第二个是回调函数。

// 事件总线 监听事件
eventbus.on(‘animation1‘, _ => {
  const medical = dm.getDataByTag(‘medicalKit1‘)
  renderView(medical, dm, gv)
})

下面是 eventBus 发射的使用,第一个参数代表要触发的函数名,第二个是发射给函数的参数。

// 触发事件
eventbus.emit("animation1", null);

总结

做完这个 demo 之后,除了对 HT for Web 更加熟练之外,对物联网也有了更深刻的概念。

我身为一名前端工作者,在这个时代感觉非常的自豪,因为我能通过自己的技能创造出许多能造福和改善人们生活的东西。

希望大家看到我的 demo 能够得到一些启发,同时也要相信自己能够创造不可能,为社会做出贡献。

原文地址:https://www.cnblogs.com/htdaydayup/p/11558748.html

时间: 2024-08-28 21:07:29

基于 HTML5 WebGL 的医疗物流系统的相关文章

基于 HTML5 + WebGL 的 3D 太阳系系统

前言 近年来随着引力波的发现.黑洞照片的拍摄.火星上存在水的证据发现等科学上的突破,以及文学影视作品中诸如<三体>.<流浪地球>.<星际穿越>等的传播普及,宇宙空间中那些原本遥不可及的事物离我们越来越近,人们对未知文明的关注和对宇宙空间的好奇达到了前所未有的高度.站在更高的立足点上,作为人类这个物种中的一员,我们理所应当对我们生活的星球.所在的太阳系有一定的认识,对 8 大行星各自的运行轨道.质量.资源存储量甚至是地形有一定的了解. 本系统采用 Hightopo 的 H

基于 HTML5 + WebGL 实现的垃圾分类系统

前言 垃圾分类,一般是指按一定规定或标准将垃圾分类储存.分类投放和分类搬运,从而转变成公共资源的一系列活动的总称.分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用.垃圾在分类储存阶段属于公众的私有品,垃圾经公众分类投放后成为公众所在小区或社区的区域性准公共资源,垃圾分类搬运到垃圾集中点或转运站后成为没有排除性的公共资源.从国内外各城市对生活垃圾分类的方法来看,大致都是根据垃圾的成分.产生量,结合本地垃圾的资源利用和处理方式来进行分类的.到2019年6月25日,生活垃圾分类制度将入法.一套应

基于 HTML5 + WebGL 实现 3D 可视化地铁系统

前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 HT for Web 产品来构造轻量化的 3D 可视化场景,该 3D 场景从正面展示了一个地铁站的现实场景,包括地铁的实时运行情况,地铁上下行情况,视频监控,烟雾报警,电梯运行情况等等,帮助我们直观的了解当前的地铁站. 系统中

基于HTML5 WebGL的工业化3D电子围栏

前言 现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 HT for Web 产品来构造轻量化的 3D 可视化场景,该 3D 场景从正面展示了一个现代化工厂的现实场景,包括工厂工人的实时位置.电子围栏的范围.现场的安全情况等等,帮助我们直观的了解当前工厂人员的安全状况. 本篇文章通过对工厂可视化场景的搭建和模型的加载,人物实时定位代码的实现.电子围栏和轨

基于 HTML5 WebGL 的智慧城市(一)

前言 中共中央.国务院在今年12月印发了<长江三角洲区域一体化发展规划纲要>(下文简称<纲要>),并发出通知,要求各地区各部门结合实际认真贯彻落实. <纲要>强调,要提升基础设施互联互通水平,打造数字长三角,协同建设新一代信息基础设施,共同推动重点领域智慧应用.大力发展基于物联网.大数据.人工智能的专业化服务,提升各领域融合发展.信息化协同和精细化管理水平.围绕城市公共管理.公共服务.公共安全等领域,支持有条件的城市建设基于人工智能和 5G 物联的城市大脑集群. 城市治

基于 HTML5 WebGL 构建智能数字化城市 3D 全景

前言 自 2011 年我国城镇化率首次突破 50% 以来,<新型城镇化发展规划>将智慧城市列为我国城市发展的三大目标之一,并提出到 2020 年,建成一批特色鲜明的智慧城市.截至现今,全国 95% 的副省级以上城市.76% 的地级以上城市,总计约 500 多个城市提出或在建智慧城市. 基于这样的背景,本系统采用 Hightopo 的  HT for Web  产品来构造轻量化的 智慧城市 3D 可视化场景,通过三个角度的转换,更清晰让我们感知到 5G 时代下数字化智能城市的魅力 预览地址:HT

基于 HTML5 WebGL 的 水泥工厂可视化系统

前言 如今的制造行业,基于数据进行生产策略制定与管理已经成为一种趋势,特别是 工业4.0 的浪潮下,数据战略已经成为很多制造企业的优先战略,而数据可视化以更直观的方式,帮助指导决策,成为数据分析传递信息的重要工具.通过数据可视化系统助力实现数据驱动的工业世界,为 工业4.0 提供更加灵活.敏捷.高效.个性化的数据支撑.今天就给大家带来一个采用 Hightopo 的 HT for Web 产品实现了一个水泥工厂可视化系统. 系统预览 本案例共有七个子系统: 数据概况 -- 展示全厂年月时间单位的各

基于 HTML5 WebGL 的故宫人流量动态监控系统

前言 在当代社会,故宫已经成为一个具有多元意义的文化符号,在历史.艺术.文化等不同领域发挥着重要的作用,在国际上也成为能够代表中国文化甚至中国形象的国际符号.近几年故宫的观众接待量逐年递增,年接待量已突破千万,根据故宫的文物特点与开放模式,必须及时建立一套完整的集监控与防患应急于一体的现代化监控系统. 故宫人流量动态监控系统采用 Hightopo 的  HT for Web  产品来构造 故宫 3D 动态可视化场景,通过将现场部署的传感器.监控设备等装置与智能联网设备集成到互联网上,对故宫当前的

基于 HTML5 WebGL 的民航客机飞行监控系统

前言 前些日子出差,在飞机上看到头顶的监控面板,除了播放电视剧和广告之外,还会时不时的切换到一个飞机航行的监控系统,不过整个监控系统让人感到有一点点的简陋,所以我就突发奇想制作了一个采用 HT for Web 的升级版监控系统,demo 的效果还行,发出来大家相互学习下. demo 实现过程 云中穿行效果 为了达到飞机云中穿行的效果,最开始我遇到的问题是飞机飞行的层次感,也就通常所说的透视效果,这里我采用的是云通道和云背景以不同的速度流动,制造一种飞行的透视效果. 云我采用的是贴图的方式呈现的,