Позиционирование объекта управления лазером после поворота камеры

У меня есть следующий код для элементов управления лазером, которые идеально расположены, когда камера смотрит прямо вперед после входа в режим 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).

Как мне добиться этого, это мой пользовательский компонент, скажем, в моей функции тика, которая вызывается каждые две секунды (этот код уже работает).

Спасибо!


person Chris Car    schedule 07.07.2017    source источник


Ответы (1)


Как насчет использования 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;
        }
    }
  }
person Piotr Adam Milewski    schedule 07.07.2017
comment
Спасибо. Но этот код меняет просто поворот контроллера. Если контроллер находится с правой стороны чуть ниже камеры при первоначальном вращении, и если я поверну голову на 110 градусов, он просто повернёт модель контроллера, но не будет двигаться рядом с моим новым вращением головы (где она находилась. в исходной позе). Если я поверну голову, то контроллер окажется слева от камеры, потому что он просто остался там, где был. - person Chris Car; 08.07.2017
comment
Я добавил кодовое слово codepen.io/anon/pen/awQRdm Контроллер не остается кроме камера, протестированная в Gear VR с контроллером. Я думаю, что такое поведение контроллера могло бы стать компонентом, так как эта функциональность нужна многим людям. - person Chris Car; 11.07.2017