Вы можете создать усеченный от вашей проекции камеры матрицы.
var frustum = new THREE.Frustum();
var projectionScreenMatrix = new THREE.Matrix4();
projectionScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
frustum.setFromMatrix(projectionScreenMatrix);
то у вас есть усеченный с 6 самолетов frustum.planes
.
Вы можете перебирать самолеты и найти точку пересечения с линией с помощью:
var plane;
var line = ...your line piece...
var intersect;
var intersects = [];
for(var i = 0; i < frustum.planes.length; i++){
plane = frustum.planes[i];
intersect = plane.intersectLine(line);
if(intersect === undefined || intersect.equals(line.start)){
continue;
}
intersects.push(intersect);
}
Проблема здесь в том, что линия должна быть типа THREE.Line3
, так что вы должны преобразовать объекты типа THREE.LinesPieces
к нескольким объектам введите THREE.Line3
и проверьте все отдельно.
Этот код не проверен, а представляет собой концепцию, позволяющую вам понять, как справиться с этой проблемой.
Вы должны указать пространство, в котором вы хотите, координаты: пространство мира, пространство клипа, пространство NDC или пространство экрана. – WestLangley