gpt4 book ai didi

javascript - A 型框架 : mouseenter/mouseleave for parent entity only

转载 作者:行者123 更新时间:2023-12-01 03:22:43 25 4
gpt4 key购买 nike

我有一个“目标圆”组件,它是一个简单的圆,外面有一个圆环。我正在尝试获取整个组件的 mouseenter 和 mouseleave 事件,但附加到子实体的父元素的事件监听器仅在光线转换器击中某些物体时触发.

我尝试了各种方法来放置不可见的 HitTest 圆圈/环来尝试缓解问题,但它们都有一个核心问题,即为子实体触发多个进入/离开事件。

是否可行/仅获取进入/离开整个父实体的事件的最佳方法是什么?

演示:https://output.jsbin.com/tucuxas/quiet

<!DOCTYPE html>
<html>
<head>
<script src="https://aframe.io/releases/0.6.0/aframe.min.js"></script>
<script>
AFRAME.registerComponent('target-circle', {
schema: {
position: {type: 'vec3', default: {x: 0, y: 0, z: 0}}
},

init: function() {
var el = this.el;

el.setAttribute('position', this.data.position);
el.object3D.lookAt(new THREE.Vector3(0, 0, 0));

var outerRing = document.createElement('a-entity');
outerRing.setAttribute('class', 'outerRing');
outerRing.setAttribute('material', {
color: 'black'
});
outerRing.setAttribute('geometry', {
primitive: 'ring',
radiusInner: '1.2',
radiusOuter: '1.4'
});

var innerCircle = document.createElement('a-entity');
innerCircle.setAttribute('class', 'innerCircle');
innerCircle.setAttribute('material', {
color: 'black'
});
innerCircle.setAttribute('geometry', {
primitive: 'circle',
radius: '0.3'
});

el.appendChild(outerRing);
el.appendChild(innerCircle);

el.addEventListener('mouseenter', function() {
console.log('mouseenter');
});

el.addEventListener('mouseleave', function() {
console.log('mouseleave');
});
}
});
</script>
</head>
<body>
<a-scene>
<a-entity target-circle='position: 0 3 -10'></a-entity>
<a-entity camera look-controls>
<a-entity id="cursor" cursor="fuse: false;" material="color: black; shader: flat;"
position="0 0 -1"
geometry="primitive: ring; radiusInner: 0.001; radiusOuter: .005; "></a-entity>
</a-entity>
</a-scene>
</body>
</html>

最佳答案

虽然 SamB 的 anwser 在这种情况下是正确的,但我不确定在 css 中阻止指针事件是否适用于所有光线转换器(即使它应该),这是我将子项包装在容器实体中的想法,仅用于光线转换:

因为您的整个实体由一个环和内部的一个小圆圈组成,所以父实体只是子实体的空支架。
当您离开圆环时,将触发 mouseleave 事件,因为圆环和圆圈之间实际上什么也没有。如果您想填充空间(二维),您需要:

  • 创建一个子实体,它将是一个不可见的圆,其半径为外环。看不见的手段opacity = 0 ,不是visible = false (因为visible属性负责渲染,而不是visibility),并将其放置在其他子项的前面。
  • 使父实体成为圆形基元,并具有与上述相同的属性。

如果您想将其填充在 3D 空间中,而不是圆形,请创建一个不可见的圆柱体,薄如纸,这样它就可以阻挡来自各个侧面的光线转换。
工作 fiddle here .

关于javascript - A 型框架 : mouseenter/mouseleave for parent entity only,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45063082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com