Что такое матрица поворота
Перейти к содержимому

Что такое матрица поворота

  • автор:

ТРАНСФОРМАЦИИ

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

Все вращения определяются через тригонометрические функции синус и косинус. Для двумерной системы координат, матрица вращения такая:

\(R = \begin \cos A & -\sin A \\ \sin A & \cos A \end\)

Если угол А равен 0, то на выходе получаем единичную матрицу:

\(I = \begin 1 & 0 \cr 0 & 1 \cr \end\)

Если угол А равен +90 градусов, то матрица такова:

Если угол А равен -90 градусов, то матрица такова:

\(I = \begin0 & 1 \cr -1 & 0 \cr \end\)

Углы поворота, взятые с обратным знаком равны транспонированию матрицы.

Если матрица вращения умножена на транспонированную, в результате будет единичная матрица

Как матрицы вращения влияют на систему координат?

Матрицы вращения влияют на систему координат следующим образом:

По договоренности положительные углы создают вращение по часовой стрелке, если смотреть из центра координат в положительном направлении оси вращения.

Следуя этому правилу, в праворукой декартовой системе координат, мы увидим следующие три вида:

+----------------------------------------+ | | | X-axis Y-axis Z-axis | | | | | | ^ Y ^ Z Y ^ | | | | | | | | | | | | | | | | | | | | | | O----> Z O----> X X 

Так как вращение на положительный угол создает вращение по часовой стрелке, можно создать набор координат для каждого такого вращения. Для упрощения рассмотрим поворот на +90:

Можно упростить так:

В матрице это будет так:

\(R_x = \begin1 & 0 & 0 \cr 0 & \cos A & -\sin A \cr 0 & \sin A & \cos A \end\)

То же самое для Y-оси:

\(R_y = \begin\cos A & 0 & \sin A \cr 0 & 1 & 0 \cr -\sin A & 0 & \cos A\end\)

\(R_z = \begin\cos A & -\sin A & 0 \cr \sin A & \cos A & 0 \cr 0 & 0 & 1\end\)

Это и есть те три базовые матрицы, которые используются в OpenGL.

\(M = \begin 1 & 0 & 0 & 0\cr 0 & \cos A & -\sin A & 0 \cr 0 & \sin A & \cos A & 0 \cr 0 & 0 & 0 & 1 \end\)

\(M = \begin \cos A & 0 & -\sin A & 0\cr 0 & 1 & 0 & 0 \cr \sin A & 0 & \cos A & 0 \cr 0 & 0 & 0 & 1 \end\)

\(M = \begin \cos A & -\sin A & 0 & 0\cr \sin A & \cos A & 0 & 0 \cr 0 & 0 & 1 & 0 \cr 0 & 0 & 0 & 1 \end\)

Что такое углы Эйлера?

Углы Эйлера это имя, данное для набора углов поворота определённых
относительно трех осей \(X,Y,Z\)

Их можно определить в векторном виде \((x,y,z)\) и хранить в структуре VECTOR.

К примеру, набор из \((0,0,0)\) всегда дает единичную матрицу.

Если представить углы в таком виде, то:
\((90,0,0)\) вращение на +90 градусов по X.
\((0,90,0)\) вращение на +90 градусов по Y.
\((0,0,90)\) вращение на +90 градусов по Z.

Что такое рыск, качение и тангаж?

Рыск, качение и тангаж (yaw, pitch, roll) — это термины аэронавтики для поворота в эвклидовой системе координат (Углах Эйлера), относительно местной системы координат самолета.

Представьте, что вы в самолете и смотрите вперед

Ось Z соединяет хвост и нос самолета.
X от конца левого крыла к концу правого крыла.
Y указывает с земли в небо.

тангаж — поворот по Х, рыск — поворот по Y, качение — поворот по Z.

Как мне комбинировать матрицы поворота?

Матрицы поворота комбинируются при помощи матричного умножения. Так что порядок умножения очень важен.

