Замена координат при вращении вокруг оси

sokrat

Есть прямая заданная как угодно (либо как пересечение плоскостей, либо как двойное равенство). Поворачиавем пространство на угол alpha вокруг оси. Как будет выглядеть матрица, чтобы получить новые координаты через старые.
P.S. Нет ниодной книги под рукой и всё уже позабыл , помогите плз...

Ner83

Ортогональная матрица?

Mike3

ну да

dimaxd

Сначала нужно сделать ортогональное преобразование, переводящее эту прямую в ось Oz (пусть его матрица C затем поворачиваем вокруг оси Oz на нужный угол - матрица поворота


(cos\phi -sin\phi 0)
A = (sin\phi cos\phi 0)
(0 0 1)


И делаем обратное ортогональное преобразование с матрицей С^{-1}.
В итоге получается матрица CAC^{-1}.

Ner83

Называется Углы Эйлера....
Я на рботе - не помню формул.. В любой книжке по ангему есть...
Матрица получается из перемножегния 3-х матриц - поворотов чтобы ось совпала с Ох...

3qqq

exp(A\alpha где
A=([0,-x3,x2;x3,0,-x1;-x2,x1,0])
(x1,x2,x3) -- единичный вектор вдоль оси вращения.

sokrat

А как C получить то? (ну нет у меня под рукой совсем ничего)

dimaxd

Находим направляющий вектор прямой (a,b,c выбираем произвольную точку на этой прямой (x_0,y_0,z_0) (имеет смысл выбирать ее попроще). Проводим через эту точку плоскость, перпендикулярную вектору (a,b,c) и в этой плоскости находим два взаимно перпендикулярных вектора (например так: находим два любых непараллельных и проводим процесс ортогонализации). Нормируем полученные векторы и (a,b,c) и записываем их координаты по столбцам в матрицу (сначала два найденных, а потом напр. вектор прямой это будет матрица C^{-1}.
Вроде так.

sokrat

Блин - это так когда на 2-3 курсе учишься...
После - это намного сложнее
Неужто в каком нибудь Александрове нет подобной матрицы уже выведенной - тема по идее распространенная...

b4331

Можно еще воспользоваться ф-лой $R_{\alpha}=\exp(\alpha(n_1J_1+n_2J_2+n_3J_3$, где $R_{\alpha}$ -- матрица оператора поворота (в нек-ром базисе $n_i$ -- координаты единичного вектора оси вращения (в том же базисе $J_i$ -- матрицы генераторов вращений вокруг базисных векторов (т.е. такие м-цы что $\exp(\alpha(J_i$ -- матрица поворота на угол альфа вокруг $i$-го базисного вектора, например
____000
J_1=00-1
____010).
PS Экспонента матрицы вычисляется с помощью жордановой н. формы (которая в данном случае диагональна поскольку матрица (n_1J_1+n_2J_2+n_3J_3) кососимметрична).

Ner83

Ещё раз грю..
поизведение 3х матриц поворота в 2Д.......
Есть даже прямые формулы в 3Д.....

sokrat

ДАЙТЕ ТОЛЬКО ФОРМУЛЫ! ТЕОРИИ ТУПЫМ НЕ НАДО (плз)

sokrat

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

Afonya

Пусть a1 - твоя ось, a2 - паралельная ей, проходящая через центр. x - любой вектор разности между этими осями, и B - уже известный тебе оператор поворота вокруг a2.
Тогда поворот вокруг a1 точки y легко находится по формуле: y' = B(y+x) - x

sokrat

У них: x'=x0 + A(x-x0) - не пашет... А вроде на правду похоже...

Vikuschechka9

Из старых запасов...

inline C3DMatrix Rotation(const C3DVector& axis /*единичный вектор направления*/ ,matr_type angle /*угол*/)
{
C3DMatrix res (1);//типа единичная матрица 4 х 4
matr_type co = cos(angle);
matr_type si = sin(angle);
res.m[0][0] = axis.x * axis.x + (1 - axis.x * axis.x) * co;
res.m[1][0] = axis.x * axis.y * (1 - co) + axis.z * si;
res.m[2][0] = axis.x * axis.z * (1 - co) - axis.y * si;
res.m[3][0] = 0;
res.m[0][1] = axis.x * axis.y * (1 - co) - axis.z * si;
res.m[1][1] = axis.y * axis.y + (1 - axis.y * axis.y) * co;
res.m[2][1] = axis.y * axis.z * (1 - co) + axis.x * si;
res.m[3][1] = 0;
res.m[0][2] = axis.x * axis.z * (1 - co) + axis.y * si;
res.m[1][2] = axis.y * axis.z * (1 - co) - axis.x * si;
res.m[2][2] = axis.z * axis.z +(1 - axis.z * axis.z) * co;
res.m[3][2] = 0;
res.m[0][3] = 0;
res.m[1][3] = 0;
res.m[2][3] = 0;
res.m[3][3] = 1;
return res;
}

sokrat

Такое у меня есть. При переходе к произвольной оси не пашет

Vikuschechka9

Ась? Как это? А вектор направления нормировал? У меня всё работает!
Аааа! Я тупоооой. Тебе надо ещё и начало оси не в нуле, да? Ну два переноса сделай, как положено...

_shmel_

А что же в етой формУле не пашет? Если у тебя ось задана параметрически - x = a0 + a1*t, y = b0 + b1*t , z = c0 + c1*t , то в качестве вектора x0 пойдет (a0,b0,c0). Неужели не пашет? и что вы пробовали туда подставить?

sokrat

Спасибо всем - вроде заработало
Оставить комментарий
Имя или ник:
Комментарий: