Threejs中导入GLTF模型克隆后合并

简介: 这篇文章详细说明了在Three.js中如何导入GLTF模型,对其进行克隆,并将多个克隆模型合并成一个整体模型的过程。

很多场景中会需要同一个模型很多次,但是如果多次加载同一个模型会占用很高的带宽,导致加载很慢,因此就需要使用clone,也就是加载一个模型后,其他需要使用的地方使用clone的方式复制出多个同样的模型,再改变复制出来的模型位置,达到一次加载,多次使用。但另一个情况是克隆的模型是新的模型,在threejs的场景中是一个完整独立的,具有一个正常模型所有的属性,很大,加载和渲染需要花费很多的时间,那么就又需要对克隆出的模型进行合并,成为一个整体的模型放到threejs的场景中。

首先我们需要搭建一个threejs的场景,包括相机,灯光,渲染器等,这里为了方便看合并后的效果,再添加上State性能监视器。其他的场景搭建之前章节中都已存在这里就不贴代码了。性能监视器的代码如下

import Stats from 'three/addons/libs/stats.module.js';

this.stats = new Stats();
document.body.appendChild(this.stats.domElement);

然后加载一个模型,我这里使用一个料箱模型作为演示的模型。

    initModel(){
      const loader = new GLTFLoader()
      loader.load("/static/models/box.glb", (gltf) => {
        this.scene.add(gltf.scene)
      })
    },

然后开始clone料箱。先clone1000个,并修改每个料箱的位置,此时发现threejs渲染已经非常吃力,FPS已经掉帧到12了。

initModel(){
      const loader = new GLTFLoader()
      loader.load("/static/models/box.glb", (gltf) => {
        let originaMesh = gltf.scene.children[0];
        for (let i = 0; i < 100; i++) {
          for (let j = 0; j < 10; j++) {
            for (let k = 0; k < 10; k++) {
              let mesh = originaMesh.clone()
              mesh.position.set(i*6,j*6,k*10);
              this.scene.add(mesh)
            }
          }
        }
      })
    },

然后我们开始模型合并,模型合并其实就是将每个模型的geometry克隆出来,放到一个集合中,最终把这个集合渲染为一个整体的大模型。

initModel(){
      const loader = new GLTFLoader()
      loader.load("/static/models/box.glb", (gltf) => {
        this.scene.add(gltf.scene)
        let meshArr = []
        let originaMesh = gltf.scene.children[0];
        for (let i = 0; i < 100; i++) {
          for (let j = 0; j < 10; j++) {
            for (let k = 0; k < 10; k++) {
              let mesh = originaMesh.clone()
              mesh.position.set(i*6,j*6,k*10);
              mesh.updateMatrixWorld(true);
              const geometry = mesh.geometry.clone();
              geometry.applyMatrix4(mesh.matrixWorld);
              meshArr.push(geometry)
            }
          }
        }
        const bayGeometry = mergeGeometries(meshArr,true);
        const material = new THREE.MeshStandardMaterial({ color: '#0000FF' });
        const totalMesh = new THREE.Mesh(bayGeometry, material);
        totalMesh.name="大模型"
        this.scene.add(totalMesh);
      })
    },

最终通过模型合并,1000个料箱同时展示,FPS又回到了60,因为对于threejs来讲,只有一个模型了,渲染也是一次成型。

如果有疑问或者需要源码可以给我留言。

相关文章
Threejs实现相机视角切换,平滑过渡,点击模型切换到查看模型视角
Threejs实现相机视角切换,平滑过渡,点击模型切换到查看模型视角
2880 0
Threejs实现相机视角切换,平滑过渡,点击模型切换到查看模型视角
Threejs实现下雨,下雪,阴天,晴天,火焰
Threejs实现下雨,下雪,阴天,晴天,火焰
2818 0
Threejs实现下雨,下雪,阴天,晴天,火焰
Threejs实现模拟河流,水面水流,水管水流,海面
Threejs实现模拟河流,水面水流,水管水流,海面
3721 0
Threejs实现模拟河流,水面水流,水管水流,海面
|
数据可视化 定位技术
three.js实现烟雾缭绕效果
前言 大家好!我是Fly哥,最近接广告的接的有点多, 感谢大家还是一如既往的支持我!respect, 前几天我在朋友圈分享了一个烟雾缭绕的效果。很多小伙伴都表示非常感兴趣,有的同学说用到了噪声, 有的同学说用到了着色器,还有更过分说用到了ps, 胖虎竟然无语凝噎。其实都是就是简单的贴图。配合一点想象力。我们先看下效果: 然后我就发了一条朋友圈,问这个像什么?? 有的说 云层, 有的说云墨,有的说雾霭, 其实都不是, 我想做的是烟雾。好的话不不多说!, 本篇文章阅读大概5分钟。不耽误大家太多时间,主要是介绍思路, 说太多也没啥意义。如果你对three.js 还没有一点了解都没有,
three.js实现烟雾缭绕效果
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
2113 0
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
ThreeJs添加拖动辅助线
这篇文章介绍了在Three.js中使用TransformControls组件来添加拖动辅助线,实现对3D模型在不同轴向上进行直观的拖动和平移操作。
645 0
|
容器
ThreeJs同一个场景多个相机的显示
这篇文章讲解了如何在Three.js中实现多相机功能,通过创建和布置多个相机及渲染器,从而能够在同一场景中从不同角度观察3D模型。
406 1
|
开发框架
threejs做特效:实现物体的发光效果-EffectComposer详解!
【8月更文挑战第7天】实现物体的发光效果-EffectComposer详解!
2698 6
threejs做特效:实现物体的发光效果-EffectComposer详解!
|
图形学
ThreeJs创建管道效果
这篇文章介绍了在Three.js中创建管道(Tube)效果的方法和技术细节。
559 4
ThreeJs创建管道效果
ThreeJs制作管道中水流效果
这篇文章详细介绍了如何在Three.js中创建具有动态水流效果的管道模型,通过纹理贴图的移动来模拟水流的视觉效果。
1207 2
ThreeJs制作管道中水流效果