javascript - THREEJS : How to calculate the closest point on a THREE. 射线到另一个 THREE.ray

标签 javascript three.js computational-geometry

我正在使用 THREE.js,并且有两个 THREE.Ray 对象。每条射线都有一个原点 (Vector3) 和一个方向 (Vector3)。

我试图弄清楚如何获取每条射线上距另一条射线最近的点的位置。

最佳答案

求解的关键是要知道距离最近的 2 个点所形成的直线与 2 条射线垂直。

第一步是找到由最近的 2 个点形成的直线的方向向量。由于矢量垂直于两条光线,这可以通过 Cross product 来完成.
rayArayBTHREE.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();

现在的问题是射线和平面的交集。 ptAptBTHREE.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/

相关文章:

javascript - Chrome 应用程序中的按钮不起作用

javascript - Three.js 将 StereoEffect 与 FXAA ShaderPass 相结合

algorithm - 如何计算多个多边形的面积?

javascript - 如何使用javascript检测移动设备屏幕是否关闭

javascript - 如何在 Knockout 中绑定(bind) Html 5 视频控件属性

javascript - 如何显示过滤后的所有数据

javascript - Three.js:导入和使用 3d 模型

javascript - 透明 PNG 中可见图像的最顶部和最底部坐标

objective-c - 圆内点

algorithm - 使用劳埃德算法进行锚定分区