Я пытаюсь сделать (масштабирование области), в котором я даю пользователю возможность масштабирования до определенной области всей модели, позволяя создать виртуальное окно перетаскивания на объекте с помощью мыши.Затем я нахожу среднюю точку этого окна и снимаю луч оттуда с помощью raycaster.Когда луч попадает на конкретный объект, он возвращает мне буксировку точки и расстояния, которую я делаю, основываясь на расстоянии, и перемещая камеру ближе к этой точке.Этот случай работает нормально.
Теперь у меня есть модель, в которой есть несколько окон и пустые места между ними.случайным образом происходит, что когда пользователь пытается создать виртуальное окно, средняя точка этого окна попадает в пустое пространство, и луч не возвращает никакого пересечения.на данный момент я попытался использовать OCTREE и построить frustcaster, который работает для небольших моделей, но когда модель поставляется с 2 миллионами граней или выше или пользователь выбирает большую часть модели внутри виртуального окна, а средняя точка ничего не достигает, тогда производительность не идетправильно, так как это занимает много времени, чтобы найти все предметы внутри моей камеры.затем сортируем его, а затем находим точку для увеличения.
Существует ли какой-либо оптимизированный способ реализации так называемого масштабирования по области, который в основном используется в приложениях САПР, где вы можете выбрать конкретную область для увеличения.
фрагмент кода:
let afenceMidMouse: THREE.Vector2 = this.afenceEndMouse.clone().add(this.afenceStartMouse).divideScalar(2);
let midMouseEvent: MouseEvent = new (<any>MouseEvent)(
'click', { 'view': window, 'bubbles': true, 'cancelable': true, 'clientX': afenceMidMouse.x, 'clientY': afenceMidMouse.y });
this._setRaycasterFromMouse(midMouseEvent);
let intDist: number;// distance eye -> intersection point of ray with model, or closest fence point
let intPt: THREE.Vector3 = new THREE.Vector3();
this.raycaster.ray.at(intDist, intPt);
let intersects: THREE.Intersection[] = this.octree.raycast(this.raycaster);
intersects = this.filterIntersectionsInsideClippingBox(intersects);
this._setRaycasterFromMouse (midMouseEvent);это функция, которая устанавливает Raycaster.this.octree.raycast (this.raycaster; это функция, которая возвращает пересеченные объекты.
для меня, иногда это переходит к другому случаю, когда пересечение не найдено, и он начинает строить весь frustcaster, который является пользовательской реализацией.
Как я могу убедиться, что мой луч всегда попадает в модель, особенно в эту функцию увеличения масштаба.