javascript - Cómo encontrar las coordenadas 3D de un punto perpendicular al punto medio de una línea
(Estoy usando Javascript/Typescript y Three.js)
Tengo una línea recta entre dos vectores, digamos {x:1, y:3, z:5} y {x:7, y:8, z:10}.
En el punto medio de esa línea, imagina un disco (por ejemplo, con radio 1) que esté orientado perpendicular a esa línea.
¿Cómo puedo obtener un punto en la circunferencia de ese disco imaginario?
Sé que hay puntos infinitos, pero solo estoy buscando calcular 1 (cualquier) punto en la circunferencia del disco con una conexión perpendicular al punto medio de la línea.
Respuesta #1
Hay muchas formas de hacer esto. Una manera simple que requiere pocas matemáticas, y permite que Three.js se encargue del trabajo pesado, es usar un Object3D anidado dentro de otro: el objeto hijo es el "anillo", y el objeto padre mueve el anillo al punto medio y "mira" a lo largo de la línea para hacerlo perpendicular.
// Create end vectors
var v1 = new THREE.Vector3(1, 3, 5);
var v2 = new THREE.Vector3(7, 8, 10);
// Get midpoint
var mid = new THREE.Vector3();
mid.addVectors(v1, v2);
mid.multiplyScalar(0.5);
// Nest child object inside parent
var parent = new THREE.Object3D();
var child = new THREE.Object3D();
parent.add(child);
// Set child position to any point in the XY plane with radius = 1
// This is a point in your "disc"
child.position.set(0, 1, 0);
// Move parent to midpoint
parent.position.copy(mid);
// Rotate parent to look towards end of the line
// This makes the "disc" perpendicular to the line
parent.lookAt(v1);
// Get world position of child
var discPoint = new THREE.Vector3();
child.getWorldPosition(discPoint);
console.log(discPoint);
La posición local de child sigue siendo [0, 1, 0], pero la posición en el mundo, después de trasladar y rotar el padre, es la respuesta que estás buscando. Alternativamente, podrías simplemente usar Object3D.localToWorld, pero pensé que este ejemplo de padre/hijo ilustraría el proceso más claramente.
