Как я могу рассчитать эти значения?
Применительно к 2d / 3d преобразованиям матрица может быть представлена системой координат, если мы не говорим о проекциях.
Строки матрицы (или столбцы, в зависимости от обозначений) образуют оси новой системы координат, в которую будет помещен объект, если каждая вершина объекта умножается на матрицу. Последний ряд (или столбец, в зависимости от обозначений) указывает на центр новой системы координат.
Стандартная матрица преобразования OpenGL / DirectX (НЕ матрица проекции):
class Matrix{//C++ code
public:
union{
float f[16];
float m[4][4];
};
};
Может быть представлен как комбинация из 4 векторов vx (ось x новой системы координат), vy (ось y новой системы координат), vz (ось z новой системы координат) и vp (центр новая система). Как это:
vx.x vx.y vx.z 0
vy.x vy.y vy.z 0
vz.x vz.y vz.z 0
vp.x vp.y vp.z 1
Все «вычислить матрицу вращения», «вычислить матрицу масштаба» и т. Д. Ведут к этой идее.
Таким образом, для 2d матрицы у вас будет матрица 3x3, которая состоит из 3 векторов - vx, vy, vp, потому что в 2d нет вектора z. I.e.:
vx.x vx.y 0
vy.x vy.y 0
vp.x vp.y 1
Чтобы найти преобразование, которое преобразовало бы квад A, в квад B, вам нужно найти два преобразования:
- Преобразование, которое переместит квад А в начало координат (то есть в нулевую точку), и преобразует его в квад фиксированного размера. Скажем, quad (прямоугольник), у которого одна вершина x = 0, y = 0 и вершины которого расположены в точках (0, 1), (1, 0), (1, 1).
- Преобразование, которое превращает четырехугольник фиксированного размера в четырехугольник B.
Вы НЕ МОЖЕТЕ сделать это таким образом, если противоположные ребра четырехугольника не параллельны. То есть параллелограммы хороши, а случайные 4-сторонние многоугольники - нет.
Четырехугольник может быть представлен базовой точкой (vp), которая может быть любой вершиной четырехугольника, и двумя векторами, определяющими размеры квадра (направление ребра, умноженное на длину ребра). То есть вектор "вверх" и вектор "сторона". Что делает его матрицей:
side.x side.y 0
up.x up.y 0
vp.x vp.y 1
Таким образом, умножение квадрата (vp.x = 0, vp.y = 0, side.x = 1, side.y = 0, up.x = 0, up.y = 1) на эту матрицу превратится в оригинальный квад в ваш квад. Что означает, что для того, чтобы преобразовать
из четверки А в четверку В, вам нужно сделать следующее:
1) создать матрицу, которая преобразует «базовый квадрант из 1 единицы» в квадро А. Давайте назовем это matA.
2) создайте матрицу, которая преобразует «квад 1 единицы базы 1» в квад 4. Назовем это matB.
3) инвертировать matA и сохранить результат в invMatA.
4) матрица результата - invMatA * matB.
Готово. Если вы умножите квадра A на матрицу результатов, вы получите квад B. Это не будет работать, если у квадратов нулевая ширина или высота, и не будет работать, если квад не является параллелограммом.
Это трудно понять, но я не могу сделать это проще.