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系统课程视频
  • 1. 数学几何计算基础

  • 2.位移、速度、加速度(向量)

  • 3.向量点乘、叉乘

  • 4.四元数、欧拉角(角度姿态)

  • 5.矩阵

  • 6.射线

  • 7.包围盒

  • 8.第一、三人称漫游

    • 1. 键盘WASD按键状态记录
    • 2. W键控制角色模型运动
    • 3. 加速度(按键给玩家加速)
    • 4. 阻尼(玩家角色逐渐减速停止)
      • 5. 按键S退后运动
      • 6. 相机跟着玩家走(第三人称漫游)
      • 7. 鼠标左右拖动改变玩家视角
      • 8. 获取玩家(相机)正前方方向
      • 9. 鼠标上下移动只改变相机视角
      • 10. 玩家角色左右运动(叉乘)
      • 11. 鼠标滑动改变视角(指针锁定模式)
      • 12. 快捷键切换第一、第三人称
      • 13. 骨骼动画与运动状态关联
    • 9.漫游-八叉树碰撞检测

    • 10.CannonJS物理引擎

    • Three.js进阶教程
    • 8.第一、三人称漫游
    郭隆邦
    2023-09-03
    目录

    4. 阻尼(玩家角色逐渐减速停止)

    # 阻尼(玩家角色逐渐减速停止)

    继续上节课内容讲解,上节课以W键为例,给大家讲解了怎么通过WASD按键,给玩家角色模型加速,本节课给大家讲解,怎么设置阻尼,具体说,就是当没有WASD按键加速时候,玩家角色模型,会在阻尼作用下逐渐减速停止,就像地面上滚动的球逐渐停下来。

    if (keyStates.W) {
        //先假设W键对应运动方向为z
        const front = new THREE.Vector3(0,0,1);
        // W键按下时候,速度随着时间增加
        v.add(front.multiplyScalar(a * deltaTime));
        // 在间隔deltaTime时间内,玩家角色位移变化计算(速度*时间)
        const deltaPos = v.clone().multiplyScalar(deltaTime);
        player.position.add(deltaPos);//更新玩家角色的位置
    }
    

    # 设置阻尼减速

    大家可以思考下,当你没有按下WASD的时候,怎么给运动的物体减速。

    其实很简单,可以在渲染循环中,重复执行速度v乘以一个小于1的数值,这样重复多次执行以后,速度就会逼近0。比如v* (1 - 0.04) = v * 0.96,多次循环乘以0.96(v*0.96*0.96*0.96...),v就会无限逼近于0。

    const damping = -0.04;
    function render() {
        if (keyStates.W) {
            ...
        }
        // v*(1 + damping) = v* (1 - 0.04) = v * 0.96
        // 多次循环乘以0.96(v*0.96*0.96*0.96...),v就会无限逼近于0。
        // v*(1 + damping) = v + v * damping
        v.addScaledVector(v, damping);//阻尼减速
    
        requestAnimationFrame(render);
    }
    

    # 验证阻尼是否生效

    把if (keyStates.W){}里面玩家角色位置更新的代码,挪到外面,你可以发现,当按键W松开,玩家角色会慢慢停下来,原因很简单,虽然一直在执行速度*时间更新玩家位置,但是在阻尼作用下,速度慢慢逼近0了,位移变化量自然逼近0。

    // 用三维向量表示玩家角色(人)运动漫游速度
    const v = new THREE.Vector3(0, 0, 0);//初始速度设置为0
    const a = 12;//WASD按键的加速度:调节按键加速快慢
    const damping = -0.04;//阻尼 当没有WASD加速的时候,人、车等玩家角色慢慢减速停下来
    // 渲染循环
    const clock = new THREE.Clock();
    function render() {
        const deltaTime = clock.getDelta();
        if (keyStates.W) {
            //先假设W键对应运动方向为z
            const front = new THREE.Vector3(0, 0, 1);
            if (v.length() < 5) {//限制最高速度
                // W键按下时候,速度随着时间增加
                v.add(front.multiplyScalar(a * deltaTime));
            }
        }
    
        // 阻尼减速
        v.addScaledVector(v, damping);
    
        //更新玩家角色的位置  当v是0的时候,位置更新也不会变化
        const deltaPos = v.clone().multiplyScalar(deltaTime);
        player.position.add(deltaPos);
    
        mixer.update(deltaTime);
        renderer.render(scene, camera);
        requestAnimationFrame(render);
    }
    render();
    
    3. 加速度(按键给玩家加速)
    5. 按键S退后运动

    ← 3. 加速度(按键给玩家加速) 5. 按键S退后运动→

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