如何获取标记位置 (x,y) AR.js
How to get marker position (x,y) AR.js
如何在 ARjs 中获取标记位置?
示例:当找到标记时,我想知道他在屏幕上的位置 (X,Y)。
我尝试使用 getBoundingClientRect()
但它不适用于标记
我的问题:我有 4 个标记,它们有一个类似 (1,2,3,4) 的序列,如果这个序列是错误的(1,3,2,4),系统必须识别在哪里错误的。所以如果标记 1 有 positionX = 10 下一个标记必须在 positionX = 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>
Jsartoolkit5
AR.js is based internally on jsartoolkit5。如果您想检索位置(标记的中心),您可以使用事件监听器轻松完成。在 jsartoolkit5 中假设你已经初始化了 ARController 并且你有它的一个实例 -> arController:
arController.addEventListener('getMarker', function(ev) {
console.log('marker pos: ', ev.data.marker.pos);
});
这对模式标记有效。
AR.js
在创建 ArToolkitSource 的新实例后 AR.js:
var arToolkitSource = new THREEx.ArToolkitSource({
sourceType : 'webcam',
})
监听 Pattern(或 Barcode)标记的传入数据 onReady()函数:
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 为下属 Multi Markers
getNFTMarkers 用于 NFT 标记(注意此类标记没有位置!!)
工作示例
看看这个gist
由于您的代码在 A 帧中(AR.js):
我们可以编写一个单独的组件并将其附加到 A-Frame 场景中的实体元素:.tick() 处理程序将在每一帧更新位置并使用 Three.js 获取标记位置值作为Three.js A 帧实体的 Vector3 对象并使用 .distanceTo() 方法查找距离。
参考:https://threejs.org/docs/#api/en/math/Vector3.distanceTo
AFRAME.registerComponent("marker-distance", {
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)
}
});
如何在 ARjs 中获取标记位置?
示例:当找到标记时,我想知道他在屏幕上的位置 (X,Y)。
我尝试使用 getBoundingClientRect()
但它不适用于标记
我的问题:我有 4 个标记,它们有一个类似 (1,2,3,4) 的序列,如果这个序列是错误的(1,3,2,4),系统必须识别在哪里错误的。所以如果标记 1 有 positionX = 10 下一个标记必须在 positionX = 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>
Jsartoolkit5
AR.js is based internally on jsartoolkit5。如果您想检索位置(标记的中心),您可以使用事件监听器轻松完成。在 jsartoolkit5 中假设你已经初始化了 ARController 并且你有它的一个实例 -> arController:
arController.addEventListener('getMarker', function(ev) {
console.log('marker pos: ', ev.data.marker.pos);
});
这对模式标记有效。
AR.js
在创建 ArToolkitSource 的新实例后 AR.js:
var arToolkitSource = new THREEx.ArToolkitSource({
sourceType : 'webcam',
})
监听 Pattern(或 Barcode)标记的传入数据 onReady()函数:
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 为下属 Multi Markers
getNFTMarkers 用于 NFT 标记(注意此类标记没有位置!!)
工作示例
看看这个gist
由于您的代码在 A 帧中(AR.js):
我们可以编写一个单独的组件并将其附加到 A-Frame 场景中的实体元素:.tick() 处理程序将在每一帧更新位置并使用 Three.js 获取标记位置值作为Three.js A 帧实体的 Vector3 对象并使用 .distanceTo() 方法查找距离。
参考:https://threejs.org/docs/#api/en/math/Vector3.distanceTo
AFRAME.registerComponent("marker-distance", {
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)
}
});