如何检测何时在 AR.js 中找到标记
How to detect when a marker is found in AR.js
我正在尝试检测何时在 ar.js 中使用 found/lost 标记,同时使用帧。
从我在 source code 中看到的情况来看,当找到标记时,应该触发一个 'getMarker' 事件,而且 artoolkit 似乎会调度一个 markerFound 事件。
我试图在 <a-scene>
或 <a-marker>
上收听那些事件,但看来我要么弄错了,要么我需要更深入地了解 arController
],或 arToolkit
个对象。
当我记录场景或标记时,我只获得对属性的引用,这些属性似乎没有附加上述对象。(如 marker.arController
,或 marker.getAttribute('artoolkitmarker').arController
)
有没有人试过这个并且有任何提示如何做到这一点?
PR303 在找到和丢失标记时引入事件
markerFound
markerLost
您只需添加一个事件侦听器即可使用它们:
anchorRef.addEventListener("markerFound", (e)=>{ // your code here}
像这样的简单设置:
<a-marker id="anchor">
<a-entity>
</a-marker>
示例here。
请注意,从 9 月 18 日开始,您需要使用 dev
分支才能使用上述内容。
原始答案 - 如果您想手动完成
通过检查标记是否在需要时可见(其他事件或勾选),可以检测是否找到标记:if(document.querySelector("a-marker").object3D.visible == true)
例如:
init: function() {
this.marker = document.querySelector("a-marker")
this.markerVisible = false
},
tick: function() {
if (!this.marker) return
if (this.marker.object3D.visible) {
if (!this.markerVisible) {
// marker detected
this.markerVisible = true
}
} else {
if (this.markerVisbile) {
// lost sight of the marker
this.markerVisible = false
}
}
}
正如 adrian li 指出的那样,它不适用于 a-marker-camera
,仅适用于 a-markers
我带着一个肮脏的 hack 深入内部,请记住,我提供的可能还不够,因为每次找到标记时都会调用事件,遗憾的是我找不到要挂钩的事件进入丢失的标记。
const arController = document.querySelector("a-scene").systems.arjs._arSession.arContext.arController;
arController.addEventListener("getMarker", (evt) => {
const markerType = evt.data.type;
const patternType = 0;
//console.log("onMarkerFound!!");
if (markerType == patternType) {
//console.log("onMarkerFound out pattern!!");
//Do stuff...
}
});
我正在尝试检测何时在 ar.js 中使用 found/lost 标记,同时使用帧。
从我在 source code 中看到的情况来看,当找到标记时,应该触发一个 'getMarker' 事件,而且 artoolkit 似乎会调度一个 markerFound 事件。
我试图在 <a-scene>
或 <a-marker>
上收听那些事件,但看来我要么弄错了,要么我需要更深入地了解 arController
],或 arToolkit
个对象。
当我记录场景或标记时,我只获得对属性的引用,这些属性似乎没有附加上述对象。(如 marker.arController
,或 marker.getAttribute('artoolkitmarker').arController
)
有没有人试过这个并且有任何提示如何做到这一点?
PR303 在找到和丢失标记时引入事件
markerFound
markerLost
您只需添加一个事件侦听器即可使用它们:
anchorRef.addEventListener("markerFound", (e)=>{ // your code here}
像这样的简单设置:
<a-marker id="anchor">
<a-entity>
</a-marker>
示例here。
请注意,从 9 月 18 日开始,您需要使用 dev
分支才能使用上述内容。
原始答案 - 如果您想手动完成
通过检查标记是否在需要时可见(其他事件或勾选),可以检测是否找到标记:
if(document.querySelector("a-marker").object3D.visible == true)
例如:
init: function() {
this.marker = document.querySelector("a-marker")
this.markerVisible = false
},
tick: function() {
if (!this.marker) return
if (this.marker.object3D.visible) {
if (!this.markerVisible) {
// marker detected
this.markerVisible = true
}
} else {
if (this.markerVisbile) {
// lost sight of the marker
this.markerVisible = false
}
}
}
正如 adrian li 指出的那样,它不适用于
a-marker-camera
,仅适用于 a-markers
我带着一个肮脏的 hack 深入内部,请记住,我提供的可能还不够,因为每次找到标记时都会调用事件,遗憾的是我找不到要挂钩的事件进入丢失的标记。
const arController = document.querySelector("a-scene").systems.arjs._arSession.arContext.arController;
arController.addEventListener("getMarker", (evt) => {
const markerType = evt.data.type;
const patternType = 0;
//console.log("onMarkerFound!!");
if (markerType == patternType) {
//console.log("onMarkerFound out pattern!!");
//Do stuff...
}
});