1.earcut多边形三角划分也可以用来直接挖洞
let prehole = [];
for (let i: number = 0; i < hole.length; i++) {
prehole.push(hole[i].x, hole[i].z, 0);
}
let points = preface.concat(prehole);
let holeIndexs = [];
for (let i: number = 0; i < holeIndex.length; i++) {
holeIndexs.push(holeIndex[i] + (face.length));
}
let poinIndex = earcut(points, holeIndexs, 3);
2.用shape中得holes挖洞,可以用来做各种模型造型
if (!shape) {
shape = new Shape()
.moveTo(0, 0)
.lineTo(w, 0)
.lineTo(w, h)
.lineTo(0, h)
.lineTo(0, 0);
}
let pathVec: any[] = [];
for (let i = 0; i < pos.length; i++) {
let xv = pos[i][0];
let yv = pos[i][1];
let holePath = new Path();
holePath.moveTo(xv, yv)
.absarc(xv, yv, r / 2, 0, Math.PI * 2, true);
pathVec.push(holePath);
}
shape.holes.push(...pathVec);
let geometry = new ShapeGeometry(shape);
let bposition = geometry.attributes.position;
let bindex = geometry.getIndex();
3.csg布尔算法挖洞
let holeMetas: any = this.getWallHole(wall);
let csg = new CSG();
let ddddd = wall.copyMesh();
ddddd.position.set(ddddd.position.x,0,ddddd.position.z);
let csgarrr = [ddddd];
for (let i: number = 0; i < holeMetas.length; i++) {
ddddd = holeMeta[i].clone();
ddddd.geometry.computeVertexNormals(); ddddd.position.set(wall.position.x+ddddd.position.x,ddddd.position.y,wall.position.z+ddddd.position.z);
csgarrr.push(ddddd);
}
let geo: BufferGeometry;
if(csgarrr && csgarrr.length > 1){
csg.subtract(csgarrr);
geo = csg.toGeometry();
}
本文介绍了在Three.js中进行挖洞的三种方法:使用Earcut算法对多边形进行三角划分以实现挖洞效果;通过Shape的holes属性创建复杂的模型造型;以及利用CSG(Constructive Solid Geometry)布尔运算来实现更精细的挖洞操作。

728

被折叠的 条评论
为什么被折叠?



