THREEJS: Как вычислить ближайшую точку на THREE.ray к другому THREE.ray - PullRequest
1 голос
/ 29 сентября 2019

Я использую THREE.js и у меня есть два THREE.Ray объекта.Каждый луч имеет начало (Vector3) и направление (Vector3).

Я пытаюсь выяснить, как я могу получить местоположение на каждом луче, которое является ближайшей точкой к другому лучу..

1 Ответ

1 голос
/ 29 сентября 2019

Ключом к нахождению решения является знание того, что линия, образованная двумя точками, которые находятся ближе всего друг к другу, является нормальной к двум лучам.

Первый шаг - найтивектор направления линии, которая образована двумя ближайшими точками.Поскольку вектор является нормальным для обоих лучей, это может быть сделано с помощью Cross product .
rayA и rayB, которые являются двумя объектами типа THREE.Ray:

let Nv = rayA.direction.clone().cross(rayB.direction);

Следующий шаг - найти плоскость для каждого луча, которая включает луч и ближайшую точку на другом луче.План состоит из 2 векторов, в данном случае вектора направления плоскости и nv.Но нам нужно другое представление плоскости, точкой и нормальным вектором.Дело в происхождении луча.Нормальный вектор снова можно получить с помощью Cross product .для дальнейших вычислений эти векторы должны быть Единичные векторы (длина равна 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.

Нормальное расстояние n от точки Ra до плоскости (см. Точечный продукт ):

n  =  | Rb - Ra | * cos(alpha)  =  dot(Rb - Ra, Nb)

Из этого следует, что расстояние da от точки пересечения ptA до начала луча Ra составляет:

da  =  n / cos(beta)  =  n / dot(Da, Nb)

Точка пересечения ptA составляет:

ptA  =  Ra + Da * da  =  Ra + Da * dot(Rb - Ra, Nb) / dot(Da, Nb)
...