threejs中引入draco压缩后的模型

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>

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

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是使用three.js进行模型贴图压缩的详细代码: 1. 导入必要的three.js库和压缩库 ```javascript <script src="https://cdn.bootcdn.net/ajax/libs/three.js/r128/three.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/three.js/r128/DDSLoader.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/three.js/r128/MTLLoader.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/three.js/r128/OBJLoader.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/three.js/r128/OrbitControls.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/three.js/r128/DRACOLoader.min.js"></script> ``` 2. 加载模型和纹理 ```javascript var loader = new THREE.OBJLoader(); var mtlLoader = new THREE.MTLLoader(); var ddsLoader = new THREE.DDSLoader(); var dracoLoader = new THREE.DRACOLoader(); mtlLoader.setPath('models/'); mtlLoader.load('model.mtl', function(materials) { materials.preload(); loader.setMaterials(materials); loader.setPath('models/'); loader.load('model.obj', function(object) { object.traverse(function(child) { if (child instanceof THREE.Mesh) { child.material.map = ddsLoader.load('textures/texture.dds'); child.material.map.minFilter = THREE.LinearFilter; child.material.map.magFilter = THREE.LinearFilter; child.material.map.anisotropy = 16; child.material.map.encoding = THREE.sRGBEncoding; } }); scene.add(object); }, function(xhr) { console.log((xhr.loaded / xhr.total * 100) + '% loaded'); }, function(error) { console.log('An error happened'); }); }, function(xhr) { console.log((xhr.loaded / xhr.total * 100) + '% loaded'); }, function(error) { console.log('An error happened'); }); ``` 3. 使用DRACO压缩模型 ```javascript dracoLoader.setDecoderPath('js/libs/draco/'); loader.setDRACOLoader(dracoLoader); loader.load('model.drc', function(object) { object.traverse(function(child) { if (child instanceof THREE.Mesh) { child.material.map = ddsLoader.load('textures/texture.dds'); child.material.map.minFilter = THREE.LinearFilter; child.material.map.magFilter = THREE.LinearFilter; child.material.map.anisotropy = 16; child.material.map.encoding = THREE.sRGBEncoding; } }); scene.add(object); }, function(xhr) { console.log((xhr.loaded / xhr.total * 100) + '% loaded'); }, function(error) { console.log('An error happened'); }); ``` 注意:使用DRACO压缩需要下载DRACO解码器并设置路径。 4. 渲染场景 ```javascript var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); var controls = new THREE.OrbitControls(camera, renderer.domElement); controls.enableDamping = true; controls.dampingFactor = 0.25; controls.enableZoom = true; camera.position.set(0, 0, 5); var animate = function() { requestAnimationFrame(animate); controls.update(); renderer.render(scene, camera); }; animate(); ``` 示例代码使用了DDS和DRACO格式进行压缩。DDS是一种常用的压缩纹理格式,可以提高加载速度和减少内存占用。DRACO是一种压缩模型格式,可以有效减小模型文件大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值