千家信息网

HTML5的垃圾分类系统代码实现

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"HTML5的垃圾分类系统代码实现",在日常操作中,相信很多人在HTML5的垃圾分类系统代码实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"HTML5
千家信息网最后更新 2026年11月02日HTML5的垃圾分类系统代码实现

这篇文章主要介绍"HTML5的垃圾分类系统代码实现",在日常操作中,相信很多人在HTML5的垃圾分类系统代码实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"HTML5的垃圾分类系统代码实现"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

代码实现

(注:gif 的上传大小有限,实际效果与还请参考 demo 链接)

首先,我应用已经精心布置好的 3D 场景,为了有更好的操作体验感,我们要从它的基本设置开始:

gv.setMovableFunc(() => { return false }) // 禁止拖动gv.getWireframe = (d) => { d.s('wf.visible', false) }  // 隐藏选中边框gv.setEye([583, -212, -789]) // 设置眼睛gv.setCenter([-76, -654, -133]) // 设置中心点gv.setFar(100000) // 设置远端位置gv.setNear(10) // 设置近端位置gv.setInteractors([ new ht.graph4d.MapInteractor(gv) ]) // 设置交互限制gv.setSkyBox(dm.getDataByTag('skyBox')) // 设置天空球_window.document.oncontextmenu = () => { return false } // 全局设置右键菜单禁用gv.scene = { // 复制初始位置    eye: ht.Default.clone(gv.getEye()),    center: ht.Default.clone(gv.getCenter()),    far: ht.Default.clone(gv.getFar()),    near: ht.Default.clone(gv.getNear()),}

我复制了一下整个场景的初始视角情况方便我做稍后的处理,我监听了部分鼠标事件来形成自己的操作风格(比如双击背景还原视角以及双击模型拉近视角):

