You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Three.js中BoxGeometry所有面的中心顶点位置?

获取BoxGeometry立方体所有面的中心位置

针对你创建的带细分参数的BoxGeometry,以下是几种获取面中心位置的实现方法:

1. 获取所有三角面的中心

Three.js会将每个四边形面拆分为两个三角面,你可以遍历BoxGeometry的faces数组,通过每个三角面的三个顶点坐标取平均值得到中心:

const boxGeometry = new THREE.BoxGeometry(1.5,1.5,1.5,2,2,2);
const material = new THREE.MeshBasicMaterial({
      color:0xffffff,
      wireframe:true,
});
const mesh = new THREE.Mesh(boxGeometry,material);

// 存储所有三角面中心的数组
const triangleFaceCenters = [];

boxGeometry.faces.forEach(face => {
  // 获取当前三角面的三个顶点
  const v1 = boxGeometry.vertices[face.a];
  const v2 = boxGeometry.vertices[face.b];
  const v3 = boxGeometry.vertices[face.c];
  
  // 计算中心坐标(三个顶点坐标的平均值)
  const center = new THREE.Vector3(
    (v1.x + v2.x + v3.x) / 3,
    (v1.y + v2.y + v3.y) / 3,
    (v1.z + v2.z + v3.z) / 3
  );
  
  triangleFaceCenters.push(center);
});

// 示例:打印第一个三角面的中心坐标
console.log('第一个三角面中心:', triangleFaceCenters[0]);

2. 获取所有四边形小面的中心

你设置了三个方向的分段数为2,每个原始大面会被拆分为4个四边形小面。每个四边形对应两个连续的三角面,可通过合并这两个面的顶点计算中心:

const quadFaceCenters = [];

// 每两个三角面对应一个四边形,按步长2遍历
for (let i = 0; i < boxGeometry.faces.length; i += 2) {
  const face1 = boxGeometry.faces[i];
  const face2 = boxGeometry.faces[i+1];
  
  // 提取四边形的四个唯一顶点
  const vertexIndices = new Set([face1.a, face1.b, face1.c, face2.a, face2.b, face2.c]);
  const vertices = Array.from(vertexIndices).map(idx => boxGeometry.vertices[idx]);
  
  // 计算四个顶点的平均坐标
  const center = new THREE.Vector3();
  vertices.forEach(v => center.add(v));
  center.divideScalar(vertices.length);
  
  quadFaceCenters.push(center);
}

// 示例:打印四边形小面的总数量(6个大面×4个小面=24个)
console.log('四边形小面中心数量:', quadFaceCenters.length);

3. 获取6个原始大面的中心

如果不需要细分后的小面,直接通过立方体尺寸计算原始大面中心更高效:

const cubeSize = new THREE.Vector3(1.5, 1.5, 1.5);
const bigFaceCenters = [
  new THREE.Vector3(cubeSize.x/2, 0, 0),    // 右侧面中心
  new THREE.Vector3(-cubeSize.x/2, 0, 0),   // 左侧面中心
  new THREE.Vector3(0, cubeSize.y/2, 0),    // 上侧面中心
  new THREE.Vector3(0, -cubeSize.y/2, 0),   // 下侧面中心
  new THREE.Vector3(0, 0, cubeSize.z/2),    // 前侧面中心
  new THREE.Vector3(0, 0, -cubeSize.z/2)    // 后侧面中心
];

console.log('原始大面中心:', bigFaceCenters);

注意事项

如果后续对mesh执行了平移、旋转等变换,需要使用localToWorld方法将局部坐标的中心转换为世界坐标:

// 示例:转换第一个三角面中心到世界坐标
const worldCenter = mesh.localToWorld(triangleFaceCenters[0].clone());

内容的提问来源于stack exchange,提问作者mockingbird

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:37:35