javascript - Hur man hittar 3D-koordinaterna för en punkt vinkelrät mot linjens mittpunkt
(Jag använder Javascript/Typescript och Three.js)
Jag har en rak linje mellan två vektorer, säg {x:1, y:3, z:5} och {x:7, y:8, z:10}.
På mittpunkten av den linjen, föreställ dig en skiva (säg med radie 1) som är orienterad vinkelrätt mot den linjen.
Hur kan jag få en punkt på omkretsen av den imaginära skivan?
Jag vet att det finns oändligt många punkter, men jag vill bara beräkna 1 (vilken som helst) punkt på diskens omkrets med en vinkelrät förbindelse till linjens mittpunkt.
Svar #1
Det finns många sätt att göra detta. Ett enkelt sätt som kräver lite matematik och låter Three.js sköta det tunga arbetet är att använda ett Object3D som är inbäddat i ett annat: barnobjektet är "ringen", och föräldraobjektet flyttar ringen till mittpunkten och "tittar" ner längs linjen för att göra den vinkelrät.
// 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);
Den lokala positionen för child är fortfarande [0, 1, 0], men världens position, efter att ha flyttat och roterat föräldern, är svaret du letar efter. Alternativt kan du helt enkelt använda Object3D.localToWorld, men jag trodde att detta exempel med förälder/barn skulle illustrera processen tydligare.
