Калькулятор матричных преобразований

Примеры ввода: Перенос → 1,0,0; Поворот Z → 45; Поворот → 90,1,0,0; Масштаб → 2,2,2
В порядке списка
В обратном порядке
Итоговая матрица 4×4
Преобразованные точки x, y, z

Онлайн-инструмент собирает последовательность преобразований — перенос, поворот, масштаб и произвольные оси — в одну итоговую однородную матрицу 4×4 и применяет её к набору точек (x,y,z). Удобно при сборке 3D-моделей, переводе координат между локальной и глобальной системами и при проверке порядка применения трансформаций. Программа пригодится для инженеров и конструкторов, работающих со сборками и локальными системами координат; разработчикам CAD-пайплайнов; студентам и преподавателям, изучающим матричные преобразования в графике и механике.

Коротко о методе

$$
p’ = M_{\text{total}}\,p,\qquad
p=\begin{pmatrix}x\\[4pt]y\\[4pt]z\\[4pt]1\end{pmatrix}
$$

  • \(p\) — входная точка в однородных координатах;
  • \(p’\) — преобразованная точка;
  • \(M_{\text{total}}\) — итоговая 4×4 матрица композиции.

Базовые матрицы

Перенос:

$$
T(t_x,t_y,t_z)=\begin{pmatrix}
1&0&0&t_x\\[4pt]
0&1&0&t_y\\[4pt]
0&0&1&t_z\\[4pt]
0&0&0&1
\end{pmatrix}
$$

Масштаб:

$$
S(s_x,s_y,s_z)=\begin{pmatrix}
s_x&0&0&0\\[4pt]
0&s_y&0&0\\[4pt]
0&0&s_z&0\\[4pt]
0&0&0&1
\end{pmatrix}
$$

Повороты вокруг осей X/Y/Z, угол \(\alpha\), в радианах:

$$
R_x(\alpha)=\begin{pmatrix}
1&0&0&0\\[4pt]
0&\cos\alpha&-\sin\alpha&0\\[4pt]
0&\sin\alpha&\cos\alpha&0\\[4pt]
0&0&0&1
\end{pmatrix},
$$
$$
R_y(\alpha)=\begin{pmatrix}
\cos\alpha&0&\sin\alpha&0\\[4pt]
0&1&0&0\\[4pt]
-\sin\alpha&0&\cos\alpha&0\\[4pt]
0&0&0&1
\end{pmatrix},
$$
$$
R_z(\alpha)=\begin{pmatrix}
\cos\alpha&-\sin\alpha&0&0\\[4pt]
\sin\alpha&\cos\alpha&0&0\\[4pt]
0&0&1&0\\[4pt]
0&0&0&1
\end{pmatrix}
$$

Поворот вокруг произвольной оси \(\mathbf{u}=(u_x,u_y,u_z)\) (нормализованной) — блок 3×3 по формуле Родригеса:

Итоговая 4×4 собирается вставкой этого 3×3 в верхний левый угол и единицы в правый нижний угол.

Композиция преобразований и порядок

Если список преобразований \( [M_1, M_2, \dots, M_n] \) (в отображаемом порядке), то итог вычисляется как

$$
M_{\text{total}} = M_n \cdot M_{n-1} \cdots M_2 \cdot M_1.
$$

  • «Применять в порядке списка» — используем порядок как есть.
  • «Применять в обратном порядке» — предварительно переворачиваем список, затем собираем композицию по тому же правилу.

Важно: умножение матриц некоммутативно — изменение порядка даёт другой результат.

Переход локальные ⇄ глобальные

$$
\text{Local}\to\text{Global}:\; p’ = M_{\text{total}}\,p,
$$
$$
\text{Global}\to\text{Local}:\; p = M_{\text{total}}^{-1}\,p’.
$$

Если \(M_{\text{total}}\) вырождена (детерминант линейной части = 0), обратной матрицы не существует — интерфейс показывает предупреждение.

Пример 1: translate(2, −1, 0.5) затем rotateZ(30°)

Список (в порядке): 1) translate(2, −1, 0.5), 2) rotateZ(30°). Угол в градусах — 30° (в вычислениях преобразуется в радианы).

Матрица переноса:

$$
T=\begin{pmatrix}
1&0&0&2\\[4pt]
0&1&0&-1\\[4pt]
0&0&1&0.5\\[4pt]
0&0&0&1
\end{pmatrix}
$$

Матрица поворота Z (30°):

$$
R_z=\begin{pmatrix}
\cos 30^\circ & -\sin 30^\circ & 0 & 0\\[4pt]
\sin 30^\circ & \cos 30^\circ & 0 & 0\\[4pt]
0 & 0 & 1 & 0\\[4pt]
0 & 0 & 0 & 1
\end{pmatrix}
\approx
$$
$$
\begin{pmatrix}
0.866 & -0.5 & 0 & 0\\[4pt]
0.5 & 0.866 & 0 & 0\\[4pt]
0 & 0 & 1 & 0\\[4pt]
0 & 0 & 0 & 1
\end{pmatrix}
$$

Итог (собираем \(M_{\text{total}} = R_z \cdot T\)) — в числах, округлённо:

$$
M_{\text{total}}\approx
\begin{pmatrix}
0.866 & -0.5 & 0 & 2.232\\[4pt]
0.5 & 0.866 & 0 & 0.133\\[4pt]
0 & 0 & 1 & 0.5\\[4pt]
0 & 0 & 0 & 1
\end{pmatrix}
$$