Что такое фиксация оси?

Фиксация (gimbal lock) — проблема, появляющаяся при использовании углов Эйлера. Так как конечный поворот зависит от порядка умножения, может произойти так, что одна ось вращения отобразиться на другую ось. Из-за чего станет невозможно повернуть объект в нужной оси.

К примеру, если вращать объект в порядке Z,Y,X и повернуть по оси Y на 90 градусов. В этом случае, вращение по оси Z будет произведено первым, а значит, будет проведено, верно. По оси Y также корректно. Однако после вращения по Y, ось X будет вращаться по оси Z.

Так что любое вращение по X на самом деле будет вращать по Z. Единственное решение этой проблемы — использовать Кватернионы.

Как правильно комбинировать матрицы вращения?

На самом деле, нет «правильного пути». Однако для возможности предсказать результат, некоторая организация необходима. Это также нужно, при создании полноценной 3D матричной библиотеки.

Самый простой путь повернуть объект:

где M финальная матрица вращения, и X,Y,Z матрицы вращения по осям.
Они опишет поворот по оси Х (тангаж), затем по Y(рыск)
и в конце по Z(качение).

Однако со стороны наблюдателя порядок вращений будет обратным.

К примеру, если ты стоишь и поворачиваешься налево,
то все в поле твоего зрения движется вправо.

Однако кто-либо кто смотрит на тебя, скажет, что ты повернулся направо.

Так что вид из камеры нужно моделировать в таком порядке:

Это обратная матрица вращения генерируется, если камера считается как еще один объект.

Как сгенерировать матрицу вращения из углов Эйлера?

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

m3_rotx( mat_x, vec -> angle_x ); m3_roty( mat_y, vec -> angle_y ); m3_rotz( mat_z, vec -> angle_z ); m3_mult( mat_tmp, mat_z, mat_y ); m3_mult( mat_final, mat_tmp, mat_x );

Из них можно сделать отдельную функцию:

m3_fromeuler( MATRIX *mat_final, VECTOR3 *euler )

Однако этот способ очень затратный в терминах времени обработки.
Для матрицы 4х4 гарантированно 10 элементов будут равны 0, два равны 1,
и четыре оставшихся будут иметь какое-то значение,
больше 75% всех матричных операций пройдет впустую. И это не считая
настройку и инициализацию каждой матрицы.

Вместе, больше 75% всех операций будут потрачены на нулевой или единичный результат.

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

Если все три матрицы записать в алгебраической форме,
то мы получим следующее выражение:
\(M = X*Y*Z\)
Где M - конечная матрица,
X - матрица вращения по X,
Y - матрица вращения по Y,
Z - матрица вращения по Z,

Расписав мы получим:

\(X = \begin1 & 0 & 0\cr 0 & A & -B\cr 0 & B & A \end\)

\(X = \beginC & 0 & -D\cr 0 & 1 & 0\cr D & 0 & C \end\)

\(X = \beginE & -F & 0\cr F & E & 0\cr 0 & 0 & 1 \end\)

где A, B косинус и синус вращения по оси X,
C, D косинус и синус вращения по оси Y,
E, F косинус и синус вращения по оси Z,

M = X.Y.Z

Можно разбить на два матричных умножения:

M' = X.Y M = M'.Z

Посчитаем сначала M':

M' = X.Y | 1 0 0 | | C 0 -D | M' = | 0 A -B | . | 0 1 0 | | 0 B A | | D 0 C | | 1.C + 0.0 + 0.D 1.0 + 0.1 + 0.0 1.-D + 0.0 + 0.C | M' = | 0.C + A.0 + -B.D 0.0 + A.1 + -B.0 0.-D + A.0 + -B.C | | 0.C + B.0 + A.D 0.0 + B.1 + A.0 0.-D + B.0 + A.C |
| C 0 -D | M' = | -B.D A -B.C | | A.D B A.C |
M = M'.Z | C 0 -D | | E -F 0 | M = | -BD A -BC | . | F E 0 | | AD B AC | | 0 0 1 | | C.E + 0.F + -D.0 C.-F + 0.E + -D.0 C.0 + 0.0 + -D.1 | M = | -BD.E + A.F + -BC.0 -BD.-F + A.E + -BC.0 -BD.0 + A.0 + -BC.1 | | AD.E + B.F + AC.0 AD.-F + B.E + AC.0 AD.0 + 0.0 + AC.1 |
| CE -CF -D | M = | -BDE+AF -BDF+AE -BC | | ADE+BF -ADF+BE AC |

