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.漫游-八叉树碰撞检测
    郭隆邦
    2023-09-28
    目录

    2. 胶囊几何Capsule.js

    # 胶囊几何Capsule.js

    上节课给大家介绍了八叉树扩展库Octree.js。

    const worldOctree = new Octree();
    const gltf = await loader.loadAsync("../地形.glb");
    worldOctree.fromGraphNode(gltf.scene);
    

    下面给大家介绍胶囊扩展库Capsule.js,Capsule表示胶囊形状的几何体,具体说就是上面一个半球、中间一个圆柱、下面一个半球拼接构成的胶囊形状几何体。

    胶囊capsule

    # 项目引入胶囊碰撞体Capsule.js

    Three.js在目录/examples/jsm/math/下提供了一个胶囊形状的几何体Capsule.js。

    npm安装threejs情况下,Capsule.js扩展库引入路径。

    // 引入/examples/jsm/math/目录下胶囊扩展库Capsule.js
    import { Capsule } from 'three/examples/jsm/math/Capsule.js';
    

    本课程案例源码.html里面自定义了新的路径。

    import { Capsule } from 'three/addons/math/Capsule.js';
    

    # 创建胶囊几何体

    创建胶囊几何体:让胶囊底部半球与y=0的平面刚好相切即可。

    const R = 0.4;//胶囊半径
    const H = 1.7;//胶囊总高度
    const start = new THREE.Vector3(0, R, 0);//底部半球球心坐标
    const end = new THREE.Vector3(0, H - R, 0);//顶部半球球心坐标
    const capsule = new Capsule(start, end, R);
    

    胶囊capsule

    log打印capsule,你可以看到胶囊的两个属性.start和.end。

    console.log('capsule', capsule);
    

    # 练习:Mesh可视化上面胶囊几何体

    const geometry = new THREE.CapsuleGeometry(R, H - 2 * R, 16, 16);
    const material = new THREE.MeshLambertMaterial({ 
        color: 0x00ffff
    });
    const capsuleMesh = new THREE.Mesh(geometry, material);
    

    CapsuleGeometry默认胶囊中心位于坐标原点,与上面Capsule位置有偏差,需要平移。

    geometry.translate(0,H/2,0);
    

    # 平移胶囊几何体

    平移胶囊碰撞体,使底部半球球心.start与坐标原点重合。

    平移胶囊

    capsule.translate(new THREE.Vector3(0, -R, 0));
    

    capsule.translate()本质上改变就是自身的.start和.end属性

    // 查看平移后的胶囊,`.start`和`.end`属性
    console.log('capsule', capsule);
    

    可视化胶囊的模型对象同步平移

    capsuleMesh.position.y -= R;
    

    换一种平移方式,同步capsuleMesh与capsule的位置。

    因为capsule没有.position属性,所以可以复制.start或.end属性,然后capsuleMesh的y方向偏移即可。

    capsuleMesh.position.copy(capsule.start);
    capsuleMesh.position.y -= R;
    
    capsuleMesh.position.copy(capsule.end)
    capsuleMesh.position.y -= (H-R);
    
    1. 八叉树Octree扩展库介绍
    3. 八叉树与胶囊Capsule交叉计算

    ← 1. 八叉树Octree扩展库介绍 3. 八叉树与胶囊Capsule交叉计算→

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