Преобразуем точку \(p=(1,0,0)\):

  • Сначала перенос: \(p_1=(3,-1,0.5)\).
  • Затем поворот Z: \(p’ = R_z p_1 \approx (3.098,\;0.633,\;0.5)\).

Пример 2: rotate(axis=(1,1,0), 45°) затем scale(2,1,1)

Список (в порядке): 1) rotate(45°, axis=(1,1,0)), 2) scale(2,1,1).

Нормируем ось: u = (1,1,0), \(L=\sqrt{2}\), \(\mathbf{\hat u}=(1/\sqrt2,1/\sqrt2,0)\). По Родригесу строим 3×3-блок поворота, затем 4×4 и умножаем на матрицу масштаба.

Итоговая матрица (численно, округлённо):

$$
M_{\text{total}}\approx
\begin{pmatrix}
1.7071 & 0.2929 & 1.0000 & 0\\[4pt]
0.1464 & 0.8536 & -0.5 & 0\\[4pt]
-0.5 & 0.5 & 0.7071 & 0\\[4pt]
0 & 0 & 0 & 1
\end{pmatrix}
$$

Для точки \(p=(0,1,0)\): после поворота \(p_1\approx(0.14645,0.85355,0.5)\), после масштаба \(p’\approx(0.2929,0.85355,0.5)\).

Входные параметры

  • Список точек (x,y,z) — по строкам;
  • Последовательность преобразований: тип (translate/rotateX/rotateY/rotateZ/rotate/scale) и параметры;
  • Параметр «Применять в порядке списка / в обратном порядке» — меняет порядок композиции;
  • Направление: Local → Global или Global → Local (при выборе Global → Local используется обратная матрица \(M_{\text{total}}^{-1}\)).

Выходы

  • Итоговая матрица 4×4 (читаемая в виде 4 строк);
  • Преобразованные координаты точек (x,y,z);
  • Флаг обратимости матрицы (есть/нет);
  • Возможность экспорта точек в CSV и копирования матрицы в буфер.

Практические замечания

  • Порядок операций критичен: перенос и поворот не взаимозаменяемы.
  • Для поворотов в интерфейсе вводите угол в градусах — программа переводит в радианы при вычислениях.
  • Масштабирование с нулевым коэффициентом делает матрицу сингулярной (необратимой).
  • Для визуальной проверки рекомендуем использовать небольшую тестовую точку и переключать порядок применения.

Для представления и интерполяции поворотов часто удобнее использовать кватернионы: они минимизируют риск «блокировки Гимбла», дают плавный SLERP-интерполятор и экономичнее в хранении по сравнению с 3×3-блоком матрицы. При необходимости комбинировать вращение и перенос в одной сущности рассматривайте двойные кватернионы — они компактно представляют твердые телесные трансформации без артефактов, характерных для простых матриц при анимации скелета. Если вы конвертируете матрицу в кватернион, сначала обязательно нормализуйте или ортонормализуйте 3×3 блок, иначе извлечённый кватернион будет содержать ошибки.

📝 При частых последовательных умножениях матриц накапливаются ошибки плавающей точки; для анимации и долгих цепочек трансформаций периодически «перезапекайте» или реинициализируйте параметры: храните исходные TRS-параметры (translation/rotation/scale) и пересчитывайте матрицу от них, вместо многократного перемножения матриц. Для исправления накопленной неточности полезна ортонормализация вращательной части через метод Грама–Шмидта или полярное разложение — это возвращает 3×3 блок в ближайшую ортонормальную матрицу и устраняет дрейф.

Если требуется инверсия только жёсткой трансформации, без сдвига масштаба, используйте быстрый трюк: транспонировать 3×3 вращательную часть и умножить на отрицание перевода — это экономичнее, чем общий алгоритм обратной матрицы и даёт точный результат для ортонормальных вращений. Для матриц с неравномерным масштабированием или сдвигом, где может появиться сдвиг/срез, применяйте разложение на TRS: сначала извлекайте масштаб/срез/поворот, корректно обходите порядок, и инвертируйте каждую компоненту отдельно; в критичных случаях используйте SVD для стабильного вычисления псевдо-обратной матрицы.

При работе с различными графическими движками и форматами обязательно фиксируйте соглашения в метаданных: порядок умножения, хранение матрицы, ориентация осей (правосторонняя против левосторонней), единицы углов (градусы/радианы). Ошибки на этом уровне — частая причина «неправильной ориентации» при переносе сцен между приложениями. Тест для проверки соответствия — применить матрицу к трём базисным векторам (1,0,0), (0,1,0), (0,0,1) и посмотреть, образуют ли они ожидаемую систему координат (ориентация и масштаб).

Если вы ожидаете случайные или близкие к сингулярности матрицы (детерминант ≈ 0), перед применением лучше оценить обусловленность (condition number) или детерминант линейной части; при плохой обусловленности используйте регуляризацию или SVD-псевдообратную, чтобы избежать «взрывов» координат при инверсии. Для геометрии с критичной точностью храните и вычисляйте на стороне сервера или в WebAssembly/wasm с double precision, поскольку JavaScript Number — это double, но многие WebGL-шейдеры работают на float32, и там точность заметно ниже.

Наконец, для отладки полезно проверять матрицу на корректность простыми эвристиками: примените её к нулевой точке, к единичному вектору и посмотрите, не получаются ли нештатные значения (NaN, Inf), а также прогоните обратную операцию — примените инверсию к полученным точкам и сравните с исходными; расхождение даёт быстрый индикатор неисправности в порядке операций или в некорректных входных параметрах.

Оцените материал:

5 / 5. Рейтинг: 1

Может подскажете что улучшить?