Конечная матрица вращения будет такой:

| CE -CF -D 0 | M = | -BDE+AF BDF+AE -BC 0 | | ADE+BF -ADF+BE AC 0 | | 0 0 0 1 |

Сначала считаются значения A,B,C,D,E и F. Также считаются значения
BD и AD так как они попадаются чаще одного раза.

Законченый алгоритм будет таким:

A = cos(angle_x); B = sin(angle_x); C = cos(angle_y); D = sin(angle_y); E = cos(angle_z); F = sin(angle_z); AD = A * D; BD = B * D; mat[0] = C * E; mat[1] = -C * F; mat[2] = -D; mat[4] = -BD * E + A * F; mat[5] = BD * F + A * E; mat[6] = -B * C; mat[8] = AD * E + B * F; mat[9] = -AD * F + B * E; mat[10]= A * C; mat[3] = mat[7] = mat[11] = mat[12] = mat[13] = mat[14] = 0; mat[15]= 1;

При использовании обычных матричных операций, операция заняла бы
128 умножений, 96 сложений и 80 присваиваний.

Оптимизированный алгоритм требует всего 12 умножений, 6 вычитаний
и 18 присваиваний.

Как видно при использовании оптимизированного алгоритма, мы получили
прирост производительности в 1000%.

Как мне перевести матрицу вращения в углы Эйлера?

Эта операция обратная к прошлому вопросу.
Дана матрица вращения:

| CE -CF -D 0 | M = | -BDE+AF BDF+AE -BC 0 | | ADE+BF -ADF+BE AC 0 | | 0 0 0 1 |

где A,B косинус и синус угла по оси X,
C,D косинус и синус угла по оси Y,
E,F косинус и синус угла по оси Z,

При использовании Сишной структуры для матрицы 4х4,
индексы элементов будут такими:

| 0 1 2 3 | M = | 4 5 6 7 | | 8 9 10 11 | | 12 13 14 15 |

Сравнивая эти таблицы, можно увидеть, что элемент [2] отвечает значению -D
или \(\sin(Y)\) . Значит, вращение по Y можно рассчитать через арксинус.
Передав полученное значение в косинус, получим значение C.

Если C не равно 0, то вращение в X и Z, можно получить из третьей колонки
и первого ряда соответственно:

ось X: M[6] = -BC M[10] = AC ось Z: M[0] = CE M[1] = -CF

Углы могут быть получены из деления каждой пары значений на С и получения
ответа через арктангенс.

Если C равно 0, то эти вычисления невозможны. В этом случае поворот
по Y будет либо -90, либо 90. Так что D будет иметь значения либо 1, либо -1.

В этом случае мы получаем фиксацию оси. Поворот по оси X и Z будет
производиться на одной оси. Это можно увидеть из расчета осей поворота.

| 0.E -0.F 1 0 | M = | -B.1.E+AF B.1.F+AE -B.0 0 | | A.1.E+BF -A.1.F+BE A.0 0 | | 0 0 0 1 |

Умножение каждого из них дает:

| 0 0 1 0 | M = | -BE+AF BF+AE 0 0 | | AE+BF -AF+BE 0 0 | | 0 0 0 1 |
| 0 0 1 0 | M = | -BE+AF AE+BF 0 0 | | AE+BF BE-AF 0 0 | | 0 0 0 1 |

