Три.js-как работают векторы up с lookAt()?

Я пытаюсь понять, как векторы up и lookAt () работают вместе в трех.js. Я настраиваю вектор вверх этого axisHelper, так что ось Y всегда указывает на целевой geo, который отмечает положение вектора вверх. Он работает так, как ожидалось для X и Y, вращая оси вокруг оси Z; и когда я пытаюсь настроить значение z вектора up, я ожидаю, что оси будут вращаться вокруг оси X, но ничего происходит.

http://jsfiddle.net/68p5r/4/ [Edit: я добавил geo, чтобы показать целевую позицию.]

У меня есть dat.интерфейс gui манипулирует вектором up для демонстрации, но проблема существует, когда я устанавливаю вектор вручную.

Я подозреваю, что проблема вокруг строки 74:

zControl.onChange(function(value) {
  axes.up.set(this.object.x, this.object.y, value);
  axes.lookAt(new THREE.Vector3(0, 0, 1));
});

когда я обновляю вектор вверх, я поручаю axisHelper обновить свою ориентацию на экране, переделав lookAt() вниз по оси Z. Изменение X и Y работает, как ожидалось, почему бы не Z?

(это также имеет место, если я использую geo вместо axisHelper:http://jsfiddle.net/68p5r/5/)

rotated axisHelper

3 ответов


когда вы называете Object.lookAt( vector ), объект поворачивается так, что его внутренняя ось z указывает на цель vector.

но этого недостаточно, чтобы указать ориентацию объекта, потому что сам объект все еще может "вращаться" по своей оси Z.

таким образом, объект затем "вращается" так, что его внутренняя ось y находится в плоскости его внутренней оси z и up вектор.

целевой вектор и up вектор, вместе, достаточны для однозначно укажите ориентацию объекта.

три.js r.63


подсказка: ось в 3.js всегда должен иметь длину единицы измерения; обязательно вызовите axis.normalize() в коде.


Я предполагаю, что ваш заголовок означал поворот на Z вместо X?

в любом случае, виновник, кажется,axes.lookAt(new THREE.Vector3(0, 0, 1)); Если вы измените что axes.lookAt(new THREE.Vector3(0, 1, 0)); для всех методов, то Y не вращается так, как ожидалось. Вы говорите помощнику оси смотреть вниз по определенной оси (в вашем случае Z). Поэтому значение Z не работает.

есть ли пример того, что вы пытаетесь выполнить, что может нам помочь?

возможно, кто-то еще может дать немного больше глубины объяснение того, что происходит. Надеюсь, мой ответ подтолкнет вас в правильном направлении.


вот как я пришел к пониманию проблемы:

векторы lookAt и up определяют ориентацию объекта следующим образом:

  1. сначала применяется вектор lookAt, который устанавливает вращения X и Y, фиксируя направление точек оси Z объекта.
  2. затем вектор up определяет, как объект вращается вокруг ось Z, чтобы установить направление точек оси Y объекта - это не повлияет на вращение X и Y на все.

в моем примере axisHelper смотрит вниз по своей синей оси Z в направлении вектора lookAt, который является точкой в пространстве в (0, 0, -1) - таким образом, вращения X и Y имеют уже. Единственное, что осталось сделать, это выяснить, как повернуть axisHelper вокруг своей оси Z, что означает установку точек X и Y вектора вверх-перемещение вектора вверх вперед и назад вдоль оси Z ничего не изменит.

здесь поиграйте с демонстрацией, иллюстрирующей эту взаимосвязь: синяя стрелка-это ось lookAt, а зеленая стрелка-ось up.

http://jsfiddle.net/68p5r/8/

lookat and up vector demo

 Links to jsfiddle.net must be accompanied by code