2012-05-22 10 views
3

У меня есть 3 вектора в 3D пространстве. Назовем их xaxis, yaxis и zaxis. Эти векторы центрированы вокруг произвольного point где-то в трехмерном пространстве. Меня интересует вращение xaxis и yaxis векторов о zaxis вектор ряд градусов θ.Вращение точки вокруг оси z

Для следующего кода с значением является произвольным и неважным:

double xaxis[3], yaxis[3], zaxis[3], point[3], theta; 

Как бы я идти о вращающихся xaxis и yaxis о zaxis по theta градусам?

Примечание будущего: Эти попытки не работают. Смотрите мой ответ на правильное решение, которое было найдено с помощью BlueRaja-DannyPflughoeft

Моей попытки вращения матрицы на основе:

double rx[3][3]; 
double ry[3][3]; 
double rz[3][3]; 
double r[3][3]; 

rx[0][0] = 1; 
rx[0][1] = 0; 
rx[0][2] = 0; 

rx[1][0] = 0; 
rx[1][1] = cos(theta); 
rx[1][2] = sin(theta); 

rx[2][0] = 0; 
rx[2][1] = -1.0 * sin(theta); 
rx[2][2] = cos(theta); 

ry[0][0] = cos(theta); 
ry[0][1] = 0; 
ry[0][2] = -1.0 * sin(theta); 

ry[1][0] = 0; 
ry[1][1] = 1; 
ry[1][2] = 0; 

ry[2][0] = sin(theta); 
ry[2][1] = 0; 
ry[2][2] = cos(theta); 
//No rotation wanted on the zaxis 
rz[0][0] = cos(0); 
rz[0][1] = sin(0); 
rz[0][2] = 0; 

rz[1][0] = -1.0 * sin(0); 
rz[1][1] = cos(0); 
rz[1][2] = 0; 

rz[2][0] = 0; 
rz[2][1] = 0; 
rz[2][2] = 1; 

vtkMath::Multiply3x3(rx, ry, r); //Multiplies rx by ry and stores into r 
vtkMath::Multiply3x3(r, rz, r); //Multiplies r by rz and stores into r 

vtkMath::Multiply3x3(r, xaxis, xaxis);//multiplies a 3x3 by a 3x1 
vtkMath::Multiply3x3(r, yaxis, yaxis);//multiplies a 3x3 by a 3x1 

Эту попытка только работала, когда самолет находился в плоскости х :

double x, y; 
x = xaxis[0]; 
y = xaxis[1]; 
xaxis[0] = x * cos(theta) - y * sin(theta); 
xaxis[1] = x * sin(theta) + y * cos(theta); 

x = yaxis[0]; 
y = yaxis[1]; 
yaxis[0] = x * cos(theta) - y * sin(theta); 
yaxis[1] = x * sin(theta) + y * cos(theta); 

Использование оси угла подхода дается BlueRaja-DannyPflughoeft:

double c = cos(theta); 
double s = sin(theta); 
double C = 1.0 - c; 

double Q[3][3]; 
Q[0][0] = xaxis[0] * xaxis[0] * C + c; 
Q[0][1] = xaxis[1] * xaxis[0] * C + xaxis[2] * s; 
Q[0][2] = xaxis[2] * xaxis[0] * C - xaxis[1] * s; 

Q[1][0] = xaxis[1] * xaxis[0] * C - xaxis[2] * s; 
Q[1][1] = xaxis[1] * xaxis[1] * C + c; 
Q[1][2] = xaxis[2] * xaxis[1] * C + xaxis[0] * s; 

Q[2][0] = xaxis[1] * xaxis[2] * C + xaxis[1] * s; 
Q[2][1] = xaxis[2] * xaxis[1] * C - xaxis[0] * s; 
Q[2][2] = xaxis[2] * xaxis[2] * C + c; 

double x = Q[2][1] - Q[1][2], y = Q[0][2] - Q[2][0], z = Q[1][0] - Q[0][1]; 
double r = sqrt(x * x + y * y + z * z); 

//xaxis[0] /= r; 
//xaxis[1] /= r; 
//xaxis[2] /= r; 

xaxis[0] = x;// ? 
xaxis[1] = y; 
xaxis[2] = z; 
+1

Если вы программируете в 3D, используйте библиотеку и матрицы. Если нет, это относится к math.stackexchange.com. – chris