Это можно увидеть из вида матрицы:

| 0 0 -1 0 | M = | -V W 0 0 | | W V 0 0 | | 0 0 0 1 |

Где V = BE-AF и W = AE+BF

Эти два значения отвечают за синус и косинус одной оси вращения.

Алгоритм будет таким:

angle_y = D = -asin( mat[2]); /* Считаем ось Y */ C = cos( angle_y ); angle_y *= RADIANS; if ( fabs( C ) > 0.005 ) /* ось зафиксирована? */ < trx = mat[10] / C; /* Нет, так что находим угол по X */ try = -mat[6] / C; angle_x = atan2( try, trx ) * RADIANS; trx = mat[0] / C; /* находим угол по оси Z */ try = -mat[1] / C; angle_z = atan2( try, trx ) * RADIANS; >else /* ось все-таки зафиксирована */ < angle_x = 0; /* Устанавливаем угол по оси X на 0 */ trx = mat[5]; /* И считаем ось Z */ try = mat[4]; angle_z = atan2( try, trx ) * RADIANS; >angle_x = clamp( angle_x, 0, 360 ); /* Приводим углы к диапазону */ angle_y = clamp( angle_y, 0, 360 ); angle_z = clamp( angle_z, 0, 360 );

Как мне сгенерировать матрицу вращения для выбранных осей и углов?

Есть лишь один способ создать этот тип матрицы поворота через математику кватернионов.

Смотри вопрос В54.

Как мне сгенерировать матрицу вращения, проецирующую один вектор на другой?

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

Это проблему можно представить в виде двух векторов исходящих из одной точки.
То все поле значений вращения сформирует сферу.

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

Однако лишь одно решение имеет практический интерес. Это путь, который
будет иметь кротчайшее угловое расстояние между векторами.

Вращение оси по этому пути считается через векторное произведение
между двумя векторами:

V = Vs x Vf

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

-1 Vangle = cos ( Vs . Vf )

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

Так как Земля круглая, кратчайший путь будет иметь
кратчайшее угловое вращение между двумя городами.

Как мне использовать матрицы для перехода из одной системы координат в другую?

Похоже на предыдущую проблему, необходимо привести одну координатную систему к другой.
Однако, вместо того, чтобы пытаться проецировать одну координатную ось к другой,

необходимо совместить все три оси. Координатные системы представлены в виде матриц
3х3 или 4х4.

Проблема в том, чтобы найти матрицу поворота, которая бы отобразила одну матрицу на другую.
Математически это будет так:

Mfinal = Mrot . Morig

где Mfinal - конечная система координат,
Morig - оригинальная система координат
Mrot - искомая матрица вращения.

Значит, задача состоит в поиске матрицы Mrot. Это можно сделать

через перестановку в уравнении:

-1 Mfinal . Morig = Mrot -1 Mrot = Mfinal . Morig

Таким образом, нужную матрицу можно вычислить, умножив
обратную матрицу в оригинальной системе на финальную матрицу вращения.

Для проверки, представим, что и оригинальная и конечная матрица - единичные матрицы.
Тогда, матрица поворота должна совпадать с финальной и обратной к ней.

Единожды посчитанная, матрица вращения может быть превращена в кватернион.

Что такое матрица переноса?

Матрица переноса используется для установки объекта в 3D пространстве без его поворота.
Перенос может быть осуществлен с помощью матричного умножения
лишь при использовании 4х4 матриц.

Если перенос описан вектором [X Y Z], то матрица 4х4 будет такой:

| 1 0 0 X | | | | 0 1 0 Y | M = | | | 0 0 1 Z | | | | 0 0 0 1 |

Если вектор равен [0 0 0] то вершины останутся на своих местах.

Что такое матрица скалирования?

Матрица скалирования используется для расширения или
сжимания размеров 3D модели.

Если вектор скалирования равен [X Y Z] то матрица будет такой:

