Эффективный способ перевести камеру Долли - PullRequest
0 голосов
/ 03 октября 2019

В настоящее время у меня есть VR-камера, прикрепленная к тележке, чтобы можно было перемещать и вращать. Я пытаюсь перевести тележку на основе входов геймпада относительно ориентации камеры (которая связана с гарнитурой VR).

Я также стараюсь не допустить, чтобы тележка наклонилась вверх иливниз относительно камеры.

Мой текущий код выглядит примерно так:

this.camerDirectionVector = new THREE.Vector3()
this.camera.getWorldDirection(this.cameraDirectionVector)
this.moveVec.y = 0
this.dolly.translateOnAxis(this.cameraDirectionVector, this.gamepad.axes[0] * this.moveSpeed)

Это прекрасно подходит для перемещения тележки в направлении, куда указывает камера (минус вращение y).

Что я не могу понять, так это как перевести тележку «влево и вправо» относительно камеры на основе дополнительного входа геймпада.

1 Ответ

0 голосов
/ 04 октября 2019

Судя по комментариям по вопросу, я понимаю, что понимаю. Если нет, оставьте комментарий, и я обновлю этот ответ.

Насколько я понимаю, вы хотите иметь возможность перемещаться влево и вправо по отношению к камере , все без изменения направления 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, напримерты делал раньше, если хочешь).

...