简介

之前我们一直使用Three.js默认提供的几何体,今天我们使用ThreeBSP库,可以将现有的模型组合出更多个性的模型来使用。我们可以使用ThreeBSP库里面的三个函数进行现有模型的组合,分别是:差集(相减)、并集(组合、相加)、交集(两几何体重合的部分)。下面我们介绍一下三个函数,并提供每个方法的简单案例。

查看案例效果:http://www.wjceo.com/blog/threejs/2018-02-12/53.html

相关函数

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

使用intersect(交集)创建新几何体

首先,需要先把库文件引入,我的github地址是

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

请自行保存到本地。
然后创建两个几何体,一个球形sphere一个立方体cube

//创建球形几何体var sphereGeometry = new THREE.SphereGeometry(50, 20, 20);var sphere = createMesh(sphereGeometry);//创建立方体几何体var cubeGeometry = new THREE.BoxGeometry(30, 30, 30);var cube = createMesh(cubeGeometry);cube.position.x = -50;scene.add(sphere);scene.add(cube);

两个立方体的效果就是这样,有一部分重叠。
我们就创建出重叠的这一部分的图形,具体代码是这样的

        //创建球形几何体var sphereGeometry = new THREE.SphereGeometry(50, 20, 20);var sphere = createMesh(sphereGeometry);//创建立方体几何体var cubeGeometry = new THREE.BoxGeometry(30, 30, 30);var cube = createMesh(cubeGeometry);cube.position.x = -50;//生成ThreeBSP对象var sphereBSP = new ThreeBSP(sphere);var cubeBSP = new ThreeBSP(cube);//进行并集计算var resultBSP = sphereBSP.intersect(cubeBSP);//从BSP对象内获取到处理完后的mesh模型数据var result = resultBSP.toMesh();//更新模型的面和顶点的数据result.geometry.computeFaceNormals();result.geometry.computeVertexNormals();//重新赋值一个纹理var material = new THREE.MeshPhongMaterial({color: 0x00ffff});result.material = material;//将计算出来模型添加到场景当中scene.add(result);

按上面的步骤,我们就可以获得交集的模型了。

使用union(并集)创建新几何体

代码和上面交集的方法一样的,只是改成了并集计算

var resultBSP = sphereBSP.union(cubeBSP);

就实现了如下的效果。

使用subtract(差集)创建新几何体

如上,直接把调用方法改掉即可

var resultBSP = sphereBSP.subtract(cubeBSP);

