Three.js - Как повернуть объект, чтобы посмотреть на одну точку и ориентироваться в другую
Я новичок в трех .js и 3d-программировании в целом, так что это может показаться очень простым вопросом. В идеале я надеюсь, что ответ поможет мне понять основные принципы.
У меня есть объект, который должен "указывать" в другой точке (в этом случае простое начало), что легко можно сделать с помощью функции Object3D.lookAt(point)
. Это хорошо указывает на ось Z объекта в точке.
Я также хочу повернуть мой объект, называемый looker
, вокруг своей оси Z так, что его ось X указывает в целом на другой объект, refObj
. Я знаю, что ось X не может указывать непосредственно на refObj
, если только этот объект не имеет прямого угла с началом. Я хочу, чтобы ось X looker
лежала на плоскости, созданной origin
, refObj
и looker
, как показано ниже:
![diagram of problem]()
Самый простой способ сделать поворот - это изменить looker.rotation.z
, но я не знаю, как рассчитать, какое значение должно быть.
В общем, мне нужна расширенная версия функции lookAt
, которая берет вторую координату, к которой будет ориентирована ось X. Что-то вроде этого:
function lookAtAndOrient(objectToAdjust, pointToLookAt, pointToOrientXTowards)
{
// First we look at the pointToLookAt
objectToAdjust.lookAt(pointToLookAt);
// Then we rotate the object
objectToAdjust.rotation.z = ??;
}
Я создал jsFiddle с примером, описанным выше
Ответы
Ответ 1
Что вы действительно говорите, вы хотите, чтобы ось y объекта (объект up
-vector) была ортогональна плоскости.
Все, что вам нужно сделать, это установить объект up
-vector перед вызовом lookAt( origin )
.
Вы вычисляете желаемый вектор up
, беря перекрестное произведение двух векторов, которые, как вы знаете, лежат в плоскости.
Вот рабочая скрипка: http://jsfiddle.net/rQasN/43/
Обратите внимание, что для вашей проблемы есть два решения, поскольку и вычисленный вектор, и его отрицание будут ортогональными плоскости.
EDIT: скрипка обновлена до трёх. js r.71