| X 0 0 0 | | | | 0 Y 0 0 | M = | | | 0 0 Z 0 | | | | 0 0 0 1 |

Если вектор скалирования равен [1 1 1], то в результате будет
единичная матрица и геометрия останется без изменений.

Что такое матрица сдвига?

Матрица сдвига используется для сдвига 3D модели в стороны.
К примеру, "курсивный" текс требует, чтобы каждый символ был сдвинут вправо.

В трех измерениях возможны 6 сторон сдвига:

o сдвигает X по Y
o сдвигает X по Z
o сдвигает Y по X
o сдвигает Y по Z
o сдвигает Z по X
o сдвигает Z по Y

Все 6 направлений сдвига могут быть собраны в одной матрице:

| 1 Syx Szx 0 | | | | Sxy 1 Szy 0 | M = | | | Sxz Syz 1 0 | | | | 0 0 0 1 | | |

Где Sij реализует сдвиг I по J
Так что, Sxy сдвигает X по Y

Теоретически, вращение в трех измерениях может быть комбинацией сдвига в 6 направлениях.

Как мне линейно интерполировать две матрицы?

Даны две матрицы, задача найти путь для определения средних точек
в зависимости от переменной t, которая изменяется в рамках от 0.0 до 1.0.

Это можно сделать переводом двух матриц либо в углы Эйлера, либо в сферические углы (кватернионы)
и вектор переноса. В этом случае каждая матрица превращается в пару 3D векторов.

Интерполировать между этими двумя векторами можно стандартной формулой линейной интерполяции:

Vr = Va + t .(Vb - Va )

где Vr - результат
Va - начальный вектор
Vb - конечный вектор

Это уравнение можно применять и на вектор переноса и на вектор поворота.

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

Как мне сделать кубическую интерполяцию между четырьмя матрицами?

Дано четыре матрицы вращения или переноса, задача - найти способ определения
средний точек определённых параметром t.

Это можно сделать при помощи кубической интерполяции.

Как и с линейной интерполяцией четыре матрицы переводятся в соответствующие
вектора переноса и вращения (опять же, либо углы Эйлера, либо сферические углы)

Каждый из четырех векторов переводится в один вектор G. С помощью
математики сплайнов, этот вектор преобразуется в интерполированную матрицу M

Если вектор задан так:

| x1 x2 x3 x4 | G = | y1 y2 y3 y4 | | z1 z2 z3 z4 |

Умножение на начальную матрицу:

| -4.5 9.0 -5.5 1.0 | Mb = | 13.5 -22.5 9.0 0.0 | | -13.5 18.0 -4.5 0.0 | | 4.5 -4.5 1.0 0.0 |

создаст интерполированную матрицу Mi:

Mi = G .Mb

Это можно сделать через стандартную матрично-векторное умножение.

Интерполировать можно при помощи параметрической переменной t:

R = Mi . t |t^3| | xr | | A B C D | |t^2| | yr | = | E F G H | . |t | | zr | | I J K L | |1 |

Результат может быть преобразован обратно в матрицу вращ ения или переноса.

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

Из двух методов, сферические углы вращения дают обычно самую
лучшую интерполяцию для вращения.

Как отрисовать матрицу?

Когда используешь графическое окно для 3D анимации, бывает нужно видеть
как матрица вращения влияет на анимацию.

Однако, просто показ матрицы вращения в виде чисел не очень понятен.

Как альтернатива, можно отрисовать численные данные в виде графиков.

Похоже на графический эквалайзер в стерео, матрица вращения можно
представить в виде графика. Каждый элемент матрицы вращения отрисовывается в
виде отдельной колонки в рамке от -1 до +1.

Матрица 3х3 будет выглядеть так:

В этом случае матрица вращения - единичная матрица,
где каждый элемент главной диагонали равен 1,
остальные равны 0.

Для удобства, отрицательные значения можно красить другим цветом,
нежели положительные.

Страницы: 1 2 3 4 5 6 Следующая »

