news 2026/6/27 23:05:18

Three.js 模型拆解动画教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Three.js 模型拆解动画教程

模型拆解动画 ·Model Unpack· ▶ 在线运行案例

  • 案例合集:三维可视化功能案例(threehub.cn)
  • 开源仓库github地址:https://github.com/z2586300277/three-cesium-examples
  • 400个案例代码:网盘链接

你将学到什么

  • OrbitControls 相机轨道交互
  • glTF/Draco 模型加载与优化
  • GSAP 时间轴与补间动画
  • requestAnimationFrame渲染循环与resize自适应

效果说明

本案例演示模型拆解动画效果:基于 WebGL 实现「模型拆解动画」可视化效果,附完整可运行源码;核心用到 OrbitControls、glTF/Draco、GSAP。建议先打开文首在线案例查看动态画面,再对照下方源码逐步理解。

核心概念

  • Scene / Camera / WebGLRenderer构成最小渲染闭环;大场景可开logarithmicDepthBuffer缓解 Z-fighting。
  • OrbitControls提供轨道旋转/缩放;开启enableDamping后需在 animate 中controls.update()
  • 阅读下方完整源码时,建议从init/load/animate三条主线入手,再深入 shader 与工具函数。

实现步骤

  • 搭建 Scene、PerspectiveCamera、WebGLRenderer,挂载 canvas 并处理resize
  • 异步加载模型 / 3D Tiles / GeoJSON 等资源并加入 scene 或 entities
  • 创建 OrbitControls(及 Raycaster 等交互控件,若源码包含)
  • 在定时器或 GSAP 时间轴中更新 uniform / 变换,驱动特效播放
  • requestAnimationFrame循环中更新状态并 render(Cesium 为viewer.render或自动渲染)
  • 代码要点

    import * as THREE from 'three'

    import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js' import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js' import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js' import * as dat from 'dat.gui' import gsap from 'gsap'

    const box = document.getElementById('box')

    const scene = new THREE.Scene()

    const camera = new THREE.PerspectiveCamera(75, box.clientWidth / box.clientHeight, 0.1, 1000)

    camera.position.set(5, 5, 5)

    const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, logarithmicDepthBuffer: true })

    renderer.setSize(box.clientWidth, box.clientHeight)

    box.appendChild(renderer.domElement)

    new OrbitControls(camera, renderer.domElement)

    window.onresize = () => {

    renderer.setSize(box.clientWidth, box.clientHeight)

    camera.aspect = box.clientWidth / box.clientHeight

    camera.updateProjectionMatrix()

    }

    animate()

    function animate() {

    requestAnimationFrame(animate)

    renderer.render(scene, camera)

    }

    scene.add(new THREE.AmbientLight(0xffffff, 1))

    const pointLight = new THREE.PointLight(0xffffff, 1.5, 0, 2)

    pointLight.position.set(5, 5, 5)

    scene.add(pointLight)

    const directionalLight = new THREE.DirectionalLight(0xffffff, 2)

    directionalLight.position.set(-5, 5, -5)

    scene.add(directionalLight)

    scene.add(new THREE.AxesHelper(1000))

    let group

    // 加载模型 gltf/ glb draco解码器 const loader = new GLTFLoader()

    loader.setDRACOLoader(new DRACOLoader().setDecoderPath(FILE_HOST + 'js/three/draco/'))

    loader.load(

    HOST + '/files/model/car.glb',

    gltf => {

    group = gltf.scene

    const box = new THREE.Box3().setFromObject(group);

    const center = new THREE.Vector3();

    box.getCenter(center);

    group.center = center

    group.traverse((child) => {

    if (child.isMesh) {

    child.localToWorld(child.position) //转为世界坐标

    child.startPoisition = child.position.clone()

    }

    })

    scene.add(group)

    }

    )

    // 拆解 const mergeHandle = (model) => {

    const distance = () => Math.random() > 0.5 ? 1.5 : -1.5

    model.traverse((child) => {

    if (child.startPoisition) {

    const v1 = distance()

    const v2 = distance()

    const v3 = distance()

    gsap.to(child.position, { x: child.startPoisition.x + v1, y: child.startPoisition.y + v2, z: child.startPoisition.z + v3, duration: 1, ease: 'power2.inOut' })

    }

    }); };

    const gui = new dat.GUI()

    gui.add({

    '拆解动画': () => {

    mergeHandle(group) }

    }, '拆解动画')

    gui.add({

    '还原动画': () => {

    group.traverse((child) => {

    if (child.startPoisition) {

    gsap.to(child.position, { x: child.startPoisition.x, y: child.startPoisition.y, z: child.startPoisition.z, duration: 1, ease: 'power2.inOut' })

    }

    });

    }

    }, '还原动画')

    完整源码:GitHub

    小结

    • 本文提供模型拆解动画完整 Three.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/27 22:58:08

折戟四年后再冲科创板,云洲智能拟募资18.18亿,真格“5折出清”

云洲智能重启IPO,拟募资18.18亿6月24日,无人船艇研发商珠海云洲智能科技股份有限公司向上交所递交招股书,拟募资18.18亿元在科创板IPO,相较于上次申请提高2.68亿元。此次IPO,云洲智能拟将8.31亿元用于高性能无人艇产业…

作者头像 李华
网站建设 2026/6/27 22:52:18

DGCNN RTL 构建注意事项

基于 DGCNN FPGA 加速器项目的实际踩坑记录,N=1024, K=20, float32, VU47P 1. 数据准备 1.1 测试数据生成 数据集非确定性陷阱:ShapeNetPartDataset 每次实例化返回不同样本顺序。必须在同一次 dataset 实例化中同时生成 test_points 和 test_expected。 # ✅ 正确:同一次…

作者头像 李华
网站建设 2026/6/27 22:48:00

找注塑模具加工厂,亲测哪家性价比高?

找注塑模具加工厂,亲测哪家性价比高?大家好,我是你们的老朋友,专注于注塑模具领域多年。今天给大家分享一下我最近找注塑模具加工厂的经历,希望能帮到有需要的朋友。一、痛点共鸣在选择注塑模具加工厂时,我…

作者头像 李华
网站建设 2026/6/27 22:42:45

Maven在IDEA中的配置

注意1:Maven版本与IDEA版本需要一一对应,不可随意下载 注意2:每个IDEA中都内置Maven,但是这里还是需要下载,原因为: 1. 终端 / 命令行单独执行 mvn 命令(最常用理由) 内置 Maven …

作者头像 李华