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