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.第一、三人称漫游

  • 9.漫游-八叉树碰撞检测

    • 1. 八叉树Octree扩展库介绍
    • 2. 胶囊几何`Capsule.js`
    • 3. 八叉树与胶囊Capsule交叉计算
    • 4. 角色漫游(八叉树碰撞检测)
    • 5. 设置重力加速度(下坡、坠落)
      • 6. 简化碰撞体(提升八叉树计算性能)
    • 10.CannonJS物理引擎

    • Three.js进阶教程
    • 9.漫游-八叉树碰撞检测
    郭隆邦
    2025-03-24
    目录

    5. 设置重力加速度(下坡、坠落)

    # 设置重力加速度(下坡、坠落)

    上下课讲解了如何通过八叉树和胶囊碰撞体的计算,实现角色漫游上坡、上楼梯的功能。

    这节课给大家讲解角色模型下坡、下楼梯或者从高处落下的问题。

    # 判断人是否在站在物体表面

    判断人是否在站在物体表面,比如是否站在低面或斜坡上,有支撑

    const g = -9.8;//重力加速度
    let personOnFloor = true;//表示人在物体表面上是否有支撑
    function playerUpdate(deltaTime) {
        // 每次更新发生移动,随时碰撞检测
        const result = worldOctree.capsuleIntersect(capsule);
        if (result) {
            // 把交叉重合偏移回来
            capsule.translate(result.normal.multiplyScalar(result.depth));
            if (result.normal.y > 0) {
                //交叉方向y朝上,说明有支撑
                personOnFloor = true;
            }
        } else {
            personOnFloor = false;//没有任何交叉,说明悬空,无支撑
        }
    }    
    

    # 根据重力加速度计算y方向速度

    const g = -9.8;//重力加速度
    let personOnFloor = true;//表示人在物体表面上是否有支撑
    function playerUpdate(deltaTime) {
        ...
        ...
        if (personOnFloor) {
            v.y = 0;//y方向不管有无速度,直接归零
        }else {//不在地面上(或者说没有支撑面)
            // 根据重力加速控制玩家角色y方向速度
            v.y += g * deltaTime;
        }
    }    
    

    # 悬空没有地面或物体表面阻尼

    在实际生活中,人在在悬空状态下,没有地面明显的阻尼

    if(personOnFloor){//人在物体表面才有阻尼
        v.addScaledVector(v, damping);//阻尼减速
    }
    

    你可以通过测试,从高位置掉下来,悬空时候,是否考虑阻尼的下落差异。

    4. 角色漫游(八叉树碰撞检测)
    6. 简化碰撞体(提升八叉树计算性能)

    ← 4. 角色漫游(八叉树碰撞检测) 6. 简化碰撞体(提升八叉树计算性能)→

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