Три.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/)
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 определяют ориентацию объекта следующим образом:
- сначала применяется вектор lookAt, который устанавливает вращения X и Y, фиксируя направление точек оси Z объекта.
- затем вектор up определяет, как объект вращается вокруг ось Z, чтобы установить направление точек оси Y объекта - это не повлияет на вращение X и Y на все.
в моем примере axisHelper смотрит вниз по своей синей оси Z в направлении вектора lookAt, который является точкой в пространстве в (0, 0, -1) - таким образом, вращения X и Y имеют уже. Единственное, что осталось сделать, это выяснить, как повернуть axisHelper вокруг своей оси Z, что означает установку точек X и Y вектора вверх-перемещение вектора вверх вперед и назад вдоль оси Z ничего не изменит.
здесь поиграйте с демонстрацией, иллюстрирующей эту взаимосвязь: синяя стрелка-это ось lookAt, а зеленая стрелка-ось up.
Links to jsfiddle.net must be accompanied by code