Скажем, вы хотите повернуть A к B.
Возьмите перекрестное произведение AxB = C и нормализуйте его.
Теперь разбейте A на два компонента, один параллельный C и один нормальный:
...
Теперь построим вектор, нормальный к A и C (в правильном смысле):
...
Теперь вы можете построить повернутый вектор:
...
EDIT
Я чувствую себя идиотом. Правильный (и более простой) вывод -
F = C x A
G = cos(theta) A + sin(theta) F
EDIT:
Это работает по простой геометрии. C является нормалью к плоскости, содержащей A и B. F находится в плоскости, а нормаль к A. Таким образом, любой вектор в плоскости является линейной комбинацией A и F; то есть любой вектор Z в плоскости можно построить как Z = aA + bF, где a и b - числа, и любая такая сумма будет в плоскости. F также имеет ту же величину, что и A, поэтому, если мы построим
G = cos(theta) A + sin(theta) F
мы получаем вектор такой же величины, но отделенный от A углом тета. (Это не сразу очевидно, но если вы немного поиграете с этим, вы увидите, что это работает.)
Используя ваш пример:
A = (2, 3, 3) (magnitude = 4.69)
B = (2, -3, -2)
C = AxB = (3, 10, -12) (magnitude = 15.906)
Now normalize:
C = (0.189, 0.629, -0.754) (magnitude = 1.0)
F = CxA = (4.149, -2.075, -0.692) (magnitude = 4.69)
theta = 20 degrees
G = cos(theta) A + sin(theta) F = (3.299, 2.109, 2.583) (magnitude = 4.69)
G находится в той же плоскости, что и A и B (нормаль к C), а угол между A и G составляет 20 градусов. (Угол между A и B составляет 124,7 градуса, угол между G и B составляет 104,7 градуса.)