three.js 墙上挖门

背景:需要在墙上 创建窗户和门
在这里插入图片描述

方案:使用 ThreeBSP.JS库

ThreeBSP.JS库介绍:

名称描述
intersect(交集)使用该函数可以基于两个现有几何体的重合的部分定义此几何体的形状。
union(并集)使用该函数可以将两个几何体联合起来创建出一个新的几何体。
subtract(差集)使用该函数可以在第一个几何体中移除两个几何体重叠的部分来创建新的几何体。

主要使用可以参考下郭大神的这篇文章:http://www.yanhuangxueyuan.com/three.js_course/boolean.html,写的很详细

这次使用的是ThreeBSP.JS 的差集(subtract)

主要代码逻辑:

    import './ThreeBSP.js'

   
	//墙上挖门,通过两个几何体生成BSP对象
    let createResultBsp = function (bsp, objects_cube) {
        let material = new THREE.MeshPhongMaterial({
            map: textureLoaderRes(static_url + 'img/idc/boliqiang.png'),
            overdraw: true,
            specular: 0x9cb2d1,
            shininess: 30,
            transparent: true,
            opacity: 0.5
        });
        let BSP = new ThreeBSP(bsp);
        for (let i = 0; i < objects_cube.length; i++) {
            let less_bsp = new ThreeBSP(objects_cube[i]);
            BSP = BSP.subtract(less_bsp);
        }
        let result = BSP.toMesh(material);
        result.material.flatshading = THREE.FlatShading;
        result.geometry.computeFaceNormals(); //重新计算几何体侧面法向量
        result.geometry.computeVertexNormals();
        result.material.needsUpdate = true; //更新纹理
        result.geometry.buffersNeedUpdate = true;
        result.geometry.uvsNeedUpdate = true;
        scene.add(result);
    }
    
    //返回墙对象
    let returnWallObject = function (width, height, depth, angle, material, x, y, z, name) {
        let cubeGeometry = new THREE.BoxGeometry(width, height, depth);
        let cube = new THREE.Mesh(cubeGeometry, material);
        cube.position.x = x;
        cube.position.y = y;
        cube.position.z = z;
        cube.rotation.y += angle * Math.PI;
        cube.name = name;
        return cube;
    }
    
    //左墙门
    let objects_cube_left = [];
	//创建门的逻辑就不写了
	let door_cube1 = returnWallObject(wallWidth, doorHeight, doorWidth, 0, matArrayB, -offsetX, startY, 0, "door"); //正门




	//调用即可
    createResultBsp(left_wall, objects_cube_left);
    
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值