1,0,0; Поворот Z → 45; Поворот → 90,1,0,0; Масштаб → 2,2,2
Онлайн-инструмент собирает последовательность преобразований — перенос, поворот, масштаб и произвольные оси — в одну итоговую однородную матрицу 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), а также прогоните обратную операцию — примените инверсию к полученным точкам и сравните с исходными; расхождение даёт быстрый индикатор неисправности в порядке операций или в некорректных входных параметрах.