gv.mi(e => {    let data = e.data    let kind = e.kind    if (kind === 'doubleClickBackground') { // 双击背景        gv.moveCamera(this.gv.scene.eye, this.gv.scene.center, {duration : 1000}) // 恢复视角    }    else if (kind === 'doubleClickData') { // 双击模型        gv.flyTo(data, {animation : {duration : 500}, distance : 800}) // 拉近视角    }})

好了,准备工作做好了,下面来实现动画部分,除了了解 垃圾分类 的方式外我还参考了网上很多机械臂的视频,学习它的运动模式和动作细节,对每个结构和部位的动画进行步骤的排序和构思。这里我挑选几处动画的实现方式来展示:

function mechanicalArmAnim1() {  ht.Default.startAnim({    duration: 1000,    easing: (t) => { return t },    action: (v, t) => {      postbrachium.r3(degrees(0) + (degrees(20) - degrees(0)) * v, postbrachium.r3()[1], postbrachium.r3()[2]) // 后臂向下移    },    finishFunc: () => {      setTimeout(() => {        mechanicalArmAnim2()      }, 300)    }  })}function mechanicalArmAnim2() {  ht.Default.startAnim({    duration: 1000,    easing: (t) => { return t },    action: (v, t) => {      postbrachium.p3(-208 + (-184 + 208) * v, postbrachium.p3()[1], postbrachium.p3()[2]) // 后臂前伸      hydraulicRod1.r3(degrees(0) + (degrees(8) - degrees(0)) * v, hydraulicRod1.r3()[1], hydraulicRod1.r3()[2]) // 液压杆1倾斜      extensionRod1.r3(degrees(0) + (degrees(8) - degrees(0)) * v, extensionRod1.r3()[1], extensionRod1.r3()[2]) // 伸长杆1倾斜      extensionRod1.p3(-169 + (-185 + 169) * v, -516 + (-511 + 516) * v, extensionRod1.p3()[2]) // 伸长杆1伸长      hydraulicRod2.r3(degrees(0) + (degrees(-8) - degrees(0)) * v, hydraulicRod2.r3()[1], hydraulicRod2.r3()[2]) // 液压杆2倾斜      extensionRod2.r3(degrees(0) + (degrees(-8) - degrees(0)) * v, extensionRod2.r3()[1], extensionRod2.r3()[2]) // 伸长杆2倾斜      extensionRod2.p3(-169 + (-185 + 169) * v, -516 + (-511 + 516) * v, extensionRod2.p3()[2]) // 伸长杆2伸长    },    finishFunc: () => {      setTimeout(() => {        mechanicalArmAnim3()      }, 300)    }  })}function mechanicalArmAnim3() {  let oldValue = antebrachium.r3()[0]  ht.Default.startAnim({    duration: 1000,    easing: (t) => { return t },    action: (v, t) => {      hydraulicRod1.r3(degrees(8) + (degrees(7) - degrees(8)) * v, hydraulicRod1.r3()[1], hydraulicRod1.r3()[2]) // 液压杆1倾斜      extensionRod1.r3(degrees(8) + (degrees(7) - degrees(8)) * v, extensionRod1.r3()[1], extensionRod1.r3()[2]) // 伸长杆1倾斜      extensionRod1.p3(-185 + (-186 + 185) * v, -511 + (-507 + 511) * v, extensionRod1.p3()[2]) // 伸长杆1伸长      hydraulicRod2.r3(degrees(-8) + (degrees(-7) - degrees(-8)) * v, hydraulicRod2.r3()[1], hydraulicRod2.r3()[2]) // 液压杆2倾斜      extensionRod2.r3(degrees(-8) + (degrees(-7) - degrees(-8)) * v, extensionRod2.r3()[1], extensionRod2.r3()[2]) // 伸长杆2倾斜      extensionRod2.p3(-185 + (-186 + 185) * v, -511 + (-507 + 511) * v, extensionRod2.p3()[2]) // 伸长杆2伸长      postbrachium.r3(degrees(20) + (degrees(25) - degrees(20)) * v, postbrachium.r3()[1], postbrachium.r3()[2]) // 后臂向下移      antebrachium.r3(oldValue + (degrees(-40) - oldValue) * v, antebrachium.r3()[1], antebrachium.r3()[2]) // 前臂向下移      claw1.r3(degrees(-20) + (degrees(-60) - degrees(-20)) * v, claw1.r3()[1], claw1.r3()[2]) // 上爪抓取      claw2.r3(degrees(-60) + (degrees(-30) - degrees(-60)) * v, claw2.r3()[1], claw2.r3()[2]) // 下爪抓取    },    finishFunc: () => {      mechanicalArmAnim4()    }  })}

这一段动画是机械臂从初始化状态到向下抓取的一个过程,我将每段动画分成函数来写比较方便后续管理,每一处也代表了一个步骤。这其中最复杂且细微的步骤要数液压杆的运动了,为了让动画看起来更加真实,我除了将手臂单独运动的过程中加入了延时执行下一段动画以体现机器运动的特点外,也把液压杆的部分也做了动画,如果不做处理,那么机械臂在上下移动的时候就会有不科学的效果出现。动画函数 在这种 demo 中应用的最广,而且里面也包含了一些缓动函数,有兴趣的博友们可以 点此处 自己亲自动手玩一玩~

这里面的拾取垃圾步骤还应用了我过去介绍过的 吸附 功能,这个方法非常的适合抓取物体的动作,通过 setHost 使节点吸附于宿主,这样就相当于子节点跟随父节点移动,此时只需要对机械臂进行偏移和旋转的操作,垃圾便会随之一起运动了,大大减少了工作量!

还有一部分更酷的属性设置给大家展示一下,可以让 3D 场景整体有更真实的阴影处理效果。首先我们要注意将无关的节点阴影通过 node.s('shadow.cast', false) 关闭,比如编组用的box,背景,地板和面板等。

最后我们就把阴影的细节做下调整,达到比较好的效果:

gv.enableShadow(true, {  degreeX : 0,       // 投影 x 轴角度  degreeZ : -25,      // 投影 z 轴角度  intensity : 0.3,    // 阴影强度, 1 为黑色  quality : 'high',  // low / medium / high / ultra / 4096数值, 质量  type : 'soft',     // none / hard / soft  radius : 0.2,      // type 为 hard / soft 时,补充的边缘厚度,用来提供更柔和的边缘  bias : -0.003     // 深度浮点偏差补足})

到此,关于"HTML5的垃圾分类系统代码实现"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

动画 垃圾 液压 代码 分类 视角 学习 运动 系统 效果 机械 步骤 节点 阴影 位置 函数 场景 背景 部分 处理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州大一互联网络科技有限公司 西安纸贵互联网科技有限公司 互联网科技战争 宜安科技 互联网金融 壕鑫互联网络科技 互联网科技logo 苏州大垚互联网科技 深圳艾佳互联网科技 上海亿帐通互联网科技 天速互联网络科技有限公司 欧洲十大科技互联网公司 金融科技与互联网金融相同和不同 成都互联网科技公司工作好不好 深圳市罗太互联网科技有限公司 互联网金融科技公司的优势 小米互联网科技园入驻 皮皮虾互联网科技有限公司 全球科技与互联网公司市值变化 广州三三互联网科技有限公司 互联网高科技绘画 厦门中拓互联网络科技有限公司 科技互联网公司装修 中资互联网科技 北京互联网络科技有限公司 菲比寻常互联网科技 重庆互联网医院沙龙医盟信息科技 浙江互联网科技研学营 怎样加入科技互联网 皮皮虾互联网科技有限公司 黑龙江互联网科技公司
0