我正在使用 THREE.js,并且有两个 THREE.Ray
对象。每条射线都有一个原点 (Vector3
) 和一个方向 (Vector3
)。
我试图弄清楚如何获取每条射线上距另一条射线最近的点的位置。
最佳答案
求解的关键是要知道距离最近的 2 个点所形成的直线与 2 条射线垂直。
第一步是找到由最近的 2 个点形成的直线的方向向量。由于矢量垂直于两条光线,这可以通过 Cross product 来完成.
rayA
和 rayB
是 THREE.Ray
类型的 2 个对象:
let Nv = rayA.direction.clone().cross(rayB.direction);
下一步是为每条射线找到一个平面,其中包括该射线和另一条射线上最近的点。平面由 2 个向量组成,在本例中为平面的方向向量和nv
。但我们需要用一个点和一个法向量来表示平面。该点是射线的原点。法向量又可以通过 Cross product 得到。为了进一步计算,这个向量必须是 Unit vectors (长度为1),因此它们被归一化:
let Na = rayA.direction.clone().cross(Nv).normalize();
let Nb = rayB.direction.clone().cross(Nv).normalize();
现在的问题是射线和平面的交集。 ptA
和 ptB
是 THREE.Vector3
物体和射线上最近的点:
let Da = rayA.direction.clone().normalize();
let Db = rayB.direction.clone().normalize();
let da = rayB.origin.clone().sub(rayA.origin).dot(Nb) / Da.dot(Nb);
let db = rayA.origin.clone().sub(rayB.origin).dot(Na) / Db.dot(Na);
let ptA = rayA.origin.clone().add(Da.multiplyScalar(da));
let ptB = rayB.origin.clone().add(Db.multiplyScalar(db));
射线与平面相交的解释:
射线由点Ra
和方向Da
定义。
该平面由点 Rb
和法线向量 Nb
定义。
点Ra
到平面的法向距离n
为(参见Dot product):
n = | Rb - Ra | * cos(alpha) = dot(Rb - Ra, Nb)
由此可知交点ptA
到射线Ra原点的距离da
为:
da = n / cos(beta) = n / dot(Da, Nb)
交点ptA
是:
ptA = Ra + Da * da = Ra + Da * dot(Rb - Ra, Nb) / dot(Da, Nb)
关于javascript - THREEJS : How to calculate the closest point on a THREE. 射线到另一个 THREE.ray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58151978/