2011-02-25 2 views
2

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

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

+0

Где находится космический корабль?Для вычисления поворота требуется точка начала координат. – ProdigySim

+0

no, не для того, чтобы повернуть вектор –

ответ

4

Допустим, вы хотите, чтобы повернуть в сторону В.

Возьмите крест продукт Axb = C и нормализовать его.

Теперь разбить на две составляющие, одна из которых параллельна 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 = (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 находится в той же плоскости, что А и В (нормаль к C), а угол между A и G составляет 20 градусов. (Угол между A и B составляет 124,7 градуса, угол между G и B составляет 104,7 градуса.)

+1

A. (AxB) = 0, поэтому D равно 0. Почему он вообще вычисляется? –

+0

Кроме того, это приводит к E = A, F = C x A, что делает F параллельным B. Таким образом, вы просто взвешиваете векторы A и B, используя cos (theta) и k * sin (theta). Не работает. –

+0

@Ollie Etuaho: Благодарю вас, я ошибся, я исправил свой ответ. (Ваш первый комментарий был правильным, второй - неправильным.) – Beta

2

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

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

+0

Итак, как мне сделать поворот вокруг этой оси? – user631589

+0

Самый простой способ - использовать матрицу вращения. Вы можете сделать это с помощью чистого триггера, если хотите, определив трехмерную окружность и перемещаясь по ее краю, но я бы посмотрел, как выталкивать и выталкивать матрицы из стека - если вы узнаете это сейчас, это сделает все остальное ваших задач по разработке игр намного проще. – corsiKa

1

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

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

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

Смежные вопросы