Изменение направления вектора - PullRequest
2 голосов
/ 26 февраля 2011

Учитывая два вектора в трех измерениях, указывающих разные направления.Мне бы хотелось, чтобы первый вектор мог менять направление на заданное количество градусов по отношению ко второму вектору.Какова формула или алгоритм для вычисления этого нового вектора.

Например, космический корабль (это для симулятора космического корабля) указывает в направлении (2,3,3).Теперь корабль изменит направление на 20 градусов в направлении вектора (2, -3, -2).Каким будет новый вектор.Он вращается не вдоль оси, а под прямым углом к ​​обоим векторам.

Ответы [ 3 ]

4 голосов
/ 26 февраля 2011

Скажем, вы хотите повернуть 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 градуса.)

3 голосов
/ 26 февраля 2011

Возьмите перекрестное произведение двух векторов, чтобы получить вектор, перпендикулярный им.

Тогда вы можете вращаться вокруг этого вектора.

1 голос
/ 26 февраля 2011

Сначала вы должны вычислить вектор вращения, скажем:

Vector3 axis = crossProduct(Vector3(2,3,3), Vector3(2,-3,-2));

Затем вы делаете вращение вдоль этой оси, используя матрицу вращения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...