Raycast до ближайшего доступного объекта - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь сделать (масштабирование области), в котором я даю пользователю возможность масштабирования до определенной области всей модели, позволяя создать виртуальное окно перетаскивания на объекте с помощью мыши.Затем я нахожу среднюю точку этого окна и снимаю луч оттуда с помощью 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, который является пользовательской реализацией.

Как я могу убедиться, что мой луч всегда попадает в модель, особенно в эту функцию увеличения масштаба.

...