当前位置: 首页 > article >正文

Three.js实战:3D数据可视化入门与实践

Three.js实战3D数据可视化入门与实践前言大家好我是前端老炮儿。今天咱们来聊聊Three.js在数据可视化领域3D可视化正变得越来越重要。Three.js作为一个强大的3D库可以帮助我们轻松创建各种3D效果。今天我就带大家一起学习Three.js从基础到实战Three.js简介Three.js是一个基于WebGL的3D JavaScript库它简化了WebGL的复杂API让我们可以轻松创建3D场景、相机、灯光和几何体。核心特点简化WebGL提供简洁的API丰富的几何体内置多种3D几何体材质系统支持多种材质类型动画支持内置动画系统扩展丰富支持多种加载器和插件基础使用安装npm install three创建第一个3D场景import * as THREE from three const scene new THREE.Scene() const camera new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000) const renderer new THREE.WebGLRenderer() renderer.setSize(window.innerWidth, window.innerHeight) document.body.appendChild(renderer.domElement) const geometry new THREE.BoxGeometry() const material new THREE.MeshBasicMaterial({ color: 0x00ff00 }) const cube new THREE.Mesh(geometry, material) scene.add(cube) camera.position.z 5 function animate() { requestAnimationFrame(animate) cube.rotation.x 0.01 cube.rotation.y 0.01 renderer.render(scene, camera) } animate()核心概念1. 场景 (Scene)const scene new THREE.Scene() scene.background new THREE.Color(0xf0f0f0)2. 相机 (Camera)// 透视相机 const camera new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ) // 正交相机 const camera new THREE.OrthographicCamera( -width / 2, width / 2, height / 2, -height / 2, 0.1, 1000 )3. 渲染器 (Renderer)const renderer new THREE.WebGLRenderer({ antialias: true }) renderer.setSize(window.innerWidth, window.innerHeight) renderer.setPixelRatio(window.devicePixelRatio) document.body.appendChild(renderer.domElement)4. 几何体 (Geometry)// 立方体 const geometry new THREE.BoxGeometry(1, 1, 1) // 球体 const geometry new THREE.SphereGeometry(1, 32, 32) // 圆柱体 const geometry new THREE.CylinderGeometry(1, 1, 2, 32) // 自定义几何体 const geometry new THREE.BufferGeometry() const positions new Float32Array([ 0, 1, 0, -1, -1, 0, 1, -1, 0 ]) geometry.setAttribute(position, new THREE.BufferAttribute(positions, 3))5. 材质 (Material)// 基础材质 const material new THREE.MeshBasicMaterial({ color: 0x00ff00 }) // 兰伯特材质 const material new THREE.MeshLambertMaterial({ color: 0x00ff00 }) // 金属材质 const material new THREE.MeshMetalnessMaterial({ color: 0x00ff00, metalness: 0.8, roughness: 0.2 }) // 着色器材质 const material new THREE.ShaderMaterial({ vertexShader: void main() { gl_Position projectionMatrix * modelViewMatrix * vec4(position, 1.0); } , fragmentShader: void main() { gl_FragColor vec4(1.0, 0.0, 0.0, 1.0); } })6. 灯光 (Light)// 环境光 const light new THREE.AmbientLight(0xffffff, 0.5) scene.add(light) // 点光源 const light new THREE.PointLight(0xffffff, 1) light.position.set(5, 5, 5) scene.add(light) // 平行光 const light new THREE.DirectionalLight(0xffffff, 1) light.position.set(5, 5, 5) scene.add(light) // 聚光灯 const light new THREE.SpotLight(0xffffff, 1) light.position.set(5, 5, 5) scene.add(light)3D数据可视化实战案例13D柱状图function create3DBarChart(data) { const group new THREE.Group() const maxValue Math.max(...data) const spacing 2 const startX -(data.length - 1) * spacing / 2 data.forEach((value, index) { const height (value / maxValue) * 5 const geometry new THREE.BoxGeometry(1, height, 1) const material new THREE.MeshLambertMaterial({ color: new THREE.Color().setHSL(index / data.length, 0.7, 0.5) }) const cube new THREE.Mesh(geometry, material) cube.position.x startX index * spacing cube.position.y height / 2 cube.position.z 0 group.add(cube) }) return group } const data [10, 20, 30, 25, 15] const chart create3DBarChart(data) scene.add(chart)案例23D散点图function create3DScatterPlot(data) { const group new THREE.Group() data.forEach((point) { const geometry new THREE.SphereGeometry(0.1, 16, 16) const material new THREE.MeshLambertMaterial({ color: 0x3498db }) const sphere new THREE.Mesh(geometry, material) sphere.position.set(point.x, point.y, point.z) group.add(sphere) }) return group } const data [ { x: 1, y: 2, z: 3 }, { x: 2, y: 3, z: 1 }, { x: 3, y: 1, z: 2 } ] const plot create3DScatterPlot(data) scene.add(plot)案例33D曲面图function createSurfacePlot(width, height, func) { const geometry new THREE.ParametricGeometry(func, width, height) const material new THREE.MeshLambertMaterial({ color: 0x3498db, side: THREE.DoubleSide }) const mesh new THREE.Mesh(geometry, material) return mesh } function surfaceFunction(u, v, target) { const x (u - 0.5) * 10 const y Math.sin(x) * Math.cos(v * Math.PI * 2) * 2 const z (v - 0.5) * 10 target.set(x, y, z) } const surface createSurfacePlot(50, 50, surfaceFunction) scene.add(surface)动画与交互使用动画循环function animate() { requestAnimationFrame(animate) // 更新场景 scene.rotation.y 0.01 renderer.render(scene, camera) } animate()使用GSAP动画import gsap from gsap gsap.to(cube.rotation, { x: Math.PI * 2, y: Math.PI * 2, duration: 2, repeat: -1, ease: none })鼠标交互const raycaster new THREE.Raycaster() const mouse new THREE.Vector2() function onMouseClick(event) { mouse.x (event.clientX / window.innerWidth) * 2 - 1 mouse.y -(event.clientY / window.innerHeight) * 2 1 raycaster.setFromCamera(mouse, camera) const intersects raycaster.intersectObjects(scene.children, true) if (intersects.length 0) { const material new THREE.MeshLambertMaterial({ color: 0xff0000 }) intersects[0].object.material material } } window.addEventListener(click, onMouseClick)加载外部模型加载GLB/GLTF模型import { GLTFLoader } from three/addons/loaders/GLTFLoader.js const loader new GLTFLoader() loader.load(model.glb, (gltf) { scene.add(gltf.scene) }, (xhr) { console.log(${(xhr.loaded / xhr.total * 100)}% loaded) }, (error) { console.error(An error happened, error) })加载OBJ模型import { OBJLoader } from three/addons/loaders/OBJLoader.js const loader new OBJLoader() loader.load(model.obj, (object) { scene.add(object) })性能优化1. 使用实例化渲染const geometry new THREE.BoxGeometry(0.1, 0.1, 0.1) const material new THREE.MeshLambertMaterial({ color: 0x3498db }) const instancedMesh new THREE.InstancedMesh(geometry, material, 1000) const matrix new THREE.Matrix4() const color new THREE.Color() for (let i 0; i 1000; i) { matrix.setPosition( (Math.random() - 0.5) * 10, (Math.random() - 0.5) * 10, (Math.random() - 0.5) * 10 ) instancedMesh.setMatrixAt(i, matrix) color.setHSL(Math.random(), 0.7, 0.5) instancedMesh.setColorAt(i, color) } scene.add(instancedMesh)2. 使用LODconst lod new THREE.LOD() const geometry1 new THREE.BoxGeometry(1, 1, 1) const geometry2 new THREE.BoxGeometry(0.5, 0.5, 0.5) const geometry3 new THREE.BoxGeometry(0.25, 0.25, 0.25) const material new THREE.MeshLambertMaterial({ color: 0x3498db }) lod.addLevel(new THREE.Mesh(geometry1, material), 0) lod.addLevel(new THREE.Mesh(geometry2, material), 50) lod.addLevel(new THREE.Mesh(geometry3, material), 100) scene.add(lod)3. 启用阴影优化renderer.shadowMap.enabled true renderer.shadowMap.type THREE.PCFSoftShadowMap mesh.castShadow true mesh.receiveShadow true总结通过今天的学习我们了解了Three.js的基础和进阶用法核心概念场景、相机、渲染器、几何体、材质、灯光实战案例3D柱状图、散点图、曲面图动画交互动画循环、GSAP、鼠标交互模型加载GLB、OBJ模型加载性能优化实例化渲染、LOD、阴影优化Three.js是一个非常强大的3D库可以帮助我们创建各种精彩的3D数据可视化效果。希望今天的分享能帮助你入门Three.js最后给大家留个思考题在你的项目中如何使用Three.js实现复杂的3D数据可视化欢迎在评论区留言讨论

