当前位置:   article > 正文

Three.js模型优化,减面压缩加载。_three.js 模型压缩

three.js 模型压缩

记录一下模型加载流程,因为要适配微信小程序,模型文件过大运行卡顿,需要常常修改模型文件,从blender 模型调整到加载过程中所需要的步骤。

1.模型文件比较精细的手动删除不需要部分,然后通过精简修改器减面操作,可最大限度压缩模型文件内存,对模型子 父集合调整好,动画调整到NLM通道,正常导出glb文件。

 

2.电脑切换NVM版本,我装啦两个版本

 一个高版本作为压缩模型所需,一个是为了配合vue版本打开。

输入d:回车进入D盘。在光标处输入 "cd 文件夹",按Enter就可以进入目标文件夹

 之前用的Draco压缩glb,比较好用,压缩后在chorm浏览器开发模式里面的子父物体集合也能和blender相对应,但是和小程序里不太适配,后改用EXT_meshopt_compression算法压缩glb,效果和Draco差不多,但是网格文件被压缩混乱,子父物体找不到,对后期找相应部件模块影响很大,只做展示或者其他方法也能用。

安装:

npm install -g gltfpack --registry=https://registry.npmmirror.com

 对模型文件压缩:

 gltfpack -i 起重机.glb -o tm-me1.glb -cc

 压缩后文件大小是:

 

加载代码

  1. const le = new GLTFLoader().setPath("models/gltf/").setMeshoptDecoder( MeshoptDecoder);
  2. le.load("tm-me2.glb", function (glb) {
  3. model = glb.scene;
  4. //maxX= model.position;
  5. // model.position.z = maxX;
  6. glb.scene.traverse(function (node) {
  7. if (node instanceof THREE.Mesh) {
  8. node.castShadow = true;
  9. }
  10. });
  11. parentObject = glb.scene
  12. const childObject = parentObject.getObjectByName("2");
  13. console.log(glb.scene);
  14. // matea = childObject.children[0].material.color;
  15. //console.log(childObject.children[0].material);
  16. mixer = new THREE.AnimationMixer(parentObject);
  17. childAnimation = glb.animations.find(
  18. (animation) => animation.name === "下移"
  19. );
  20. //执行播放动画
  21. mixer.clipAction(childAnimation).play();
  22. scene.add(glb.scene);
  23. document.body.addEventListener("touchmove", onPointerMove);
  24. document.body.addEventListener("mousemove", onPointerMove);
  25. render();
  26. });

 模型正常加载执行播放动画。

平行光改为环境光

  1. const dirLight = new THREE.AmbientLight(0xffffff, 2);
  2. dirLight.position.set(200, 200, 220);
  3. scene.add(dirLight);

平行光对后面新赋予材质有影响,或者是画布 renderer有影响,对无关代码进行注释

  1. renderer = new THREE.WebGLRenderer({ antialias: true });
  2. renderer.setPixelRatio(window.devicePixelRatio);
  3. renderer.setSize(window.innerWidth, window.innerHeight);
  4. // renderer.toneMapping = THREE.ACESFilmicToneMapping;
  5. // renderer.toneMappingExposure = 1;
  6. //renderer.outputEncoding = THREE.sRGBEncoding;
  7. // renderer.shadowMap.enabled = true;
  8. //软阴影
  9. // renderer.shadowMapSoft = true;
  10. //色调指 hdr明暗
  11. renderer.toneMappingExposure = 0.2;
  12. //阴影值
  13. // renderer.shadowDarkness = 1;
  14. //渲染大小
  15. //renderer.setSize(500, 320);
  16. container.appendChild(renderer.domElement);

背景色和HDR正常使用

  1. new RGBELoader()
  2. .setPath("textures/equirectangular/")
  3. .load("royal_esplanade_1k.hdr", function (texture, textureData) {
  4. texture.mapping = THREE.EquirectangularReflectionMapping;
  5. //scene.background = texture;
  6. //设置hdr贴图
  7. scene.environment = texture;
  8. scene.background = new THREE.Color(0xa0a0a0);
  9. scene.fog = new THREE.Fog(0xa0a0a0, 40, 200);
  10. //第二个数是范围 第三个数是浓度
  11. render();

模型材质重新赋予

  1. //加载起重机骨架
  2. const le1 = new GLTFLoader().setPath("models/gltf/").setMeshoptDecoder( MeshoptDecoder);
  3. le.load("tm-me1.glb", function (glb1) {
  4. glb1.scene.traverse(function (node) {
  5. if (node instanceof THREE.Mesh) {
  6. node.material = new THREE.MeshLambertMaterial({
  7. color: 0x004444,
  8. wireframe:false,
  9. transparent: true,
  10. opacity: 0.2,
  11. })
  12. // 模型边线设置
  13. const edges = new THREE.EdgesGeometry(node.geometry)
  14. const edgesMaterial = new THREE.LineBasicMaterial({
  15. color: 0xffffff ,
  16. })
  17. const line = new THREE.LineSegments(
  18. edges,
  19. edgesMaterial
  20. )
  21. node.add(line)
  22. //node.receiveShadow = true;
  23. }
  24. });

模型蓝色透明材质,加上白色边线。

代码顺序不是按照上下文,只是对几个影响效果的关键点做记录。最后看下效果

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号