9 марта 2011 (Обновление: 5 дек 2021)

О матрице поворота простыми словами

Когда Пифагор плыл по реке Хуанхэ, он увидел у берега, в лодке, задремавшего рыбака, в конической шляпе и с бамбуковой удочкой в руках.

Памятуя о том, что на Хабрахабр заглядывают люди разной математической подготовки, — однако, в поле интересов которых вполне может попадать тема линейных преобразований, — в связи с её практической значимостью, — я попробую рассказать об этом максимально доступно.

Продолжим историю

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

Удочка рыбака аккуратно зависла над гладью вод Жёлтой Реки под углом, равным 45 градусам.

Лёгкий туман стелился над водой… и вдруг — поклёв. Рыбак потянул удочку, и она стала быстро набирать высоту, длина лески (катет А) стала расти на глазах, а расстояние от рыбака до самой лески стало уменьшаться (катет B). И самое интересное — длина самой удочки совсем не изменилась — телескопических удочек ещё не было, — даже когда она описала в воздухе дугу и оказалась почти над головой рыбака, под углом 90 градусов. Длина лески сравнялась с длиной удочки — катушки тогда уже были, — а расстояние между рыбаком и леской изменилось до 0, леска оказалась в руках рыбака.

Последний момент очень важен для понимания того, что происходит при умножении вектора-удочки на матрицу поворота.

Ностальгируем и думаем дальше.

Вспомним теорему Пифагора: квадрат длины удочки равен сумме квадратов катетов — самой лески и расстоянию между рыбаком и тем местом, где леска погружена в воду — С^2=А в квадрате + B в квадрате.

Представим, что длина удочки 4.2, длина (или высота над водой) лески 3, расстояние между рыбаком и местом, где леска погружена в воду тоже 3.

Окунёмся в поиски

1) найдём то, как соотносится между собой длина лески с длиной удочки — синус угла а.
2) найдём то, как соотносится длина отрезка между рыбаком и местом погружения лески с длиной удочки — косинус а. Считаем:

sin(a) = 3/ 4.2= 0.7
cos(a) = 3/ 4.2 = 0.7

А теперь порассуждаем
Что будет если катет А разделить на sin(a)?! т.е.:

Получаем длину удочки — гипотенузу.
А если мы умножим катет А на sin(а)?!

Отметим это расстояние на гипотенузе — 2.1.

На оставшееся расстояние также приходится — 2.1, так как очевидно:

Это означает, то как в текущий момент времени синус и косинус делят гипотенузу. Поскольку квадрат гипотенузы это 4.2*4.2, то вопрос: что будет если 4.2 умножить на 2.1?! На ту самую её часть, с которой связан один из катетов:

4.2*2.1 = 9, (корень: 3)

Тоже самое для второго катета.

Нашли катеты. И убедились в том, что со времён Пифагора ничего не изменилось.

Далее

Теперь ещё раз осуществим умножение катета А на sin(a), катета B на cos(a).

3*0.7= 2,1
3*0.7 = 2,1

3*0.7 + 3*0.7 =4.2

Снова получили число равное длине удочки… и мы вплотную подобрались к матрице поворота.

Напомню формулу

(изображение из Википедии. Ссылка на статью)

Возьмём её нижнюю часть — получение точки y:

y=x*sin(Ф)+y*cos(Ф)

И сравним с вычислениями выше:

3*0.7 + 3*0.7 = 4.2
y=x*sin(Ф)+y*cos(Ф)

Как две капли воды. Y в нашем случае окажется равным 4.2.
Если применить первую часть формулы к вычислениям, то получим:

3*0.7 — 3*0.7 = 0

Иными словами случится так:

x станет 0 — рыбак поймает леску.
y станет 4.2 — леска сравняется с длиной удочки.

Помним, что для вычисления x синус и косинус меняются местами.

