美文网首页
threejs 引入外部模型(fbx)后,合并模型渲染

threejs 引入外部模型(fbx)后,合并模型渲染

作者: 时间煮鱼 | 来源:发表于2023-05-04 11:45 被阅读0次
项目需求:自己根据货架长宽高绘制货架,只提供货架的横梁和立柱模型(fbx)
下图是生成的货架 货架.png

解决方法:

1、将引入的模型先用group合并
主要代码,大部分代码都可以忽略,主要看调用meshMerge方法的入参是什么

// 添加货架
    initShelf() {
      const fbxLoader = new FBXLoader();
      const textureLoader = new THREE.TextureLoader();
      const beam_group = new THREE.Group(); // 横梁组
      const upright_group = new THREE.Group(); // 立柱组

      // 获取横梁&立柱
      fbxLoader.load(`./static/fbx/models/立库-横梁-01.FBX`, (fbx) => {
        const mesh = fbx.clone();
        // 添加贴图材质
        const material = new THREE.MeshPhongMaterial({
          map: textureLoader.load(
            "./static/fbx/textures/组件-轨道立库-8192-01.jpg"
          ),
        });
        mesh.traverse((child) => {
          // 横梁
          if (child.isMesh && child.name == "ZJ-05") {
            // 添加贴图材质
            child.material = material;
            child.rotateZ(-Math.PI / 2);
            this.shelf.forEach((item) => {
              const group = new THREE.Group();
              const positions = this.computerBeamPosition(item);
              positions.forEach((v) => {
                const beam = child.clone();
                beam.rotateX(v.rotation); // 设置旋转角度
                beam.scale.set(
                  0.001,
                  0.001 * Math.abs(item.startPosition.x - item.endPosition.x),
                  0.001
                );
                beam.position.set(v.x, v.y, v.z);
                group.add(beam);
              });
              // beam_group.add(group); // 这是没合并前的代码
              // 合并当前横梁
              const mergeMesh = this.meshMerge(group, item.name);
              beam_group.add(mergeMesh);
            });
          }
          // 立柱
          if (child.isMesh && child.name == "LKZJ-01") {
            child.material = material;
            this.shelf.forEach((item) => {
              const group = new THREE.Group();
              const positions = this.computerUprightPosition(item);
              positions.forEach((v) => {
                const upright = child.clone();
                upright.scale.set(0.001, 0.001, 0.002 * item.uprightHeight); // 设置立柱高度(+0.001突出来半截)
                upright.rotateZ(v.rotation); // 设置旋转角度
                upright.position.set(v.x, v.y + item.uprightHeight / 2, v.z); // 高度抬高到立柱一半
                group.add(upright);
              });
              // upright_group.add(group); // 这是没合并前的代码
              // 合并当前立柱
              const mergeMesh = this.meshMerge(group, item.name);
              upright_group.add(mergeMesh);
            });
          }
        });
        scene.add(beam_group);
        scene.add(upright_group);
      });
    },

2、将group用BufferGeometryUtils.mergeBufferGeometries 合并
主要代码

meshMerge(object, name) {
      const geometries = [];
      const materialArr = [];
      object.traverse((obj) => {
        const child = obj;
        if (child.isMesh) {
          const geo = child.geometry.clone();
          if (Array.isArray(child.material)) {
            child.material = child.material[0];
          }
          materialArr.push(child.material);
          geo.index = null;
          child.updateWorldMatrix(true, true);
          geo.applyMatrix4(child.matrixWorld);
          geometries.push(geo);
        }
      });
      // console.log(geometries);
      const buffergeo = BufferGeometryUtils.mergeBufferGeometries(
        geometries,
        true
      );
      // console.log(buffergeo);
      const mesh = new THREE.Mesh(buffergeo, materialArr);
      name && (mesh.name = name);
      return mesh;
    },

相关文章

网友评论

      本文标题:threejs 引入外部模型(fbx)后,合并模型渲染

      本文链接:https://www.haomeiwen.com/subject/xtexsdtx.html