Я бы не использовал "родные" элементы управления, основанные на raycastters. Большинство курсоров не работают должным образом в ar.js (по крайней мере, по моему опыту).
Я бы использовал любую библиотеку обнаружения жестов js. В этом примере я использовал hammer.js .
hammer.js регистрирует объект, который генерирует события при обнаружении жестов pan
, swipe
, pinch
. Я создал объект со слушателями в компоненте a-frame.
1) При обнаружении pan
я просто поворачиваю модель в зависимости от направления (2 - влево, 4 - вправо, 8 - вверх, 16 - вниз)
2) При обнаружении pinch
я меняю масштаб, в зависимости от значения события, вы можете умножить его на любой коэффициент. Компонент ниже:
AFRAME.registerComponent("foo",{
init:function() {
var element = document.querySelector('body');
this.marker = document.querySelector('a-marker')
var model = document.querySelector('a-collada-model');
var hammertime = new Hammer(element);
var pinch = new Hammer.Pinch(); // Pinch is not by default in the recognisers
hammertime.add(pinch); // add it to the Manager instance
hammertime.on('pan', (ev) => {
let rotation = model.getAttribute("rotation")
switch(ev.direction) {
case 2:
rotation.y = rotation.y + 4
break;
case 4:
rotation.y = rotation.y - 4
break;
case 8:
rotation.x = rotation.x + 4
break;
case 16:
rotation.x = rotation.x - 4
break;
default:
break;
}
model.setAttribute("rotation", rotation)
});
hammertime.on("pinch", (ev) => {
let scale = {x:ev.scale, y:ev.scale, z:ev.scale}
model.setAttribute("scale", scale);
});
}
});
Рабочий глюк здесь . В моем примере я также проверяю, видим ли маркер, подумал, что это может быть удобно.