计算孔洞间距

This commit is contained in:
Last
2025-05-06 22:12:49 +08:00
parent 986fd6f3e8
commit 54d825ce59
2 changed files with 50 additions and 34 deletions

View File

@@ -1,47 +1,59 @@
import * as THREE from 'three';
import { SUBTRACTION, Brush, Evaluator } from 'three-bvh-csg';
import { SUBTRACTION, ADDITION, Brush, Evaluator } from 'three-bvh-csg';
class CSGHexNutGeometry extends THREE.BufferGeometry {
constructor(radius = 1, height = 0.5, holeRadius = 0.6) {
export class 方形育苗盘 extends THREE.BufferGeometry {
constructor(width = 10, depth = 15, height = 0.25, holeDiameter = 0.25, holeRadius = 1, holeRows = 4, holeCols = 4) {
super();
this.parameters = {
radius: radius,
width: width,
depth: depth,
height: height,
holeRadius: holeRadius
holeDiameter: holeDiameter,
holeRadius: holeRadius,
holeRows: holeRows,
holeCols: holeCols
};
this.buildGeometry();
}
buildGeometry() {
const radius = this.parameters.radius;
const height = this.parameters.height;
const holeRadius = this.parameters.holeRadius;
const { width, depth, height, holeDiameter, holeRows, holeCols, } = this.parameters;
// 创建螺丝帽主体 (六棱柱)
const hexagonGeometry = new THREE.CylinderGeometry(radius, radius, height, 6, 1, false);
const hexagonMesh = new THREE.Mesh(hexagonGeometry); // 注意这里没有材质
const hexagonBrush = new Brush(hexagonMesh.geometry); // 使用 Brush 构造函数
// 创建长方体主体
const baseBrush = new Brush(new THREE.BoxGeometry(width, height, depth));
// 创建内部的孔洞 (圆柱体)
const holeHeight = height + 0.1;
const holeGeometry = new THREE.CylinderGeometry(holeRadius, holeRadius, holeHeight, 32);
const holeMesh = new THREE.Mesh(holeGeometry); // 注意这里没有材质
const holeBrush = new Brush(holeMesh.geometry); // 使用 Brush 构造函数
// 计算孔洞间距, (主体尺寸- 孔洞数量 * 孔洞直径) / (孔洞数量 + 1)
const rowSpacing = (width - holeRows * holeDiameter) / (holeRows + 1); // 行间距
const colSpacing = (depth - holeCols * holeDiameter) / (holeCols + 1); // 列间距
const holes = []
for (let i = 1; i <= holeRows; i++) {
for (let j = 1; j <= holeCols; j++) {
// 计算每个孔洞的中心位置
const x = -(width / 2) + rowSpacing * (i + 1) + holeDiameter * (i + 0.5);
const z = -(depth / 2) + colSpacing * (j + 1) + holeDiameter * (j + 0.5);
const holeGeometry = new THREE.BoxGeometry(holeDiameter, height, holeDiameter);
const holeBrush = new Brush(holeGeometry);
holeBrush.geometry.translate(x, 0, z);
holes.push(holeBrush);
}
}
// 计算所有孔洞的合并结果
let combinedHoles = holes[0];
for (let i = 1; i < holes.length; i++) {
combinedHoles = new Evaluator().evaluate(combinedHoles, holes[i], ADDITION);
}
// 执行布尔运算 (差集)
const evaluator = new Evaluator();
const resultBrush = evaluator.evaluate(hexagonBrush, holeBrush, SUBTRACTION);
const resultBrush = new Evaluator().evaluate(baseBrush, combinedHoles, SUBTRACTION);
// 将布尔运算结果转换为 BufferGeometry
const finalGeometry = resultBrush.geometry;
// 将结果的属性复制到当前的 BufferGeometry 实例
this.setAttribute('position', finalGeometry.getAttribute('position'));
this.setIndex(finalGeometry.getIndex());
// 将布尔运算结果应用到当前 BufferGeometry
this.copy(resultBrush.geometry);
this.computeVertexNormals(); // 计算法线
}
}
export { CSGHexNutGeometry };
export class 蜂窝育苗盘 extends THREE.BufferGeometry { }
export default { 方形育苗盘, 蜂窝育苗盘 };