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.向量点乘、叉乘

    • 1. 向量点乘dot
    • 2. 点乘练习-计算三角形夹角
    • 3. 点乘判断物体在人前或人后
    • 4. 点乘判断是否在扇形内
    • 5. 向量叉乘cross
    • 6. 叉乘判断人左右
    • 7. 点乘判断平行向量方向异同
    • 8. 判断两个点是否在线段同一侧
    • 9. 叉乘计算三角形法线
    • 10. 叉乘计算三角形面积
    • 11. 练习—计算物体的表面积
      • 12. 点到直线的距离
    • 4.四元数、欧拉角(角度姿态)

    • 5.矩阵

    • 6.射线

    • 7.包围盒

    • 8.第一、三人称漫游

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

    • 10.CannonJS物理引擎

    • Three.js进阶教程
    • 3.向量点乘、叉乘
    郭隆邦
    2023-06-11
    目录

    11. 练习—计算物体的表面积

    # 练习—计算物体的表面积

    你可以尝试利用上节课的三角形面积公式,计算一个网格模型几何体Geometry的表面积。

    # 知识点回顾:三角形面积

    叉乘.cross()和.length()计算三角形面积公式

    const a = p2.clone().sub(p1);
    const b = p3.clone().sub(p1);
    const c = a.clone().cross(b);
    const S = 0.5*c.length();// 三角形面积
    

    # 知识点回顾:网格模型的三角形

    几何体BufferGeometry结构:http://www.webgl3d.cn/pages/32785a/

    网格模型Mesh其实就一个一个三角形拼接构成,这意味着,我们可以通过计算Mesh所有三角形面积,然后累加,就可以获取模型的表面积。

    下面用一个立方体给大家进行测试验证,实际开发,你也可以从外部加载模型。几何体结构分为两种情况,一种有顶点索引index数据,一种没有,整体思路相同,只是注意获取顶点位置数据的语法细节不同。

    # Geometry有顶点索引数据

    //三角形面积计算
    function AreaOfTriangle(p1, p2, p3) {
        // 三角形两条边构建两个向量
        const a = p2.clone().sub(p1);
        const b = p3.clone().sub(p1);
        // 两个向量叉乘结果c的几何含义:a.length()*b.length()*sin(θ)
        const c = a.clone().cross(b);
        // 三角形面积计算
        const S = 0.5 * c.length();
        return S
    }
    

    获取模型对象所有的三角形,分别计算某个三角形对应的面积,然后所有三角形面积累加,就可以获取模型的表面积。

    const pos = geometry.attributes.position;
    const index = geometry.index;
    console.log('geometry',geometry);
    let S = 0;//表示物体表面积
    for (var i = 0; i < index.count; i += 3) {
        // 获取当前三角形对应三个顶点的索引
        const i1 = index.getX(i);
        const i2 = index.getX(i + 1);
        const i3 = index.getX(i + 2);
    
        //获取三个顶点的坐标 
        const p1 = new THREE.Vector3(pos.getX(i1), pos.getY(i1), pos.getZ(i1));
        const p2 = new THREE.Vector3(pos.getX(i2), pos.getY(i2), pos.getZ(i2));
        const p3 = new THREE.Vector3(pos.getX(i3), pos.getY(i3), pos.getZ(i3));
        S += AreaOfTriangle(p1, p2, p3); 
    }
    console.log('S',S);
    
    //三角形面积计算
    function AreaOfTriangle(p1, p2, p3) {
        // 三角形两条边构建两个向量
        const a = p2.clone().sub(p1);
        const b = p3.clone().sub(p1);
        // 两个向量叉乘结果c的几何含义:a.length()*b.length()*sin(θ)
        const c = a.clone().cross(b);
        // 三角形面积计算
        const S = 0.5 * c.length();
        return S
    }
    

    # Geometry没有顶点索引数据

    Geometry没有顶点索引数据,直接从顶点位置属性获取每间隔三个点作为一个三角形数据。

    const pos = geometry.attributes.position;
    let S = 0;//表示物体表面积
    for (let i = 0; i < pos.count; i += 3) {
        const p1 = new THREE.Vector3(pos.getX(i), pos.getY(i), pos.getZ(i));
        const p2 = new THREE.Vector3(pos.getX(i + 1), pos.getY(i + 1), pos.getZ(i + 1));
        const p3 = new THREE.Vector3(pos.getX(i + 2), pos.getY(i + 2), pos.getZ(i + 2));
        S += AreaOfTriangle(p1, p2, p3);//所有三角形面积累加
    }
    console.log('S', S);
    //三角形面积计算
    function AreaOfTriangle(p1, p2, p3) {
        // 三角形两条边构建两个向量
        const a = p2.clone().sub(p1);
        const b = p3.clone().sub(p1);
        // 两个向量叉乘结果c的几何含义:a.length()*b.length()*sin(θ)
        const c = a.clone().cross(b);
        // 三角形面积计算
        const S = 0.5 * c.length();
        return S;
    }
    
    10. 叉乘计算三角形面积
    12. 点到直线的距离

    ← 10. 叉乘计算三角形面积 12. 点到直线的距离→

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