相关文章:

Three.js实战:3D数据可视化入门与实践

Three.js实战:3D数据可视化入门与实践 前言 大家好,我是前端老炮儿。今天咱们来聊聊Three.js! 在数据可视化领域,3D可视化正变得越来越重要。Three.js作为一个强大的3D库,可以帮助我们轻松创建各种3D效果。 今天我就带…...

城市交通网络信号的无模型自适应控制方法【附模型】

✨ 长期致力于城市交通网络信号控制、数据驱动控制、无模型自适应控制、无模型自适应预测控制、无模型自适应迭代学习控制、宏观基本图研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方…...

uView 2.0插件开发指南:如何扩展自定义组件与工具函数

uView 2.0插件开发指南:如何扩展自定义组件与工具函数 【免费下载链接】uView2.0 uView UI,是全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 项目地址: https://gitcode.com/gh_mirrors/uv/uVi…...

Stylis完全指南:掌握CSS嵌套、前缀和压缩的终极教程

Stylis完全指南:掌握CSS嵌套、前缀和压缩的终极教程 【免费下载链接】stylis light – weight css preprocessor 项目地址: https://gitcode.com/gh_mirrors/st/stylis Stylis是一款轻量级CSS预处理器,专注于提供高效的CSS嵌套、自动前缀添加和代…...

