第一种方法

npm install -g gltf-pipeline
gltf-pipeline -i 输入.glb -o 输出.glb -d -s
参数 说明
-i 输入路径
-o 输出路径
-b 将输入的gltf转为glb
-j 将输入的glb转为gltf
-s 编写单独的缓冲区、着色器和纹理
-t 只写出单独的纹理
-d 使用Draco压缩网格
–keepUnusedElements 保留未使用的材质、节点和网格
–draco.compressionLevel Draco 压缩级别 [0-10],大多数为 10,最小为 0

更多参数配置请参考:https://www.npmjs.com/package/gltf-pipeline

使用Draco压缩网格在three中的使用

import * as THREE from 'three';
import { onMounted } from "vue"
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";

onMounted(() => {
    const width = document.documentElement.clientWidth
    const height = document.documentElement.clientHeight

    // 创建3d场景
    const scene = new THREE.Scene()

    // 添加点光源
    const pointLight = new THREE.PointLight("#ffffff", 200, 200)
    pointLight.position.set(10, 10, 10)
    scene.add(pointLight)

    // 创建相机
    const camera = new THREE.PerspectiveCamera(45, width / height, 1, 1000)
    camera.position.z = 20
    camera.position.y = 10
    camera.position.x = 10

    // 创建一个GTLF加载器
    const loader = new GLTFLoader()
    const dracoLoader = new DRACOLoader()
    dracoLoader.setDecoderPath("/draco/")
    loader.setDRACOLoader(dracoLoader)
    // 加载
    loader.load("/drco.glb", (gltf) => {
        scene.add(gltf.scene)
    })

    // 创建渲染器
    const renderer = new THREE.WebGLRenderer({ antialias: true })
    // 调整渲染器大小
    renderer.setSize(width, height)
    // 添加动画
    renderer.setAnimationLoop(animate)
    document.querySelector('#canvas').appendChild(renderer.domElement)

    const controls = new OrbitControls(camera, renderer.domElement);

    // 动画函数
    function animate(time) {
        controls.update()
        renderer.render(scene, camera);

    }
})

其中dracoLoader.setDecoderPath("/draco/")这个需要引入draco的js文件路径,本来three中有,但是我不知道为什么成功不了,于是就把它单独提出了:

https://gitee.com/xiao-zhe-is-not-lazy/assets