Ф в данном случае равно 45 градусам (Ф = 0.7 ) и при таком угле синус и косинус равны, что удобно для примера. В остальных случаях очевидно величины для синуса и косинуса будут другие. Например, для 40 градусов: cosdegree(40) = 0,7660444431, sindegree(40) = 0,6427876097 (если вы не согласны, обращайтесь в Яндекс, я пользовался его калькулятором).

В итоге

Применяя формулу к новым значениям x,y несколько раз — в цикле, наглядно увидим движение по окружности, каждый раз на 45 градусов.

Если требуется сдвинуть вектор-удочку на один градус, то его и подставляем в формулу на место Ф.

Как происходит вычисление тригонометрических функций?!
Как известно, для вычисления косинуса и синуса угла обычно используются готовые функции. Согласно информации по ссылке вычисление и точность зависят от системы. Для unix-систем есть по крайней мере два варианта: функция, написанная в недрах компании IBM и встроенная инструкция fsin на Ассемблере. Есть также библиотека fdlibm с достаточно наглядным кодом и комментариями, по которым видно, что синус и косинус вычисляются в этой библиотеке через число pi.

А вдруг автор этой статьи все придумал?

Если у вас на компьютере есть веб-сервер и интерпретатор языка PHP, то можно поэкспериментировать со следующим кодом, который вращает блок CSS div:

Файл index.php

Заголовок спойлера

   

Если немного изменить матрицу, то можно получить вращение по спирали или сделать из точки маятник.

  • матрица поворта
  • вращение
  • тригонометрия
  • Математика
  • Читальный зал

Матрица поворота

В двумерном пространстве поворот можно описать одним углом θ . Положительным углам соответствует вращение против часовой стрелки.

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

Сам поворот происходит путём умножения p → ′ = M ⋅ p → .

Матрица поворота в трёхмерном пространстве [ ]

Матрицами вращения вокруг оси декартовой правосторонней системы координат на угол α в трёхмерном пространстве являются:

  • Вращение вокруг оси x:
  • Вращение вокруг оси y:
  • Вращение вокруг оси z:

В трёхмерном пространстве для описания поворота можно использовать

  • три угла, например, ( α , β , γ ) ,
  • угол поворота θ и единичный вектор оси вращения v ^ = ( x , y , z ) > = (x,y,z)> .

Матрицы поворота вектора в декартовой системе координат , соответствующие этим двум способам задания поворота:

M ( α , β , γ ) = ( cos ⁡ α cos ⁡ β cos ⁡ α sin ⁡ β sin ⁡ γ − sin ⁡ α cos ⁡ γ cos ⁡ α sin ⁡ β cos ⁡ γ + sin ⁡ α sin ⁡ γ sin ⁡ α cos ⁡ β sin ⁡ α sin ⁡ β sin ⁡ γ + cos ⁡ α cos ⁡ γ sin ⁡ α sin ⁡ β cos ⁡ γ − cos ⁡ α sin ⁡ γ − sin ⁡ β cos ⁡ β sin ⁡ γ cos ⁡ β cos ⁡ γ ) \cos \alpha \cos \beta & \cos \alpha \sin \beta \sin \gamma - \sin \alpha \cos \gamma & \cos \alpha \sin \beta \cos \gamma + \sin \alpha \sin \gamma \\ \sin \alpha \cos \beta & \sin \alpha \sin \beta \sin \gamma + \cos \alpha \cos \gamma & \sin \alpha \sin \beta \cos \gamma - \cos \alpha \sin \gamma \\ - \sin \beta & \cos \beta \sin \gamma & \cos \beta \cos \gamma \end >