+0

@chris Это программирование, и я попытался использовать матрицы с ограниченными знаниями линейной алгебры, но безрезультатно. У меня также нет доступа к внешним библиотекам, кроме VTK. – Drise

+0

Ну, с матрицей, фактически реализованной для вращения, часть программирования проста. Я бы все же сказал, что у него больше внимания уделяется математике, чтобы убрать эту концепцию. Если вы делаете больше этого, вы можете захотеть забрать книгу по математике за 3D-программированием. Я прочитал очень хороший один раз, но я не могу вспомнить, где я его нашел. – chris

ответ

2

Благодаря BlueRaja - Дэнни Pflughoeft:

double c = cos(theta); 
double s = sin(theta); 
double C = 1.0 - c; 

double Q[3][3]; 
Q[0][0] = zaxis[0] * zaxis[0] * C + c; 
Q[0][1] = zaxis[1] * zaxis[0] * C + zaxis[2] * s; 
Q[0][2] = zaxis[2] * zaxis[0] * C - zaxis[1] * s; 

Q[1][0] = zaxis[1] * zaxis[0] * C - zaxis[2] * s; 
Q[1][1] = zaxis[1] * zaxis[1] * C + c; 
Q[1][2] = zaxis[2] * zaxis[1] * C + zaxis[0] * s; 

Q[2][0] = zaxis[0] * zaxis[2] * C + zaxis[1] * s; 
Q[2][1] = zaxis[2] * zaxis[1] * C - zaxis[0] * s; 
Q[2][2] = zaxis[2] * zaxis[2] * C + c; 

xaxis[0] = xaxis[0] * Q[0][0] + xaxis[0] * Q[0][1] + xaxis[0] * Q[0][2]; 
xaxis[1] = xaxis[1] * Q[1][0] + xaxis[1] * Q[1][1] + xaxis[1] * Q[1][2]; 
xaxis[2] = xaxis[2] * Q[2][0] + xaxis[2] * Q[2][1] + xaxis[2] * Q[2][2]; // Multiply a 3x3 by 3x1 and store it as the new rotated axis 

yaxis[0] = yaxis[0] * Q[0][0] + yaxis[0] * Q[0][1] + yaxis[0] * Q[0][2]; 
yaxis[1] = yaxis[1] * Q[1][0] + yaxis[1] * Q[1][1] + yaxis[1] * Q[1][2]; 
yaxis[2] = yaxis[2] * Q[2][0] + yaxis[2] * Q[2][1] + yaxis[2] * Q[2][2]; // Multiply a 3x3 by 3x1 and store it as the new rotated axis 
0

Я вижу, что после умножения матриц не так!

Как уже говорилось выше, это может быть разложен с xaxis[0]

xaxis[0] = xaxis[0] * Q[0][0] + xaxis[0] * Q[0][1] + xaxis[0] * Q[0][2]; 

xaxis[0] = xaxis[0] * (Q[0][0] + Q[0][1] + Q[0][2]); 

это не выглядит как умножение матриц. Это должно быть:

xaxis1[0] = xaxis[0] * Q[0][0] + xaxis[1] * Q[0][1] + xaxis[2] * Q[0][2]; 
xaxis1[1] = xaxis[0] * Q[1][0] + xaxis[1] * Q[1][1] + xaxis[2] * Q[1][2]; 
xaxis1[2] = xaxis[0] * Q[2][0] + xaxis[1] * Q[2][1] + xaxis[2] * Q[2][2]; // Multiply a 3x3 by 3x1 and store it as the new rotated axis 

yaxis1[0] = yaxis[0] * Q[0][0] + yaxis[1] * Q[0][1] + yaxis[2] * Q[0][2]; 
yaxis1[1] = yaxis[0] * Q[1][0] + yaxis[1] * Q[1][1] + yaxis[2] * Q[1][2]; 
yaxis1[2] = yaxis[0] * Q[2][0] + yaxis[1] * Q[2][1] + yaxis[2] * Q[2][2]; // Multiply a 3x3 by 3x1 and store it as the new rotated axis 
+0

Я не уверен, в чем проблема. Прошло довольно много времени с тех пор, как я использовал этот код, но он действительно работал, когда я в последний раз его использовал. – Drise

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