当前位置: 首页 > 文档资料 > A-Frame 中文文档 >

光标

优质
小牛编辑
135浏览
2023-12-01

光标组件允许我们通过点击和凝视与实体交互。光标组件被用于 光线投射(raycaster)来实现:

  • 监听鼠标点击事件和基于凝视的行为。
  • 仅捕获第一个相交实体。
  • 发出特殊的鼠标和悬停事件(例如,与鼠标向下/向上/进入/离开相关)。
  • 有更多的悬停状态。

当鼠标单击时,与光标相交的最近可见实体(如果有)将发出 单击事件。注意光标组件只是应用了光线投射行为。要为光标提供形状或外观,可以应用 geometry和 material组件。

例子

例如,我们可以创建一个固定在屏幕中心的环形光标。为了将光标固定在屏幕上,使光标始终显示在任何地方,我们将其作为活动 相机(camera)的一个子实体。我们把它放在相机前面,在负Z轴上。当光标单击box时,我们可以监听click事件。

            <a-entity  camera>
            <a-entity  cursor=  "fuse: true; fuseTimeout: 500"
            
            position="0 0 -1"
            geometry="primitive: ring; radiusInner: 0.02; radiusOuter: 0.03"
            material="color: black; shader: flat">
            </a-entity>
            </a-entity>
            
            <a-entity  id=  "box"  cursor-listener  geometry=  "primitive: box"  material=  "color: blue"></a-entity>
          
            // Component to change to random color on click.
            AFRAME.registerComponent('cursor-listener', {
            init:  function(  ){
            varCOLORS = ['red','green','blue'];
            this.el.addEventListener('click',  function(  evt){
            varrandomIndex =Math.floor(Math.random() * COLORS.length);
            this.setAttribute('material','color', COLORS[randomIndex]);
            console.log('I was clicked at: ', evt.detail.intersection.point);
            });
            }
            });

属性

Note, to further customize the cursor component, we can set the properties of the raycaster component.

属性描述默认值
fuse光标是否是基于凝视动作的桌面上为,移动设备为true
fuseTimeout触发基于凝视的单击事件之前要等待多长时间(以毫秒为单位)。1500

事件(Events)

事件描述
click如果单击当前相交实体(无论是通过鼠标点击还是通过凝视动作),则从光标和相交实体上发出。
fusing当开始凝视时和凝视中,从光标和相交实体上发出。
mousedown在canvas元素上的鼠标按下时,从光标和相交实体(如果有)上发出。
mouseenter当光标与实体相交时,从光标和相交实体(如果有)上发出。
mouseleave当光标不再与先前相交的实体相交时,从光标和相交实体(如果有)上发出。
mouseup在canvas元素上的鼠标松开时,从光标和相交实体(如果有)上发出。

状态(States)

光标将在某些事件上向光标实体添加状态:

状态描述
cursor-fusing当光标停留在某个实体上时。
cursor-hovering当光标悬停在另一个实体上时添加。

光标将在某些事件上向相交实体添加状态:

状态描述
cursor-hovered当光标悬停在相交实体上时添加到该实体。

通过光线投射(Raycaster)组件配置光标

光标建立在光线投射组件之上并依赖于该组件。如果要自定义光标的光线投射部分,可以通过更改 光线投射组件属性。假设我们希望设置最大距离,减少检查相交点的频率,并设置可单击的对象:

            <a-entity  cursor  raycaster=  "far: 20; interval: 1000; objects: .clickable"></a-entity>
          

基于凝视的光标(fuse-based或gaze-based)

如果我们将光标设置为fuse-based,那么如果用户凝视一个实体一段时间,光标将触发一次单击。想象一下,一束激光绑在用户的头上,然后激光延伸到场景中。如果用户盯着一个实体足够长的时间,然后光标将触发单击。

基于凝视的VR交互的优势在于,它不需要头戴设备以外的额外输入设备,缺点是它需要用户经常转头。

添加视觉反馈

要向光标添加视觉反馈以显示光标单击或凝视发生的时间,可以使用 动画系统。当光标与实体相交时,它将发出一个事件,并且动画系统将使用 begin属性来处理该事件:

            <a-entity  cursor=  "fuse: true; fuseTimeout: 500"
            
            position="0 0 -1"
            geometry="primitive: ring"
            material="color: black; shader: flat">
            <a-animation  begin=  "click"  easing=  "ease-in"  attribute=  "scale"
            
            fill="backwards"from="0.1 0.1 0.1"to="1 1 1"></a-animation>
            <a-animation  begin=  "cursor-fusing"  easing=  "ease-in"  attribute=  "scale"
            
            fill="forwards"from="1 1 1"to="0.1 0.1 0.1"></a-animation>
            </a-entity>