在相机旋转后定位激光控制实体

时间:2017-07-07 22:15:15

标签: aframe webvr

我有以下激光控制代码,当摄像机在进入VR模式后直视前方时,它们处于完美位置。

<a-entity position="0.25 1.25 -0.2" class="laser-controls">
  <a-entity laser-controls="hand: right" line="color: red"></a-entity></a-entity>

问题是:当我旋转头部(相机)时,我想让控件顺利地跟随我的头部旋转(我有一些代码,看看旋转是否大于110度)。我不希望控制器成为摄像机的一部分,因为它们应该保持自己的独立旋转。我喜欢的是Oculus Home(Gear VR)中控制器模型的行为。

我如何实现这一点是我的自定义组件,让我们说我的tick函数,每两秒调用一次(该代码已经运行)。

谢谢!

1 个答案:

答案 0 :(得分:0)

如何使用getAttribute()检查相机组件和激光控制实体的旋转?然后你可以检查差异是否超过110度:

let angle = laser.getAttribute('rotation');
if (camera.getAttribute('rotation').y - laser.getAttribute('rotation').y>110){
   angle.y++;
   laser.setAttribute('rotation',angle);
} else if(camera.getAttribute('rotation').y - laser.getAttribute('rotation').y<-110){
   angle.y--;
   laser.setAttribute('rotation',angle);
}

<强>更新
如果您想将控制器放在靠近头部的位置您可以:

1.而不是angle.y++/--将其更改为相机的旋转。您也可以将其x / y位置更改为靠近相机(如camera.position.x + 0.5)

2.但以上是即时的,如果你想让它平滑,你可以使用动画组件,当增量度> 110度时,设置动画属性移动到相机组件位置/旋转,发出开始事件,禁用旋转检查,侦听动画结束事件,并启用检查。有点像这样:

init: function(){
  this.check = true;
  let check = this.check;
  animationel.addEventListener('animationend',function(){
      check = true;
  });
},tick(){
    if(this.check){
        if(rotationCheck()){
           this.check = false;
        }
    }
  }