2009-10-25 1 views
4

Предположим, у меня есть две точки в трехмерном пространстве (a и b) и фиксированный вектор оси/единицы, называемый n.Вращающаяся матрица, которая минимизирует расстояние

Я хочу создать матрицу поворота, которая минимизирует расстояние между точкой а (без вращения) и повернутой точкой b.

например:

Q := matrix_from_axis_and_angle (n, alpha); 

find the unknown alpha that minimizes sqrt(|a - b*Q|) 

Btw - Если решение/алгоритм может быть проще выражается единичными-кватернионов идти вперед и использовать их. Я просто использовал матрицы, чтобы сформулировать свой вопрос, потому что они более широко используются.


О - Я знаю, что есть некоторые случаи выродились (а или б, лежащий в точности в соответствии с п ЭСТОМ.) Они могут быть проигнорированы. Я просто ищу случай, когда можно вычислить одно решение.

+0

Предполагая, что все обороты имеют о происхождении, если вы вращаете b так, чтобы он попадал на вектор в a, это не обеспечивало минимальное (или максимальное) расстояние? –

+0

Или мы предполагаем, что n исправлено? –

+1

n исправлено ... к сожалению, я не могу его изменить. В противном случае это было бы очень просто. –

ответ

5

звучит довольно легко. Предположим, что единичный вектор n влечет вращение вокруг прямой, параллельной n, через точку x0. Если x0! = Начало координат, переведите систему координат на -x0, чтобы получить точки a' и b' относительно нового начала координат системы координат 0 и использовать эти 2 точки вместо a и b.

1) вычислить вектор Ry = NXA

2) вычислить единичный вектор иу = единичный вектор в направлении RY

3) вычислить единичный вектор их = иу х

Теперь у вас триплет взаимно перпендикулярные единичные векторы ux, uy и n, которые образуют правую систему координат. Можно показать, что:

a = dot(a,n) * n + dot(a,ux) * ux 

Это потому, что единичный вектор иу параллельно RY, которая перпендикулярна как а и н.(из шага 1)

4) Рассчитать компоненты b вдоль единичных векторов ux, uy. компоненты a (ax, 0), где ax = dot (a, ux). b являются (bx, by), где bx = dot (b, ux), by = dot (b, uy). Из-за правильной системы координат ax всегда положителен, поэтому вам не нужно его вычислять.

5) Рассчитайте theta = atan2 (by, bx).

Ваша матрица вращения - это та, которая вращается по углу относительно системы координат (ux, uy, n) вокруг оси n.

Это дает вырожденные ответы, если a параллельна n (шаги 1 и 2) или если b параллельна n (шаги 4, 5).

+0

+1 для идентификации вырожденных случаев! – unutbu

2

Я думаю, вы можете перефразировать вопрос:

, что расстояние от точки до 2d круг в 3D пространстве.

ответ может быть найден here

так шаги, необходимые являются следующие:

  • вращая точку Ь вокруг вектора п дает вам 2d круг в 3D пространстве
  • используя выше , найдите расстояние до этого круга (и точки на круге)
  • точка на круге - это вращающаяся точка b, которую вы ищете.
  • вывести повернутом угол

... или что-то; ^)

2

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

Проект a и b в плоскость, перпендикулярную n, и решить проблему в двух измерениях. Вращение, которое вы получаете, - это поворот, необходимый для минимизации расстояния.

2

Пусть P - плоскость, перпендикулярная n. Мы можем найти проекцию в Р-плоскость, (и аналогично для б):

a' = a - (dot(a,n)) n 
b' = b - (dot(b,n)) n 

, где точка (а, п) является скалярным побочным продуктом и н

а» и Ь 'лежат в Р-плоскости.

Теперь мы уменьшили проблему до 2-х измерений. Ура!

Угол поворота между a и b равен углу (поворота), необходимому для поворота b вокруг оси n, чтобы быть ближе всего к a. (Подумайте о том, что тени b будут набрасываться на плоскость P).

Угол между «и Ь» легко найти:

dot(a',b') = |a'| * |b'| * cos(theta) 

Решите для тета.

Теперь вы можете найти матрицу вращения заданной тета и п здесь: http://en.wikipedia.org/wiki/Rotation_matrix

Jason S справедливо указывает на то, что, как только вы знаете, тета, вы все равно должны принять решение повернуть б по часовой стрелке или против часовой стрелки вокруг н-оси.

Величина, точка ((a x b), n), будет положительной величиной, если (a x b) лежит в том же направлении, что и n, а отрицательное, если (a x b) лежит в противоположном направлении. (Он никогда не равен нулю, если ни а, ни b не коллинеарны с n.)

Если (axb) лежит в том же направлении, что и n, то b необходимо повернуть по часовой стрелке на угол theta вокруг n-оси ,

Если (a x b) лежит в противоположном направлении, то b необходимо поворачивать по часовой стрелке на угол - вокруг оси n.

+0

Ваше значение тета уникально только в пределах 180 градусов; вам нужен какой-то способ выбрать тета или тета + 180 градусов. –

+0

При решении для угла между a 'и b', используя уравнение точечного произведения, принято считать, что theta находится между 0 и pi радианами. Пока a и b не коллинеарны с n, угол theta уникален. – unutbu

+0

Я понимаю это. Угол theta = inv_cos (...) уникален, по соглашению, обычно отображается в положительный диапазон [0, pi], как вы говорите.Но угол поворота, необходимый для решения этой проблемы, является единственным углом между диапазоном [0,2 * pi). Мой предыдущий комментарий был немного неправильным, вам нужно выбрать либо + тета, либо-тету. Один из этих углов будет колебаться b, поэтому он будет копланарным с векторами a и n. Другой угол не будет. –