M ( v ^ , θ ) = ( cos ⁡ θ + ( 1 − cos ⁡ θ ) x 2 ( 1 − cos ⁡ θ ) x y − ( sin ⁡ θ ) z ( 1 − cos ⁡ θ ) x z + ( sin ⁡ θ ) y ( 1 − cos ⁡ θ ) y x + ( sin ⁡ θ ) z cos ⁡ θ + ( 1 − cos ⁡ θ ) y 2 ( 1 − cos ⁡ θ ) y z − ( sin ⁡ θ ) x ( 1 − cos ⁡ θ ) z x − ( sin ⁡ θ ) y ( 1 − cos ⁡ θ ) z y + ( sin ⁡ θ ) x cos ⁡ θ + ( 1 − cos ⁡ θ ) z 2 ) >,\theta) = \begin \cos \theta + (1 - \cos \theta) x^2 & (1 - \cos \theta) x y - (\sin \theta) z & (1 - \cos \theta) x z + (\sin \theta) y \\ (1 - \cos \theta) y x + (\sin \theta) z & \cos \theta + (1 - \cos \theta) y^2 & (1 - \cos \theta) y z - (\sin \theta) x \\ (1 - \cos \theta) z x - (\sin \theta) y & (1 - \cos \theta) z y + (\sin \theta) x & \cos \theta + (1 - \cos \theta) z^2 \end >

Свойства матрицы поворота [ ]

Если M — матрица, задающая поворот вокруг оси n → > на угол ϕ , то:

  • | M v → | = | v → | ∀ v →
  • M n → = n →
  • ( M v → , v → ) = ( 1 − cos ⁡ φ ) ( n → v → ) 2 + cos ⁡ ( φ )
  • Tr ⁡ ( R ) = 1 + 2 cos ⁡ ( φ ) (R) = 1 + 2 \cos(\varphi)> (след матрицы вращения)
  • det M = 1 (матрица имеет единичный определитель).
  • если строки (или столбцы матрицы) рассматривать как координаты векторов a → , b → , c → , \vec> , то верны следующие соотношения):
    • | a → | = | b → | = | c → | = 1
    • a → b → = 0 , b → c → = 0 , c → a → = 0
    • a → × b → = c → , b → × c → = a → , c → × a → = b →

    Литература [ ]

    • Лурье А. И. Аналитическая механика - М .: Ссылки [ ]
    Это незавершённая статья по математике. Вы можете помочь проекту, исправив и дополнив её.
    Это незавершённая статья по Вы можете помочь проекту, исправив и дополнив её.

    Эта страница использует содержимое раздела Википедии на русском языке. Оригинальная статья находится по адресу: Матрица поворота. Список первоначальных авторов статьи можно посмотреть в истории правок. Эта статья так же, как и статья, размещённая в Википедии, доступна на условиях CC-BY-SA .

    Вращение фигуры в 3-х мерном пространстве

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

    Матрица поворота в трёхмерном пространстве

    Любое вращение в трехмерном пространстве может быть представлено как композиция поворотов вокруг трех ортогональных осей (например, вокруг осей декартовых координат). Этой композиции соответствует матрица, равная произведению соответствующих трех матриц поворота.
    Матрицами вращения вокруг оси декартовой системы координат на угол α в трёхмерном пространстве являются:
    Вращение вокруг оси x:

    Вращение вокруг оси y:

    Вращение вокруг оси z:

    После преобразований мы получаем формулы:
    По оси Х
    x'=x;
    y':=y*cos(L)+z*sin(L) ;
    z':=-y*sin(L)+z*cos(L) ;

    По оси Y
    x'=x*cos(L)+z*sin(L);
    y'=y;
    z'=-x*sin(L)+z*cos(L);

    По оси Z
    x'=x*cos(L)-y*sin(L);
    y'=-x*sin(L)+y*cos(L);
    z'=z;

    Все три поворота делаются независимо друг от друга, т.е. если надо повернуть вокруг осей Ox и Oy, вначале делается поворот вокруг оси Ox, потом применительно к полученной точки делается поворот вокруг оси Oy.

    Положительным углам при этом соответствует вращение вектора против часовой стрелки в правой системе координат, и по часовой стрелке в левой системе координат, если смотреть против направления соответствующей оси. Правая система координат связана с выбором правого базиса (см. правило буравчика).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *