У меня есть 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;
Если вы программируете в 3D, используйте библиотеку и матрицы. Если нет, это относится к math.stackexchange.com. – chris
@chris Это программирование, и я попытался использовать матрицы с ограниченными знаниями линейной алгебры, но безрезультатно. У меня также нет доступа к внешним библиотекам, кроме VTK. – Drise
Ну, с матрицей, фактически реализованной для вращения, часть программирования проста. Я бы все же сказал, что у него больше внимания уделяется математике, чтобы убрать эту концепцию. Если вы делаете больше этого, вы можете захотеть забрать книгу по математике за 3D-программированием. Я прочитал очень хороший один раз, но я не могу вспомнить, где я его нашел. – chris