【问题标题】:How can i add click event to pushpin in autodesk forge viewer?如何在 Autodesk Forge 查看器中将点击事件添加到图钉?
【发布时间】:2020-04-13 13:09:43
【问题描述】:

如何将图钉上的单击事件添加到 Autodesk forge?在existing extension 中,他使用相机焦点打开内容以供图钉使用。我想点击图钉打开它。

但我手动将 pushpini 添加到模型中,并使用以下代码翻译坐标

var setData = function (event) {      
      var screenPoint = {
        x: event.clientX,
        y: event.clientY
      };
      if (screenPoint) {
        var n = normalize(screenPoint);
        var dbId = /*_viewer.utilities.getHitPoint*/ getHitDbId(n.x, n.y);
        if (dbId == null) return;
      }
    }

    function getHitDbId(x, y) {
      y = 1.0 - y;
      x = x * 2.0 - 1.0;
      y = y * 2.0 - 1.0;

      var vpVec = new THREE.Vector3(x, y, 1);
      var result = viewer.impl.hitTestViewport(vpVec, false);
      console.log(result);

      if (result) {
        dummyData.push({
          icon: Math.round(Math.random() * 3),
          x: result.point.x,
          y: result.point.y,
          z: result.point.z,
        });
        window.dispatchEvent(new CustomEvent('newData', {
          'detail': dummyData
        }))
      } else {
        return
      }
      return result ? result.dbId : null;
    };

    function normalize(screenPoint) {
      var viewport = viewer.navigation.getScreenViewport();
      var n = {
        x: (screenPoint.x - viewport.left) / viewport.width,
        y: (screenPoint.y - viewport.top) / viewport.height
      };
      return n;
    }

这可能吗?

【问题讨论】:

    标签: autodesk-forge


    【解决方案1】:

    这已经在原始插件中处理了 - 只需将您自己的处理程序附加到下面的点击回调中,对标记执行命中测试:

        this.onMouseMove = function(event) {
          if(this.line3d){
            this.update_DivLabel('onMarkupMove');
            this.updateHitTest(event);
          }
        }
    
        this.onClick = function(event) {
            this.updateHitTest(event);
            if (!this.hovered) return;
            this.selected = this.hovered; //
            //your own callback goes here
        }
    

    并在此处调整以微调命中测试精度:

    function markup3d(viewer, options) {
        this.raycaster.params.PointCloud.threshold = 5; // hit-test markup size.  Change this if markup 'hover' doesn't work
        this.size = 150.0; // markup size.  Change this if markup size is too big or small
    

    原始的实时样本也通过显示悬停标签来处理点击:

    【讨论】:

    • 很遗憾,这种方法不起作用。问题是当我不指向光标时,悬停不起作用。他使用相机悬停,我需要移动模型以更改选定的图钉。
    • 为了将鼠标悬停在图钉上,您需要对它们进行缩放,然后单击画布上的某个位置。
    • 就像我们在回答中所经历的那样,尝试调整 this.raycaster.params.PointCloud.threshold 以提高命中测试的准确性,但不得不承认我也不能完全获得非常令人满意的命中率
    • 我得到了一些结果。它通过双击图钉来工作。实际上,这就是它如何将相机的焦点更改为它并且它可以工作。但这仅适用于点相距很远的大型模型。所以我明白这不是一个解决方案,因为不是每个人都有大型模型,并且点可以彼此相邻。
    • 我们没有错过您的回答,我将达到的值更改为一些结果。
    猜你喜欢
    • 2021-11-26
    • 2020-10-04
    • 2022-12-14
    • 2023-04-07
    • 2021-11-12
    • 1970-01-01
    • 2022-01-14
    • 2021-03-03
    • 2021-05-29
    相关资源
    最近更新 更多