Three.js引入ThreeBSP库

73 篇文章 4 订阅
3 篇文章 0 订阅

接上篇:Vue集成three.js,并加载glb、gltf、FBX、json模型

 上篇就是创建材质的时候转BSP时,引入ThreeBSP的问题,这篇来解决。

<script src="https://johnson2heng.github.io/three.js-demo/lib/threebsp.js"></script>

这个确实可以在线引,但有个前提是得引在three之后,但是咱们是Vue开发,three.js是通过npm装的,并且按需引入 ,这就有点难处理

现在有个替代方案:three-js-csg

安装:

npm i three-js-csg

组件中引入

import * as THREE from 'three'
const ThreeBSP = require('three-js-csg')(THREE)

开始使用的时候还是报了如下错误

百度找了一堆,应该是 three.js版本太高了,我当时装的是最新的,版本太高好像一些基类就没有了,才报了上述错误,我将版本降低到0.124.0就没有问题了

然后将上篇的完整代码 中的创建材质的方法修改如下:

// 创建材质
createMaterial() {
  // 创建三维用到的材质
  /**
   * 
   * MeshBasicMaterial: 网格基础材质
   * MeshDepthMaterial: 网格深度材质
   * MeshNormalMaterial: 网格法向材质
   * MeshLambertMaterial: 网格Lambert 材质
   * MeshPhongMaterial: 网格 Phong式材质
   * MeshStandardMaterial: 网格标准材质
   * MeshPhysicalMaterial: 网格物理材质
   * MeshToonMaterial: 网格卡通材质
   * ShadowMaterial: 阴影材质
   * ShaderMaterial: 着色器材质
   * LineBasicMaterial: 直线基础材质
   * LineDashMaterial: 虚线材质
   */
  // 外墙
  let wallMaterial = new THREE.MeshLambertMaterial({ color: 0x00ffff });
  let wallGeo = new THREE.BoxGeometry(439 + 2 + 2, 120, 376.5 + 2 + 2); // 创建几何体
  let wallMesh = new THREE.Mesh(wallGeo, wallMaterial);
  wallMesh.position.set(0, 60, 0); //(0, 60, -14.95);
  // this.scene.add(wallMesh)
  // 内墙
  let wallInnerMaterial = new THREE.MeshLambertMaterial({
    color: 0x2d1bff,
  });
  let wallInnerGeo = new THREE.BoxGeometry(439, 120, 376.5); //(270, 120, 390);
  let wallInnerMesh = new THREE.Mesh(wallInnerGeo, wallInnerMaterial);
  wallInnerMesh.position.set(0, 60, 0); //(0, 60, -14.95);
  // this.scene.add(wallInnerMesh)
  // 门
  let doorTexture = this.textureLoader.load(
    require("../../../../assets/img/1.png") // 暂时注掉
  );
  let boxTextureMaterial = new THREE.MeshStandardMaterial({
    map: doorTexture,
    metalness: 0.2,
    roughness: 0.07,
    side: THREE.DoubleSide,
  });
  //let doorInnerMaterial = new THREE.MeshLambertMaterial({color: 0x2D1BFF});
  let doorGeo = new THREE.BoxGeometry(2, 80, 74.5);
  let doorMesh = new THREE.Mesh(doorGeo, boxTextureMaterial);
  doorMesh.position.set(-220.5, 40, 0);
  // this.scene.add(doorMesh);

  //转BSP
  let wallBSP = new ThreeBSP(wallMesh);
  let wallInnerBSP = new ThreeBSP(wallInnerMesh);
  let doorBSP = new ThreeBSP(doorMesh);
  // let window1BSP = new ThreeBSP(this.createWindowRight());
  //let window2BSP = new ThreeBSP(this.createWindowRight());// createWindowLeft
  let wallResultBSP = wallBSP.subtract(wallInnerBSP);
  wallResultBSP = wallResultBSP.subtract(doorBSP);
  // wallResultBSP = wallResultBSP.subtract(window1BSP);
  //wallResultBSP = wallResultBSP.subtract(window2BSP);
  let wallResultMesh = wallResultBSP.toMesh();

  //转换后的Mesh配置属性
  let wallTexture = this.textureLoader.load(require("../../../../assets/img/3.jpg")); // 暂时注掉
  let wallTextureMaterial = new THREE.MeshStandardMaterial({
    map: wallTexture,
    metalness: 0.2,
    roughness: 0.07,
    side: THREE.DoubleSide,
  });
  let wallInnerTexture = this.textureLoader.load(
    require("../../../../assets/img/6.jpg") // 暂时注掉
  );
  let wallInnerTextureMaterial = new THREE.MeshStandardMaterial({
    map: wallInnerTexture,
    metalness: 0.2,
    roughness: 0.07,
    side: THREE.DoubleSide,
  });
  let wallResultMeshMaterial = [];
  wallResultMeshMaterial.push(wallTextureMaterial);
  wallResultMeshMaterial.push(wallInnerTextureMaterial);
  //wallResultMeshMaterial.push(boxTextureMaterial);
  wallResultMesh.material = wallResultMeshMaterial;

  // console.log(wallResultMesh.geometry.faces, 112233);
  wallResultMesh.geometry.faces.forEach((item, i) => {
    if (i < 160) {
      item.materialIndex = 0;
    } else {
      item.materialIndex = 1;
    }
  });

  wallResultMesh.geometry.computeFaceNormals();
  wallResultMesh.geometry.computeVertexNormals();
  // console.log(wallResultMesh, '----->>>')
  //添加结果到场景中
  this.scene.add(wallResultMesh);
},

最终效果: 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会说法语的猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值