Get position of hole in ExtrudeGeometry

Hello! I trying to get position of hole in extruded geometry. I created plane and made hole in her geometry. I want get x,y,z coordinates in center of hole, but I don’t know how. I tried to get it from geometry attributes, but there are 1026 elements… Is there some methods to get it?

Here code:
I created shape of plane

let shape   = new THREE.Shape();
let width   = 30;
let height  = 30;

shape.moveTo(-width, height);
shape.lineTo(-width, -height);
shape.lineTo(width, -height);
shape.lineTo(width, height);
shape.lineTo(-width, height);

I created hole path and add it to shape

let hole = new THREE.Path();
hole.absarc(20, 10, 10, 0, Math.PI * 2, false)
shape.holes.push(hole)

I created plane add add extruded geometry

let geometry = new THREE.PlaneGeometry( 30, 30);
let material = new THREE.MeshBasicMaterial( {color: new THREE.Color('#cea6a6'), side: THREE.DoubleSide} );
let mesh = new THREE.Mesh( geometry, material );

let newGeometry = new THREE.ExtrudeGeometry(shape, settings);
mesh.geometry.dispose()
mesh.geometry = newGeometry;

After 4 days I understand how can do it. I simple created line from mesh center to hole config position. Applied quaternion to line and got x,y,z cords of hole.

Maybe there are more optimized solutions, but it only that I could create. I will be glad if someone share more optimized solution :smiley:

Here codepen: https://codepen.io/DYDOI-NSK/pen/XWqJzXG?editors=0011

Here code:

/*
* findCoords - function to find hole coords in 3d space
* data - parameter that require  x,y of hole
*/

let findCoords = function (data) {
  let vertexes = [];
  //Set coords where you was created hole
  let hole = new THREE.Vector3(
    data.x,
    data.y,
    0
  );
  vertexes.push(  new THREE.Vector3() );
  vertexes.push(hole)
  
  
  //Create line
   const material = new THREE.LineBasicMaterial({
     color: 0x0000ff
   });
  const geometry = new THREE.BufferGeometry().setFromPoints( vertexes );
  const line = new THREE.Line( geometry, material );
  scene.add(line)
  //Set line to center of mesh
  line.position.copy(mesh.position)
  //Rotate line like rotated mesh
  line.applyQuaternion(mesh.quaternion)
  
  
  //Extract hole coords from second vertex of line
  let holeCoord = new THREE.Vector3()
  const positionAttribute = line.geometry.getAttribute( 'position' );
  holeCoord.fromBufferAttribute( positionAttribute, 1);
  return holeCoord;
}

1 Like