【问题标题】:How to get marker position (x,y) AR.js如何获取标记位置(x,y)AR.js
【发布时间】:2020-07-29 00:50:54
【问题描述】:

如何在 ARjs 中获取标记位置?

示例:找到标记后,我想知道他在屏幕上的位置(X,Y)。

我尝试使用getBoundingClientRect(),但它不适用于标记

我的问题:我有 4 个标记,它们有一个类似 (1,2,3,4) 的序列,如果这个序列是错误的 (1,3,2,4),系统必须识别哪里出错。因此,如果标记 1 的位置 X = 10,则下一个标记必须位于位置 X = 11。

我的 HTML 代码:

<!DOCTYPE html>
<html lang="pt" dir="ltr">
    <head>
        <meta charset="utf-8">
        <title>Project AR-JS</title>
        <link rel="stylesheet" type="text/css" href="index.css">
        <script src='index.js'></script>
        <link href="https://fonts.googleapis.com/css2?family=Baloo+Paaji+2:wght@500&display=swap" rel="stylesheet">
        <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script>
        <script src="https://raw.githack.com/AR-js-org/AR.js/3.0.2/aframe/build/aframe-ar-nft.js"></script>
    </head>
    <body>



        <a-scene arjs='debudUIEnabled: false;'>

            <a-marker id="letraU" preset="pattern" type="pattern" url="https://raw.githubusercontent.com/FelippeAlves/project-words-AR/master/pattern-marker_U.patt">

            </a-marker>
            <a-marker id="letraR" preset="pattern" type="pattern" url="https://raw.githubusercontent.com/FelippeAlves/project-words-AR/master/pattern-marker_R.patt">

            </a-marker>
            <a-marker id="letraS" preset="pattern" type="pattern" url="https://raw.githubusercontent.com/FelippeAlves/project-words-AR/master/pattern-marker_S.patt">

            </a-marker>
            <a-marker id="letraO" preset="pattern" type="pattern" url="https://raw.githubusercontent.com/FelippeAlves/project-words-AR/master/pattern-marker_O.patt">

            </a-marker>
        </a-scene>

    </body>
</html>

【问题讨论】:

    标签: javascript aframe ar.js jsartoolkit


    【解决方案1】:

    由于您的代码在 A-Frame 中(使用 AR.js):

    我们可以编写一个单独的组件并将其附加到 A-Frame 场景中的实体元素:.tick() 处理程序将获取每帧更新的位置,并使用 Three.js 将标记位置值作为 Three.js Vector3 A-Frame 实体的对象并使用 .distanceTo() 方法查找距离。

    参考:https://threejs.org/docs/#api/en/math/Vector3.distanceTo

    AFRAME.registerComponent("标记距离", {

    tick: function () {
        this.markerDistance()
    },
    markerDistance: function () {
    
        var marker1Pos, marker2Pos
    
        var marker1 = document.querySelector("#letraU")
        var marker2 = document.querySelector("#letraR")
    
    
        marker1Pos = new THREE.Vector3();
        marker1.object3D.getWorldPosition(marker1Pos);
    
        marker2Pos = new THREE.Vector3();
        marker2.object3D.getWorldPosition(marker2Pos);
    
        //distance
        this.d = marker1Pos.distanceTo(marker2Pos);
        console.log("distance" + this.d)
    
    
    }
    

    });

    【讨论】:

      【解决方案2】:

      Jsartoolkit5

      AR.js 内部基于 jsartoolkit5。如果您想检索位置(标记的中心),您可以使用事件侦听器轻松完成。在 jsartoolkit5 中假设你已经初始化了 ARController 并且你有它的一个实例 -> arController:

              arController.addEventListener('getMarker', function(ev) {
                  console.log('marker pos: ', ev.data.marker.pos);
                  });
      

      这对模式标记有效。

      AR.js

      如果是 AR.js,则在您创建 ArToolkitSource 的新实例后:

          var arToolkitSource = new THREEx.ArToolkitSource({
      
                  sourceType : 'webcam',
              })
      

      在onReady()函数中监听Pattern(或Barcode)标记的传入数据:

          arToolkitSource.init(function onReady(){
      
            console.log(arToolkitContext.arController);
              if( arToolkitContext.arController !== null ){
                arToolkitContext.arController.addEventListener('getMarker', function(ev) {
                console.log('marker pos: ', ev.data.marker.pos);
                });
              }
          })
      

      您将在控制台中收听数据。

      其他信息

      请注意,如果您想检索其他类型标记的数据,请使用此侦听器:

      getMultiMarker 用于多个标记

      getMultiMarkersSub 为下属多标记

      getNFTMarkers 用于 NFT 标记(注意此类标记没有 pos !!)

      工作示例

      看看这个gist

      【讨论】:

      • 我试过但没有用var markerLetraU = document.getElementById('letraU'); var arToolkitSource = new THREEx.ArToolkitSource({ sourceType : 'webcam', }); arToolkitSource.init(function onReady(){ console.log(arToolkitContext.markerLetraU); if( arToolkitContext.markerLetraU !== null ){ arToolkitContext.markerLetraU.addEventListener('marketFound', function(ev) { console.log('marker pos: ', ev.data.marker.pos); }); } })
      • 它不起作用,因为 markerLetraU 不是 ARController。当我有一点时间时,我将添加一个指向要点的链接。
      • 如何创建 ARController ?
      • 我添加了要点,但我看到你改变了你的问题,你没有要求 aframe 部分,你是通用的,无论如何代码库是基于 Three.js 的,所以可以这样做aframe-ar.js 也是如此。如果您有问题,我也可以提供帮助。
      • 感谢您的帮助,但我尝试使用您的代码,但它不起作用。我会更好地解释我的问题
      猜你喜欢
      • 1970-01-01
      • 2016-05-07
      • 2017-08-28
      • 2011-01-30
      • 2022-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多