javascript - Bir doğruyun orta noktasına dik noktanın 3D koordinatları nasıl bulunur


(Javascript/Typescript ve Three.js kullanıyorum)

İki vektör arasında, diyelim ki {x:1, y:3, z:5} ve {x:7, y:8, z:10} arasında doğru bir çizgi var.

O çizginin orta noktasında, o çizgiye dik olacak şekilde bir disk (örneğin yarıçapı 1 olan) hayal edin.

O hayali diskin çevresinde bir noktayi nasıl bulabilirim?

Sonsuz nokta olduğunu biliyorum ama ben sadece diskin çevresinde, çizginin orta noktasına dik bir bağlantısı olan 1 (herhangi bir) noktayı hesaplamak istiyorum.

Cevap #1

Bunu yapmanın birçok yolu vardır. Az matematik gerektiren ve ağır işleri Three.js'in halletmesini sağlayan basit bir yol, bir Object3D'yi başka birinin içine yerleştirmektir: alt nesne 'halka'dır ve üst nesne halka'yı orta noktaya taşır ve hattın aşağısına bakarak dik hale gelmesini sağlar.

// 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);

child öğesinin yerel pozisyonu hâlâ [0, 1, 0] olarak kalır, fakat ebeveyni taşıyıp döndürdükten sonra dünya pozisyonu, aradığınız cevaptır. Alternatif olarak, sadece Object3D.localToWorld kullanabilirsiniz, ama bu ebeveyn/çocuk örneğinin süreci daha net göstereceğini düşündüm.