raycast到最近的可用对象

时间:2019-06-28 16:04:16

标签: javascript three.js raycasting

我试图做一个(放大区域),在其中我给用户一个选项,允许用户使用鼠标在对象上创建虚拟拖动窗口,以放大整个模型的特定区域。然后,我找到该窗口的中点,并使用raycaster从那里射击射线。当光线照射到特定对象时,它会向我返回一个点和距离拖曳,我将根据距离进行一些计算并将相机移近该点。 这种情况很好。

现在我得到了一个模型,该模型之间有一些窗口和空白区域。随机发生的情况是,当用户尝试创建虚拟窗口时,该窗口的中间点位于空白处,并且ray不返回任何交集。 目前,我尝试使用OCTREE和构建frustcaster,该模型适用于小型模型,但是当模型具有200万张或以上的面孔或用户在虚拟窗口内选择模型的大部分且中间点没有任何作用时,性能就不会下降正确,因为要花很长时间才能找到我的frustcaster中的所有对象。然后对其进行排序,然后找到要缩放的点。

有什么优化的方法可以实现所谓的“按区域缩放”,它主要用于CAD应用程序中,您可以在其中选择要放大的特定区域。

一些代码段:

        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);是设置光线投射器的功能。 this.octree.raycast(this.raycaster;是返回相交对象的函数。

对我来说,有时候会遇到另一种情况,即找不到交集,并且开始构建整个frustcaster,这是自定义实现。

如何确保射线始终能击中模型中的某物,特别是在此缩放区域功能中。

0 个答案:

没有答案