Матрицы аффинных преобразований в пространстве

Affine 3D

Матрицы аффинных преобразований в пространстве аналогичны матрицам на плоскости с той лишь разницей, что добавляется ещё одна координата. Соответственно, матрицы становятся размером 4✕4 и их становится больше. По-прежнему, только четыре разновидности преобразований: поворот, перенос, масштаб и сдвиг.

В общем виде

Преобразование в пространстве точки (x, y, z) в точку (x′, y′, z′) осуществляется по формулам:

Latex formulaLatex formulaLatex formula

Или в матричном виде:

Latex formula

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

Поворот

Поворот по оси X

Координаты меняются только в плоскости YZ. Координата X неизменна.

Угол α — угол от оси Y в сторону положительного направления Z.

МатрицаФормула
Latex formulaLatex formula
Latex formula
Latex formula

Поворот по оси Y

Координаты меняются только в плоскости XZ. Координата Y неизменна.

Угол α — угол от оси X в сторону положительного направления Z. Чтобы вращение было против часовой стрелки, берём угол со знаком «минус». Пояснения под таблицей.

МатрицаФормула
Latex formulaLatex formula
Latex formula
Latex formula
Пояснения

Если ничего не менять, вращение будет происходить по часовой стрелке. Чтобы исправить ситуацию, берём угол со знаком «минус». По формулам приведения видим, что cos(-α) = cos(α), sin(-α) = -sin(α). Поэтому знаки в формулах не перепутаны, все минусы и плюсы на своих местах.

[свернуть]

Поворот по оси Z

Координаты меняются только в плоскости XY. Координата Z неизменна.

Угол α — угол от оси X в сторону положительного направления Y.

МатрицаФормула
Latex formulaLatex formula
Latex formula
Latex formula

Перенос

Dx, Dy, Dz — смещения по соответствующим осям.

МатрицаФормула
Latex formulaLatex formula
Latex formula
Latex formula

Масштаб

Sx, Sy, Sz — коэффициенты масштаба по соответствующим осям.

МатрицаФункции
Latex formulaLatex formula
Latex formula
Latex formula

Сдвиг

Сдвигом называется любое преобразование, главная диагональ матрицы которого единичная. По традиции возьмём тангенс угла отклонения от выбранной оси в плоскости трансформации. Например, для сдвига от оси X плоскостью трансформации является YZ, поэтому выбираем углы либо от Y, либо от Z.

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

Сдвиг по оси X (в YZ)

Сдвиги происходят только в плоскости YZ. Координата X неизменна.

Угол α — угол от оси Y в сторону положительного направления Z.

Угол β — угол от оси Z в сторону положительного направления Y.

МатрицаФункции
Latex formulaLatex formula
Latex formula
Latex formula

Сдвиг по оси Y (в XZ)

Сдвиги происходят только в плоскости XZ. Координата Y неизменна.

Угол α — угол от оси X в сторону положительного направления Z.

Угол β — угол от оси Z в сторону положительного направления X.

МатрицаФункции
Latex formulaLatex formula
Latex formula
Latex formula

Сдвиг по оси Z (в XY)

Сдвиги происходят только в плоскости XY. Координата Z неизменна.

Угол α — угол от оси X в сторону положительного направления Y.

Угол β — угол от оси Y в сторону положительного направления X.

МатрицаФункции
Latex formulaLatex formula
Latex formula
Latex formula

Для копипаста

В Delphi существует модуль System.Math.Vectors, в котором есть всё необходимое для работы с матрицами 3D преобразований. Приведённый ниже код исключительно для копипаста с последующей модификацией под свои нужды там, где такой модуль отсутствует, либо это не Delphi.


Скачать

Друзья, спасибо за внимание! Возможно, будет продолжение, посмотрим )))

Пример работы с матрицами 3D преобразования сделан с использованием родного Delphi модуля System.Math.Vectors и GDI+.

Левая кнопка мыши вращает сцену, правая кнопка приближает/отдаляет. Зажатая средняя перетаскивает сцену по полотну. Клик любой кнопкой по левому верхнему углу сцены, там где надпись «Rotation Order: …», вызовет появление контекстного меню с дополнительными настройками. Клик на подписи слева у элементов редактирования вызовет старт соответствующего преобразования. Ну и конечно можно просто ввести значение руками.

Исходник (zip) 81 Кб. Delphi XE 7

Исполняемый файл (zip) 965 Кб (Скомпилирован в XE 7)


5 5 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Не нашли ответ на свой вопрос? Задайте его здесь!...x