Threejs中引入draco压缩后的模型

软件开发大郭
0 评论
/
52 阅读
/
5020 字
30 2022-11
分类:

threejs中引入draco压缩后的模型

draco是谷歌出的一款模型压缩工具,可将gltf格式的模型进行进一步压缩提高页面加载速的一种方法

一、通过Draco进行压缩

全局安装

npm install -g gltf-pipeline

压缩glb文件 -b表示输出glb格式, -d表示压缩

gltf-pipeline -i model.glb -b -d

压缩glb文件并将纹理图片分离出来

gltf-pipeline -i model.glb -b -d -t

更多参数查阅

gltf-pipeline -h

threejs中进行引用
首先在顶部引入"DRACOLoader",

import * as THREE from '../build/three.module.js'; 
import { GLTFLoader } from './jsm/loaders/GLTFLoader.js';
import { DRACOLoader } from './jsm/loaders/DRACOLoader.js';

在threejs中进行加载,在draco文件中找到draco_decoder.js

     // // 创建加载器
    var gltfLoader = new GLTFLoader();
    const dracoLoader = new DRACOLoader();
    // 在draco文件中找到draco_decoder.js这个文件,如果是vue直接放在项目的public下  的'./gltfdraco/'目录下面即可,这个路径主要是放draco的一些js文件的
    dracoLoader.setDecoderPath('./gltfdraco/'); //这个路径是放draco_decoder.js这个文件的
    dracoLoader.setDecoderConfig({ type: 'js' });
    dracoLoader.preload();
    gltfLoader.setDRACOLoader(dracoLoader);
    // 然后直接加载模型即可
    gltfLoader.load('./model/zhuji08-draco.glb',function(gltf){
        scene.add(group)
    })

下面是完整代码

// An highlighted block
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>three.js webgl - post processing - Outline Pass</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <link type="text/css" rel="stylesheet" href="main.css">
    </head>
    <body>
        <div id="container">
        </div>
        <script type="module">

        import * as THREE from '../build/three.module.js';

        import Stats from './jsm/libs/stats.module.js';
        // import { GUI } from './jsm/libs/dat.gui.module.js';

        import { OrbitControls } from './jsm/controls/OrbitControls.js';
        import { GLTFLoader } from './jsm/loaders/GLTFLoader.js';
        import { DRACOLoader } from './jsm/loaders/DRACOLoader.js';
           /**
         * 创建场景对象Scene
         */
        var scene = new THREE.Scene();
        /**
         * 光源设置
         */
        //点光源
        var point = new THREE.PointLight(0xffffff, 1);
        point.position.set(300, 1200, 300); //点光源位置
        scene.add(point); //点光源添加到场景中
        //环境光
        var ambient = new THREE.AmbientLight(0xcecece,1);
        ambient.position.set(0, 800, 0); //点光源位置
        scene.add(ambient);
        
        var width = window.innerWidth; //窗口宽度
        var height = window.innerHeight; //窗口高度
        /**透视投影相机对象*/
        var camera = new THREE.PerspectiveCamera(60, width / height, 1, 100000);
        console.log('相机',camera)
        camera.position.set(370, 60, 120); //设置相机位置
        camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
        //设置窗口自适应
        window.onresize=function(){
      // 重置渲染器输出画布canvas尺寸
          renderer.setSize(window.innerWidth,window.innerHeight);
          // 全屏情况下:设置观察范围长宽比aspect为窗口宽高比
          camera.aspect = window.innerWidth/window.innerHeight;
          // 渲染器执行render方法的时候会读取相机对象的投影矩阵属性projectionMatrix
          // 但是不会每渲染一帧,就通过相机的属性计算投影矩阵(节约计算资源)
          // 如果相机的一些属性发生了变化,需要执行updateProjectionMatrix ()方法更新相机的投影矩阵
          camera.updateProjectionMatrix ();

    
      // 创建加载器  DRACOLoader  重点
        var gltfLoader = new GLTFLoader();
        var group = new THREE.Group
        const dracoLoader = new DRACOLoader();
        // 设置解压路径,这个文件直接放在项目的public目录下面即可,后面会截图指明gltf目录所在位置
        dracoLoader.setDecoderPath('./gltfdraco/');
        dracoLoader.setDecoderConfig({ type: 'js' });
        dracoLoader.preload();
        gltfLoader.setDRACOLoader(dracoLoader);
        // 然后直接加载模型即可
        gltfLoader.load('./model/zhuji08-draco.glb',function(gltf){
            console.log(gltf)
            scene.add(gltf)
        })


        var renderer = new THREE.WebGLRenderer();
        renderer.setSize(width, height); //设置渲染区域尺寸
        renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
        document.body.appendChild(renderer.domElement); //body元素中插入canvas对象
        // 渲染函数
        function render() {
          renderer.render(scene, camera); //执行渲染操作
          scene.rotateY(0.00005);//每次绕y轴旋转0.01弧度
          requestAnimationFrame(render); //请求再次执行渲染函数render,渲染下一帧
        }
        render();
        let controls
        // //创建控件对象  相机对象camera作为参数   控件可以监听鼠标的变化,改变相机对象的属性
        controls = new OrbitControls( camera, renderer.domElement );
        </script>
    </body>
</html>
    暂无数据