gltf cursor-listener A-frame 中的点击事件
gltf cursor-listener click event in A-frame
我无法弄清楚为什么游标侦听器对除我的 gltf 模型之外的所有实体都能正常工作。
这是我的 html
<div id="myEmbeddedScene">
<a-scene embedded="">
<a-assets>
<a-asset-item id="ducks" src="../images/test.glb"></a-asset-item>
</a-assets>
<a-box cursor-listener color="#CCC" width="3" depth="3" height="0.1" position="0 0 -2"></a-box>
<a-entity cursor-listener id="duck" gltf-model="#ducks" position="0 0.1 -2" rotation="0 -90 0"></a-entity>
<a-camera>
<a-cursor></a-cursor>
</a-camera>
</a-scene>
</div>
这里是来自 a-frame 的光标侦听器组件
AFRAME.registerComponent('cursor-listener', {
init: function () {
this.el.addEventListener('click', function (evt) {
console.log('I was clicked');
});
}
});
控制台日志对盒子实体来说很好,但对 gltf 模型来说却不是。请问有人可以提供他们的建议吗?
您已 运行 进入 issue described here:加载模型后,需要刷新用于检测点击的光线投射器,以便它了解模型。
我们有一个适用于 A-Frame 0.8.0 的 more robust solution on the way,但与此同时,您可以通过以下方式解决该问题:
AFRAME.registerComponent('raycaster-autorefresh', {
init: function () {
var el = this.el;
this.el.addEventListener('model-loaded', function () {
var cursorEl = el.querySelector('[raycaster]');
cursorEl.components.raycaster.refreshObjects();
});
}
});
然后您需要将 raycaster-autorefresh
添加到您的场景元素。这是一个Codepen showing the solution.
我无法弄清楚为什么游标侦听器对除我的 gltf 模型之外的所有实体都能正常工作。
这是我的 html
<div id="myEmbeddedScene">
<a-scene embedded="">
<a-assets>
<a-asset-item id="ducks" src="../images/test.glb"></a-asset-item>
</a-assets>
<a-box cursor-listener color="#CCC" width="3" depth="3" height="0.1" position="0 0 -2"></a-box>
<a-entity cursor-listener id="duck" gltf-model="#ducks" position="0 0.1 -2" rotation="0 -90 0"></a-entity>
<a-camera>
<a-cursor></a-cursor>
</a-camera>
</a-scene>
</div>
这里是来自 a-frame 的光标侦听器组件
AFRAME.registerComponent('cursor-listener', {
init: function () {
this.el.addEventListener('click', function (evt) {
console.log('I was clicked');
});
}
});
控制台日志对盒子实体来说很好,但对 gltf 模型来说却不是。请问有人可以提供他们的建议吗?
您已 运行 进入 issue described here:加载模型后,需要刷新用于检测点击的光线投射器,以便它了解模型。
我们有一个适用于 A-Frame 0.8.0 的 more robust solution on the way,但与此同时,您可以通过以下方式解决该问题:
AFRAME.registerComponent('raycaster-autorefresh', {
init: function () {
var el = this.el;
this.el.addEventListener('model-loaded', function () {
var cursorEl = el.querySelector('[raycaster]');
cursorEl.components.raycaster.refreshObjects();
});
}
});
然后您需要将 raycaster-autorefresh
添加到您的场景元素。这是一个Codepen showing the solution.