React+Three.js 实现视角切换放大展示并结合接口数据对模型进行展示交互

💡 原文中文,约12300字,阅读约需30分钟。
📝

内容提要

本文介绍了基于React+Umi4+Three.js的3D模型数据可视化的开发过程。通过改变相机的位置实现视角切换,并使用补间动画库tween.js实现平滑过渡效果。同时,还介绍了使用CSS2DRenderer.js将HTML元素作为标签标注到三维场景中的方法。最后,还提到了模拟接口数据请求和交互功能设计的实现。

🔎

延伸解读

视角切换的平滑处理

文章通过改变相机位置实现视角切换,但直接跳变会显得突兀,因此引入tween.js补间动画库。在Viewer中初始化Tween并传入相机position,调用addCameraTween方法设置目标位置和时长,即可实现平滑过渡。注意在动画循环中必须调用TWEEN.update(),否则动画不会生效。

CSS2DRenderer标签的生成与更新

使用CSS2DRenderer将HTML元素作为标签标注到三维场景。核心步骤是创建CSS2DObject并设置其位置和名称,然后添加到场景。标签的显示隐藏由数据中的visible字段控制,当visible为false时从场景移除标签。在React中通过ref获取标签DOM,并在数据更新时重新生成标签。

状态管理与数据交互设计

由于需要频繁更新设备状态,文章采用useReducer管理设备数据,定义了INIT、ADD_DATA、OPERATE三种操作类型。通过Object.assign合并接口数据到模型对象,保留原有引用地址以便后续遍历。模拟接口返回设备报警信息,根据warn字段控制标签可见性和颜色变化,实现报警弹框提示。

交互事件与性能注意点

通过射线检测获取点击的模型对象,利用findParent找到对应的机架,然后更新状态控制标签显示。监听点击事件时需注意在数据更新后重新注册,避免重复监听。文章使用emitter.off先移除旧监听再添加,确保事件处理函数能访问最新的状态数据。

❓

Q&A

如何在React中实现3D模型的视角切换?

通过改变相机的位置实现视角切换,并使用tween.js库实现平滑过渡效果。

CSS2DRenderer.js在3D场景中有什么作用?

CSS2DRenderer.js可以将HTML元素作为标签标注到三维场景中,增强用户交互体验。

如何模拟接口数据请求以更新设备状态?

使用umi的mock功能模拟接口数据请求,通过POST请求更新设备状态。

如何使用射线检测获取模型信息?

通过射线检测获取模型信息,并使用世界坐标记录位置,以便进行视角切换。

如何管理设备数据状态以便频繁更新?

使用useReducer管理设备数据状态,可以有效处理频繁的状态更新。

如何实现设备报警时的弹框提示功能?

在设备数据更新时,检查报警状态并动态更新标签的可见性,以实现弹框提示功能。

🏷️

标签

➡️

继续阅读