У меня есть сетка точек (object3D с использованием THREE.Points) в моей сцене Three.js с моделью, расположенной поверх сетки, как показано ниже. В коде модель называется default mesh
и использует объединенную геометрию для повышения производительности:
Я пытаюсь определить, какую из точек в сетке моя перспективная камера может видеть в любой заданной точке, то есть каждый раз, когда положение камеры обновляется с использованием моих орбитальных элементов управления.
Моей первой идеей было использовать raycasting для создания луча между камерой и каждой точкой сетки. Затем я могу найти, какие лучи пересекаются с моделью, и удалить точки, соответствующие этим лучам, из списка всех точек, тем самым оставив мне список точек, которые камера может видеть.
Пока все хорошо, код создания лучей и пересечения помещается в цикл рендеринга (так как он должен обновляться каждый раз, когда камера перемещается), и поэтому он ужасно медленный (очевидно).
gridPointsVisible = gridPoints.geometry.vertices.slice(0);
startPoint = camera.position.clone();
//create the rays from each point in the grid to the camera position
for ( var point in gridPoints.geometry.vertices) {
direction = gridPoints.geometry.vertices[point].clone();
vector.subVectors(direction, startPoint);
ray = new THREE.Raycaster(startPoint, vector.clone().normalize());
if(ray.intersectObject( defaultMesh ).length > 0){
gridPointsVisible.pop(gridPoints.geometry.vertices[point]);
}
}
В показанном примере модели создается около 2300 лучей, а сетка имеет 1500 граней, поэтому рендеринг занимает вечность.
Итак, у меня 2 вопроса:
- Есть ли лучший способ найти, какие объекты видит камера?
- Если нет, могу ли я ускорить проверку лучей / пересечений?
Заранее спасибо!
WebGLRenderTarget
позволяет рисовать в буфер без рисования на холсте. Что касается сопоставления, вы проанализируете целевой буфер рендеринга и создадите список всех уникальных цветов, которые вы видите (все несферические объекты должны быть другого плоского цвета). Затем вы можете прокручивать свои сферы в цикле - и вы должны знать, какого цвета должна быть каждая сфера, с тем же расчетом цвета, что и используемый шейдер. Если цвет сферы находится в вашем списке найденных цветов, то эта сфера видна. Имеет ли это смысл? - person TheJim01   schedule 14.03.2018