Three.js: получить направление, в котором камера смотрит

Я уверен, что этот вопрос повторялся много раз, однако я не могу найти ответы на свои конкретные проблемы!

Я создаю игру в использовании html5 и THREE.js, и у меня есть камера, которая вращается с порядком эйлера "YXZ".

Это значит, что камера вращается вверх, вниз, влево и вправо, как голова. Как в первом взгляде лица.

При этом порядке эйлера свойство z ​​в Camera.rotation не используется (всегда 0). x используется для указания высоты тона или широты в радианах, а y используется для обозначения долготы.

У меня есть ряд целей, перемещающихся вокруг пользователя сферически, при этом камера постоянно находится в центре этой сферы. Допустим, что сфера имеет радиус 1000.

Моя цель - рассчитать угол между тем, где находится камера LOOKING, и где находится цель.

Я написал этот код, который вычисляет угол между двумя векторами:

var A = new THREE.Vector3(1,0,0);
var B = new THREE.Vector3(0,1,0);

var theta = Math.acos( A.dot(B) / A.length() / B.length() );

// theta = PI/2;

У меня есть вектор цели (цели [0].position).

Дело в том, что я не могу найти способ получить вектор того, где выглядит камера.

Я посмотрел на Vector3.applyProjection и applyEuler методы, и играл вокруг, но все еще не могу получить хороших результатов.

Я считаю, что сначала нужно изменить порядок эйлеров на "XYZ" до того, как будут сделаны какие-либо прогнозы? Я пробовал, и я не уверен, как это сделать, документация довольно трудно понять.

Скажите, смотрит ли камера прямо вправо, тогда мне нужно получить вектор, который находится на расстоянии RADIUS от центра в направлении текущего вращения.

Итак, у меня получится 2 вектора, которые я могу делать вычислениями на!

Благодарим вас за продвинутый!

Ответ 1

Камера смотрит вниз по своей внутренней отрицательной оси Z. Поэтому создайте вектор, направленный вниз по отрицательной оси Z:

var vector = new THREE.Vector3( 0, 0, - 1 );

Теперь примените то же вращение к вектору, который применяется к камере:

vector.applyQuaternion( camera.quaternion );

Вы можете получить angular в радианах к цели следующим образом:

angle = vector.angleTo( target.position );

ОБНОВЛЕНИЕ: теперь вы можете получить направление, в котором камера выглядит так:

var vector = new THREE.Vector3(); // create once and reuse it!
...
camera.getWorldDirection( vector );

Примечание: передавая vector для сохранения результата, метод не должен будет создавать новый THREE.Vector3 каждый раз при вызове метода.

Обновлено до three.js r.107

Ответ 2

Я долгое время пытался выяснить очевидный вопрос капитана.

Вот как он, наконец, работал у меня:

    vector = camera.getWorldDirection();
    theta = Math.atan2(vector.x,vector.z);

theta находится в радианах. Вот как я ориентирую свой игровой персонаж так же, как перед камерой. GetWorldDirection() - довольно новая опция на камере.

Ответ 3

Я не могу комментировать, но fluffybunny отвечает отлично. getWorldDirection(), а затем изменение этого вектора на радианы - это путь.

Ответ 4

пушистый кролик прибил его. С небольшим изменением его удивительной идеи, вы можете получить поворот в градусах:

var vector = camera.getWorldDirection();
angle = THREE.Math.radToDeg( Math.atan2(vector.x,vector.z) );