以下是整个项目的代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style type="text/css">html, body {margin: 0;height: 100%;}canvas {display: block;}</style>
</head>
<body onload="draw();">
</body>
<script src="https://johnson2heng.github.io/three.js-demo/lib/three.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/threebsp.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/controls/OrbitControls.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/libs/stats.min.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/libs/dat.gui.min.js"></script>
<script>var renderer;function initRender() {renderer = new THREE.WebGLRenderer({antialias: true});//renderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0)); //设置背景颜色renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);}var camera;function initCamera() {camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000);camera.position.set(0, 200, 500);}var scene;function initScene() {scene = new THREE.Scene();}var light;function initLight() {scene.add(new THREE.AmbientLight(0x404040));light = new THREE.DirectionalLight(0xffffff);light.position.set(1, 1, 1);scene.add(light);}function initModel() {//轴辅助 (每一个轴的长度)var object = new THREE.AxesHelper(500);scene.add(object);//创建球形几何体var sphereGeometry = new THREE.SphereGeometry(50, 20, 20);var sphere = createMesh(sphereGeometry);//创建立方体几何体var cubeGeometry = new THREE.BoxGeometry(30, 30, 30);var cube = createMesh(cubeGeometry);cube.position.x = -50;//生成ThreeBSP对象var sphereBSP = new ThreeBSP(sphere);var cubeBSP = new ThreeBSP(cube);//进行并集计算var resultBSP = sphereBSP.subtract(cubeBSP);//从BSP对象内获取到处理完后的mesh模型数据var result = resultBSP.toMesh();//更新模型的面和顶点的数据result.geometry.computeFaceNormals();result.geometry.computeVertexNormals();//重新赋值一个纹理var material = new THREE.MeshPhongMaterial({color: 0x00ffff});result.material = material;//将计算出来模型添加到场景当中scene.add(sphere);scene.add(cube);scene.add(result);}//生成模型function createMesh(geom) {//设置当前的模型矩阵沿xy轴偏移,让图片处于显示中心//geom.applyMatrix(new THREE.Matrix4().makeTranslation(-250, -100, 0));// 创建法向量纹理var meshMaterial = new THREE.MeshNormalMaterial({flatShading: THREE.FlatShading,transparent: true,opacity: 0.9});//  创建一个线框纹理var wireFrameMat = new THREE.MeshBasicMaterial({opacity: 0.5, wireframeLinewidth: 0.5});wireFrameMat.wireframe = true;// 创建模型var mesh = new THREE.Mesh(geom, wireFrameMat);return mesh;}//初始化性能插件var stats;function initStats() {stats = new Stats();document.body.appendChild(stats.dom);}//用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放var controls;function initControls() {controls = new THREE.OrbitControls(camera, renderer.domElement);// 如果使用animate方法时,将此函数删除//controls.addEventListener( 'change', render );// 使动画循环使用时阻尼或自转 意思是否有惯性controls.enableDamping = true;//动态阻尼系数 就是鼠标拖拽旋转灵敏度//controls.dampingFactor = 0.25;//是否可以缩放controls.enableZoom = true;//是否自动旋转controls.autoRotate = false;//设置相机距离原点的最远距离controls.minDistance = 20;//设置相机距离原点的最远距离controls.maxDistance = 10000;//是否开启右键拖拽controls.enablePan = true;}//生成gui设置配置项var gui;function initGui() {//声明一个保存需求修改的相关数据的对象gui = {};var datGui = new dat.GUI();//将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值)}function render() {renderer.render(scene, camera);}//窗口变动触发的函数function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();render();renderer.setSize(window.innerWidth, window.innerHeight);}function animate() {//更新控制器controls.update();render();//更新性能插件stats.update();requestAnimationFrame(animate);}function draw() {initRender();initScene();initCamera();initLight();initModel();initControls();initStats();initGui();animate();window.onresize = onWindowResize;}
</script>
</html>

51 使用ThreeBSP库进行Three.js网格组合相关推荐

  1. 使用ThreeBSP库进行实现差集(相减)、并集(组合、相加)、交集(两几何体重合的部分)

    简介 之前我们一直使用Three.js默认提供的几何体,今天我们使用ThreeBSP库,可以将现有的模型组合出更多个性的模型来使用.我们可以使用ThreeBSP库里面的三个函数进行现有模型的组合,分别 ...

  2. meetup_如何使用标准库和Node.js构建Meetup Slack机器人

    meetup by Janeth Ledezma 简妮丝·莱德兹玛(Janeth Ledezma) 如何使用标准库和Node.js构建Meetup Slack机器人 (How to build a M ...

  3. highlight.js css,JS库之Highlight.js的用法详解

    下载到本地后,新建个页面测试 1.在head中加入css和js的引用 highlight hljs.initHighlightingOnLoad(); 2.添加对应要显示的内容 # 读取文件内容 de ...

  4. zurb是什么网站_Zurb的Tribute库的Vue.js包装器,用于本机@mentions

    zurb是什么网站 致敬 (vue-tribute) A Vue.js wrapper for Zurb's Tribute library for native @mentions. Zurb的Tr ...

  5. 曾遭作者“删库”的faker.js,现被社区接手;Apache Ambari 项目被弃用;FFmpeg 5.0 发布 | 开源日报

    整理 | 宋彤彤 责编 | 屠敏 开源吞噬世界的趋势下,借助开源软件,基于开源协议,任何人都可以得到项目的源代码,加以学习.修改,甚至是重新分发.关注「开源日报」,一文速览国内外的开源大事件吧! 一分 ...

  6. 一个事件订阅和发布的库(onfire.js)的源码浅析

    文章目录 一.onfire.js介绍 二.API介绍 三.变量浅析 四.订阅函数浅析 五.发布函数浅析 六.全部源码 一.onfire.js介绍 一个简单实用的事件订阅和发布的库. onfire.js ...

  7. 【卡法 常用 ckl.js 库】: js汇合 表单验证 cookie设置 日期格式 电话手机号码 email 整数 小数 金额 检查参数长度...

    [卡法 常用js库]: js汇合 表单验证  cookie设置  日期格式  电话手机号码  email  整数  小数  金额   检查参数长度 // +---------------------- ...

  8. js 排列 组合 的一个简单例子

    最近工作项目需要用到js排列组合,于是就写了一个简单的demo. 前几天在网上找到一个写全排列A(n,n)的code感觉还可以,于是贴出来了, 排列的实现方式: 全排列主要用到的是递归和数组的插入 比 ...

  9. unity3d collider自动调整大小_自动网格组合建模工具Unity游戏素材资源

    分享最新的CG教程与素材资讯! 人人素材RRCG-专业的CG艺术交流网站 点击上方蓝字关注人人素材 本游戏资料是自动网格组合建模工具Unity游戏素材资源,大小:735 KB ,格式:unitypac ...

最新文章

  1. java 时间戳加密_加密PHP中的时间戳并用Java解密
  2. KeyMob聚合平台--国内口碑最好的移动广告聚合平台
  3. jsonProperty
  4. django_rest_framework之GenericAPIView(二)之搜索、排序、分页讲解
  5. 什么叫时钟漂移(Wander)?时钟漂移与时钟抖动(jitter)的区别
  6. 16 大常考算法知识点,你掌握了吗?
  7. Java学习笔记十五
  8. python在线编程免费课程-吐血整理!程序员最爱的13个免费Python课程
  9. ai人工智能让女神_人工智能可能只会让你兴奋不已
  10. 好用的电子邮箱测评,这么多的邮箱究竟哪个最好用呢?
  11. 使用github免费搭建个人网站详细教程
  12. Linux笔记(更新中)
  13. ZYNQ-7 PS的中断
  14. 最全Linux应用开发解析(持续更新)
  15. PyQt5 第七章 综合篇(一)
  16. esc键退出全屏 vue_vue项目实现全屏,退出全屏,图标切换的解决方案
  17. 2023基于微信小程序的校园第二课堂活动报名系统+后台管理系统(Springboot+mysql)-JAVA.VUE(论文+开题报告+运行)
  18. 抖音怎么实现落地页跳转微信加好友?
  19. java数据类型、常量与变量、内部存储
  20. 华为nova7se能云闪付吗_vivoS7和华为nova7se哪个好?自拍手机该如何抉择!

热门文章

  1. 直播间搭建解决方案有哪些
  2. 如何通过看美剧来提高英语水平(转)
  3. 内网穿透理解--基于frp
  4. 发射台没被炸平,新的人类最强现役运载火箭诞生!马斯克吹的牛又一次变成了现实!(内附发射视频)
  5. 阿男教你修鼠标——拯救双击的G402
  6. 【JavaScript】Fetch使用说明
  7. 我为什么在22岁辞去年薪150万的工作
  8. 支付宝获取敬业福套路,成功率高达99%
  9. 解决Ubuntu虚拟机永久全屏问题
  10. wordpress菜单显示css字体,使用WordPress导航CSS类花式玩耍菜单栏