звучит довольно просто. Предположим, что единичный вектор n подразумевает поворот вокруг прямой, параллельной n через точку x0. Если x0! = Начало координат, переведите систему координат на -x0, чтобы получить точки a'
и b'
относительно начала координат новой системы координат 0, и используйте эти 2 точки вместо a и b.
1) рассчитать вектор ry = n x a
2) вычислить единичный вектор uy = единичный вектор в направлении ry
3) вычислить единичный вектор ux = uy x n
Теперь у вас есть триплет взаимно перпендикулярных единичных векторов ux, uy и n, которые образуют правую систему координат. Можно показать, что:
a = dot(a,n) * n + dot(a,ux) * ux
Это потому, что единичный вектор uy параллелен ry, который перпендикулярен как a, так и n. (с шага 1)
4) Рассчитать компоненты b вдоль единичных векторов ux, uy. Компоненты a: (ax, 0), где ax = точка (a, ux). Компоненты b: (bx, by), где bx = точка (b, ux), by = точка (b, uy). Из-за правосторонней системы координат топор всегда положителен, поэтому вам не нужно его вычислять.
5) Рассчитайте тета = atan2 (by, bx).
Ваша матрица вращения - это та, которая вращается на угол-тета относительно системы координат (ux, uy, n) вокруг оси n.
Это дает вырожденные ответы, если a параллельно n (шаги 1 и 2) или если b параллельно n (шаги 4, 5).