AI-Shoujo HF Patch完整安装教程:3步解锁游戏全部潜力

AI-Shoujo HF Patch完整安装教程:3步解锁游戏全部潜力 【免费下载链接】AI-HF_Patch Automatically translate, uncensor and update AI-Shoujo! 项目地址: https://gitcode.com/gh_mirrors/ai/AI-HF_Patch AI-Shoujo HF Patch是AI-Shoujo游戏玩家的必备增强…...

uView 2.0性能优化终极秘籍:按需引入与打包体积精简完整教程

uView 2.0性能优化终极秘籍:按需引入与打包体积精简完整教程 【免费下载链接】uView2.0 uView UI,是全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 项目地址: https://gitcode.com/gh_mirrors/…...

Windows系统Btrfs驱动终极指南:免费解锁Linux文件系统的强大功能

Windows系统Btrfs驱动终极指南:免费解锁Linux文件系统的强大功能 【免费下载链接】btrfs WinBtrfs - an open-source btrfs driver for Windows 项目地址: https://gitcode.com/gh_mirrors/bt/btrfs 想在Windows上体验Linux下一代文件系统的强大功能吗&#…...

3步解决微信红包难题:智能助手帮你告别手慢烦恼

3步解决微信红包难题:智能助手帮你告别手慢烦恼 【免费下载链接】WeChatLuckyMoney :money_with_wings: WeChats lucky money helper (微信抢红包插件) by Zhongyi Tong. An Android app that helps you snatch red packets in WeChat groups. 项目地址: https:/…...

乡村景区智慧垂钓破局增收!巨有科技激活乡村“渔乐”经济

垂钓作为国民级休闲活动,拥有超1.2亿爱好者,是乡村文旅中极具潜力的黄金业态。然而,多数乡村钓场仍停留在“一根竿、一个塘”的粗放运营阶段,面临计费混乱、管理成本高、体验同质化、增收乏力等困境。巨有科技聚焦乡村场景&#x…...

智能停车系统告别拥堵!巨有科技让景区停车畅行无忧

每逢节假日,景区停车场便成了“重灾区”——入口大排长龙、场内找位半小时、缴费排队苦不堪言。这不仅严重消耗游客耐心,更直接拉低景区口碑与运营效率。在文旅消费持续回暖的今天,停车体验已成为衡量景区服务力的关键指标。巨有科技以数据驱…...

免费开源鼠标连点器:5分钟上手跨平台自动化点击完整指南

免费开源鼠标连点器:5分钟上手跨平台自动化点击完整指南 【免费下载链接】MouseClick 🖱️ MouseClick 🖱️ 是一款功能强大的鼠标连点器和管理工具,采用 QT Widget 开发 ,具备跨平台兼容性 。软件界面美观 &#xff0…...

Windows热键冲突终极解决方案:Hotkey Detective帮你找回失窃的快捷键

Windows热键冲突终极解决方案:Hotkey Detective帮你找回失窃的快捷键 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective…...

原神帧率解锁终极指南:简单三步突破60FPS限制

原神帧率解锁终极指南:简单三步突破60FPS限制 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 原神帧率解锁工具是一款专门为《原神》PC玩家设计的开源工具,能够安…...

鸣潮自动化终极指南:5步实现后台智能挂机,解放你的游戏时间

鸣潮自动化终极指南:5步实现后台智能挂机,解放你的游戏时间 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves …...

防爆控制柜制造:从危险区域适配到电气安全的完整解析

一、什么是防爆控制柜制造?防爆控制柜制造,是指根据化工厂、石油化工、制药车间、喷涂车间、粉尘车间、油漆房、燃气站、危化品仓库、煤化工、粮食加工、木粉加工、新能源材料、电子化学品等存在爆炸性气体、蒸气或粉尘环境的场所需求,对防爆…...

非标系统控制柜制造:从特殊工况到定制控制的完整解析

