Перевести вектор по матрице - PullRequest
2 голосов
/ 01 октября 2009

У меня есть матрица 4 * 4 и 3d вектор. Мне нужно перевести мой вектор по матрице.

Не слишком много сумасшедших математических обозначений, пожалуйста, потому что я не понимаю этого.

Примером чего-то, близкого к Java, был бы потрясающий!

Ответы [ 4 ]

10 голосов
/ 01 октября 2009

Это довольно легко, когда вы видите это.

(New-3d-point) = Metrix-4x4 x (Old-3d-point)

означает ...

|x_new|   |a1 a2 a3 a4|   |x_old|
|y_new| = |b1 b2 b3 b4| x |y_old|
|z_new|   |c1 c2 c3 c4|   |z_old|
|  1  |   |d1 d2 d3 d4|   |  1  |

означает ...

x_new = a1*x_old + a2*y_old + a3*z_old + a4
y_new = b1*x_old + b2*y_old + b3*z_old + b4
z_new = c1*x_old + c2*y_old + c3*z_old + c4

d1-d4 здесь, чтобы сделать '1', поэтому вам не нужно его использовать.

Надеюсь, это поможет.

3 голосов
/ 01 октября 2009

Тебе нужна математика. Я постараюсь быть мягким, но если вы не знаете, как делать умножение матриц, вам нужно посмотреть это прямо сейчас!

Во-первых, вам нужно превратить ваш 3D-вектор в 4-вектор, добавив к нему дополнительный 1. Компьютерная графика обычно называет это координатой "w" (для обозначения координат x, y и z).

3D вектор: (X, Y, Z) -> 4D вектор: (x = X, y = Y, z = Z, w = 1)

Затем вы можете умножить 4-вектор на матрицу 4x4. Что это делает, зависит от матрицы - но вы можете сделать матрицу, которая переводит вектор:

[x,y,z,1] * [1 0 0 0]  =  [x+a,y+b,z+c,1]
            [0 1 0 0]
            [0 0 1 0]
            [a b c 1]

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

Преимущество таких действий состоит в том, что вы также можете создать матрицу вращения или масштабную матрицу, а затем умножить столько их, сколько хотите, вместе на одну матрицу :

v * M1 * M2 * M3 = v * (M1*M2*M3)

Умножение вектора на полученную матрицу эквивалентно умножению на все матрицы компонентов в последовательности, что, как вы можете себе представить, может сэкономить вам много времени и хлопот.


Код для умножения 4-вектора на матрицу 4x4 может выглядеть примерно так:

for(int i=0; i<4; ++i) {
  double accumulator= 0.0;
  for(int j=0; j<4; ++j) {
    accumulator+= rowVectorIn[j]*matrix[j][i]; // matrix is stored by rows
  }
  rowVectorOut[i]= accumulator;
}
2 голосов
/ 01 октября 2009

Если вы рассматриваете свой (обычно 3-й) вектор (x, y, z) как вектор с четырьмя (x, y, z, 1), вы можете сделать это: w = AvT, где T - операция транспонирования (поворот горизонтального вектора по вертикали или наоборот), A - правильно выбранная матрица и w - переведенная матрица.

Вы должны знать, как выполнять умножение матриц.

Чтобы получить транспонирование по (a, b, c), и ничто другое не определяет A как:

1  0  0  a
0  1  0  b
0  0  1  c
0  0  0  1
1 голос
/ 01 октября 2009

Я не уверен, в какую именно форму поступают ваши данные, но на первый взгляд кажется, что вы имеете дело с кватернионами .

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

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

Надеюсь, это поможет. Удачи!

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