Three.js中文网 Three.js中文网
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
Web3D系统课程视频
  • 0.学前说明

  • 1.Three.js快速入门

  • 2.几何体BufferGeometry

  • 3.模型对象、材质

  • 4.层级模型

  • 5.顶点UV坐标、纹理贴图

  • 6.加载外部三维模型(gltf)

  • 7.PBR材质与纹理贴图

  • 8.渲染器和前端UI界面

  • 9.生成曲线、几何体

  • 10.相机基础

  • 11.光源和阴影

  • 12.精灵模型Sprite

  • 13.后处理EffectComposer

  • 14.射线拾取模型

  • 15.场景标注标签信息

  • 16.关键帧动画

    • 1. 关键帧动画
    • 2. 动画播放(暂停、倍速、循环)
    • 3. 动画播放(拖动任意时间状态)
    • 4. 解析外部模型关键帧动画
    • 5. 机械虚拟装配案例(播放)
    • 6. 虚拟装配(任意时间定位)
    • 7. 变形动画原理
    • 8. 变形动画(定制人物胖瘦)
      • 9. 骨骼关节Bone
      • 10. 查看外部模型骨骼动画
      • 11. 骨骼动画不同动作切换
    • 17.动画库tween.js

    • Three.js教程
    • 16.关键帧动画
    郭隆邦
    2023-03-24
    目录

    8. 变形动画(定制人物胖瘦)

    # 变形动画(定制人物胖瘦)

    下面给大家演示一个变形动画的应用例子,先通过三维建模生成几何体的变形目标顶点数据,不用创建关键帧动画,然后通过拖动条,控制变形目标权重系数,控制人物形象的胖瘦。

    # 查看模型几何体变形相关信息

    查看Blender软件中几何体变形信息,可以通过形态键调节查看测试效果。

    课件代码浏览器控制打印人物模型,可以看到,有几何体的变形目标顶点数据,但是没有通过关键帧动画设置模型的变形动画效果。

    loader.load("../人.glb", function (gltf) {
        console.log('控制台查看gltf对象结构', gltf);
        model.add(gltf.scene);
        // 访问人体网格模型
        const mesh = gltf.scene.children[0]; 
        // 获取所有变形目标的顶点数据
        const tArr = mesh.geometry.morphAttributes.position
        console.log('所有变形目标', tArr);
        console.log('所有权重', mesh.morphTargetInfluences);
        //每个变形目标对应的含义(注意和变形目标对应起来)
        const nameArr = ['变胖', '丰乳肥臀', '增肌', '年龄', '变瘦'];
    })
    

    # UI界面定制人胖瘦体型

    人物模型有多个变形目标,下面随机选择了两个设置拖动条控制变形目标对应的权重系数。

    import {GUI} from 'three/addons/libs/lil-gui.module.min.js';
    const gui = new GUI();
    const obj = {
        t0: 0,
        t1: 0,
    }
    gui.add(obj, 't0', 0, 1).name('变胖').onChange(function (v) {
        mesh.morphTargetInfluences[0] = v;
    });
    gui.add(obj, 't1', 0, 1).name('丰乳肥臀').onChange(function (v) {
        mesh.morphTargetInfluences[1] = v;
    });
    

    # 批量设置所有变形目标的拖动条

    import {GUI} from 'three/addons/libs/lil-gui.module.min.js';
    const mesh = gltf.scene.children[0]; // 访问人体网格模型
    // 获取所有变形目标的顶点数据
    const tArr = mesh.geometry.morphAttributes.position
    // 每个变形目标对应的含义(注意和变形目标对应起来)
    const nameArr = ['变胖', '丰乳肥臀', '增肌', '年龄', '变瘦'];
    // GUI拖动条可视化改变变形目标权重系数
    const obj = {};
    const gui = new GUI();
    for (let i = 0; i < tArr.length; i++) {
        obj['t' + i] = 0;//obj批量定义一个属性表示变性目标的权重系数
        // 批量设置要改变的obj属性,对应name名字,和对应权重
        gui.add(obj, 't' + i, 0, 1).name(nameArr[i]).onChange(function (v) {
            mesh.morphTargetInfluences[i] = v;
        });
    }
    

    # 外部模型变形数据生成动画

    loader.load("../人.glb", function (gltf) {
        const mesh = gltf.scene.children[0];
        // 创建变形动画权重系数的关键帧数据
        mesh.name = "per"; //关键帧动画控制的模型对象命名
        // 设置变形目标1对应权重随着时间的变化
        const KF1 = new THREE.KeyframeTrack('per.morphTargetInfluences[0]', [0, 5], [0, 1]);
        // 生成关键帧动画
        const clip = new THREE.AnimationClip("t", 5, [KF1]);
    
    
        //包含关键帧动画的模型作为参数创建一个播放器
        const mixer = new THREE.AnimationMixer(gltf.scene);
        const clipAction = mixer.clipAction(clip);
        clipAction.play();
    
        const clock = new THREE.Clock();
        function loop() {
            requestAnimationFrame(loop);
            const frameT = clock.getDelta();
            // 更新播放器相关的时间
            mixer.update(frameT);
        }
        loop();
    })
    
    7. 变形动画原理
    9. 骨骼关节Bone

    ← 7. 变形动画原理 9. 骨骼关节Bone→

    Theme by Vdoing | Copyright © 2016-2025 豫ICP备16004767号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式