一、什么是非标系统控制柜制造?非标系统控制柜制造,是指针对常规PLC控制柜、变频器控制柜、低压配电柜、防爆控制柜之外的特殊控制需求,根据设备工艺、现场环境、控制逻辑、通讯协议、安全要求和安装空间,对柜体结构、电气元件、控…...

3步快速上手:gmpublisher帮你轻松发布Garry‘s Mod工坊内容

3步快速上手:gmpublisher帮你轻松发布Garrys Mod工坊内容 【免费下载链接】gmpublisher ⚙️ Workshop Publishing Utility for Garrys Mod, written in Rust & Svelte and powered by Tauri 项目地址: https://gitcode.com/gh_mirrors/gm/gmpublisher 还…...

HarmonyOS 6 Chip 组件:不显示后缀图标使用文档

文章目录概述源码隐藏后缀图标核心实现原理1. 核心控制字段2. 双重隐藏条件3. 冗余回调说明组件配置解析总结概述 Chip组件后缀图标包含两类:系统默认关闭图标、自定义suffixIcon后缀图标。 通过组件配置项可统一关闭后缀图标展示,实现仅前缀图标文字的…...

如何将GIMP秒变Photoshop?GimpPs主题插件完整配置指南

如何将GIMP秒变Photoshop?GimpPs主题插件完整配置指南 【免费下载链接】GimpPs Gimp Theme to be more photoshop like 项目地址: https://gitcode.com/gh_mirrors/gi/GimpPs 如果你正在寻找一款能让GIMP拥有Photoshop般专业界面的主题插件,GimpP…...

中兴光猫工厂模式终极解锁工具:zteOnu完整指南

中兴光猫工厂模式终极解锁工具:zteOnu完整指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 你是否曾经因为中兴光猫的限制而感到束手无策?想要进行高级配置却…...

HarmonyOS 6 Chip 组件:设置默认后缀图标使用文档

文章目录代码默认后缀图标核心配置1. 启用默认关闭图标2. 显示优先级规则3. 关联配置项代码解析1. 启用默认后缀图标2. 不冲突条件3. 整体结构总结默认后缀图标即 Chip 内置关闭图标,由系统提供样式、尺寸、交互逻辑,无需配置图片资源,只需开…...

深度解析游戏资源加密机制:构建安全增强模块的完整实现

深度解析游戏资源加密机制:构建安全增强模块的完整实现 【免费下载链接】wuwa-mod Wuthering Waves pak mods 项目地址: https://gitcode.com/GitHub_Trending/wu/wuwa-mod WuWa-Mod作为《鸣潮》(Wuthering Waves)游戏模组开发项目,通过AES加密解…...

Android Studio中文界面全面配置指南:专业汉化解决方案

Android Studio中文界面全面配置指南:专业汉化解决方案 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack Android Studi…...

全面实战指南:如何高效部署ChatTTS-ui语音合成系统

全面实战指南:如何高效部署ChatTTS-ui语音合成系统 【免费下载链接】ChatTTS-ui 一个简单的本地网页界面,使用ChatTTS将文字合成为语音,同时支持对外提供API接口。A simple native web interface that uses ChatTTS to synthesize text into …...

Warcraft Helper:让经典魔兽争霸3在现代系统高效运行的智能解决方案

Warcraft Helper:让经典魔兽争霸3在现代系统高效运行的智能解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper Warcraft Helper是一款…...

AltStore技术深度解析:非越狱iOS侧载方案实战指南

AltStore技术深度解析:非越狱iOS侧载方案实战指南 【免费下载链接】AltStore AltStore is an alternative app store for non-jailbroken iOS devices. 项目地址: https://gitcode.com/gh_mirrors/al/AltStore 在iOS生态系统中,应用分发一直受到A…...

终极M3U8视频下载指南:5个技巧轻松掌握开源工具

终极M3U8视频下载指南:5个技巧轻松掌握开源工具 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 想要下载在线视频却总是失败?面对M3U8格式束手无策&#x…...

为Claude Code配置Taotoken作为稳定后备API解决封号与Token不足痛点

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为Claude Code配置Taotoken作为稳定后备API解决封号与Token不足痛点 对于频繁使用Claude Code进行编程辅助的开发者而言&#xff0…...

cann/asc-devkit寄存器向量计算实践

Reg Vector Compute Practices Example Introduction 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发…...

Preboot 网格系统完全教程:如何构建响应式布局而不依赖框架

Preboot 网格系统完全教程:如何构建响应式布局而不依赖框架 【免费下载链接】preboot A collection of LESS mixins and variables for writing better CSS. 项目地址: https://gitcode.com/gh_mirrors/pr/preboot 想要构建响应式网站布局但不想依赖笨重的CS…...