Судя по комментариям по вопросу, я понимаю, что понимаю. Если нет, оставьте комментарий, и я обновлю этот ответ.
Насколько я понимаю, вы хотите иметь возможность перемещаться влево и вправо по отношению к камере , все без изменения направления up
тележки.
Это на самом деле проще, чем кажется, и даже проще, потому что вам уже удобно перемещаться по оси.
Во-первых, поймите, чтокамера имеет свою собственную пространственную систему отсчета, где она находится в начале координат с направлением + Y up
и смотрит вниз по оси -Z. Имея это в виду, вы уже знаете «левую» и «правую» оси: -X (-1, 0, 0
) и + X (1, 0, 0
).
Но камера (особенно в VR) может небыть так хорошо выровнен в мировом пространстве, поэтому вам нужно преобразовать эти красивые однородные оси в мировые оси. Three.js делает это очень легко, используя Object3D.localToWorld
.
( Примечание: Object3D.localToWorld
разрушительно для ввода Vector3
. )
Вот функция дляполучить ориентированную по миру левую ось:
const getLeftWorld = (function(){
const localLeft = new THREE.Vector3(-1, 0, 0);
return function(vectorRef){ // you can give it a vector to overwrite
let out = vectorRef || new THREE.Vector3();
out.copy(localLeft);
camera.localToWorld(out);
return out;
};
))();
Вы можете создать аналогичную функцию для "правой" оси.
Имея новую ориентированную по миру левую ось в руке, вы можете перевестиДолли вдоль него, используя «скорость», заданную вашим входом контроллера. Перевод не изменит высоту тележки, хотя может изменить высоту, в зависимости от того, как камера наклонена во время вычислений (но вы можете просто обнулить компонент y
, напримерты делал раньше, если хочешь).