如何在Three.js中对SVG挤出生成的模型的首尾两端进行裁切
解决方案
方案1:使用Three.js内置裁剪平面(最简便,仅渲染层面裁切)
该方案无需修改原始几何体,仅在渲染阶段生效,适合需要动态调整裁切位置的场景:
- 首先开启渲染器的局部裁剪支持:
renderer.localClippingEnabled = true;
- 定义两个与裁切端面平行的裁剪平面,根据你的斜面需求调整平面法线和偏移量即可:
// 示例为沿X轴方向斜切的两个裁剪平面,法线方向均指向模型保留区域 const startClipPlane = new THREE.Plane(new THREE.Vector3(-1, 0, 0.2), 10); // 首端裁切平面 const endClipPlane = new THREE.Plane(new THREE.Vector3(1, 0, -0.2), 10); // 尾端裁切平面
- 将裁剪平面绑定到挤出模型的材质上,同时开启截面填充效果:
extrudeMesh.material.clippingPlanes = [startClipPlane, endClipPlane]; extrudeMesh.material.clipIntersection = false; // 若需要裁切后的截面正常显示材质颜色,可设置双面渲染 extrudeMesh.material.side = THREE.DoubleSide;
如果需要裁切后保留实体几何体数据用于后续操作,可使用下方的CSG方案。
方案2:使用CSG布尔运算(实体裁切,直接修改几何体本身)
该方案会直接生成裁切后的完整几何体,适合需要导出模型、需要截面参与物理碰撞等场景,推荐使用three-bvh-csg库实现高效布尔运算:
- 引入库后初始化CSG操作器:
import { SUBTRACTION, Brush, Evaluator } from 'three-bvh-csg'; const csgEvaluator = new Evaluator();
- 创建两个尺寸足够覆盖首尾待裁切区域的立方体作为裁切工具,调整位置和角度匹配你需要的斜面效果:
// 首端裁切工具 const startCutTool = new THREE.Mesh( new THREE.BoxGeometry(20, 20, 20), new THREE.MeshBasicMaterial() ); startCutTool.position.set(-15, 0, 0); startCutTool.rotation.y = Math.PI / 10; // 调整角度匹配目标斜面 // 尾端裁切工具 const endCutTool = new THREE.Mesh( new THREE.BoxGeometry(20, 20, 20), new THREE.MeshBasicMaterial() ); endCutTool.position.set(15, 0, 0); endCutTool.rotation.y = -Math.PI / 10;
- 执行两次差集运算得到最终裁切模型:
let resultBrush = new Brush(extrudeMesh.geometry, extrudeMesh.material); // 裁切掉首端多余部分 resultBrush = csgEvaluator.evaluate(resultBrush, new Brush(startCutTool.geometry, startCutTool.material), SUBTRACTION); // 裁切掉尾端多余部分 resultBrush = csgEvaluator.evaluate(resultBrush, new Brush(endCutTool.geometry, endCutTool.material), SUBTRACTION); // 生成最终裁切后的网格对象 const clippedMesh = new THREE.Mesh(resultBrush.geometry, resultBrush.material); scene.add(clippedMesh); // 移除原始的未裁切挤出模型 scene.remove(extrudeMesh);
注意事项
- 裁剪平面的参数可通过
Plane类的setFromNormalAndCoplanarPoint方法快速设置,只要确定斜面上任意一个点和法线方向即可快速生成对应平面 - 进行CSG运算前建议先确保挤出几何体是封闭的,避免运算出错
- 如果裁切后截面出现闪烁,可适当调整材质的
polygonOffset参数解决深度冲突问题
内容的提问来源于stack exchange,提问作者SergeCools
相关产品推荐
相关产品推荐

