当前位置: 首页 > 工具软件 > Draco > 使用案例 >

threejs中引入draco压缩后的模型

闻人冷勋
2023-12-01

threejs中引入draco压缩后的模型

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

这是码云的地址https://gitee.com/zmj66666/draco.git

一、通过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>

有不清楚的地方可以私信我

 类似资料: