Однородные координаты
Для двумерной точки (x, y) все тройки вида (kx, ky, k) эквивалентны и являются однородными координатами точки. Однородные координаты — это представление исходного n-мерного вектора с n+1-мерным вектором, который относится к системе координат, используемой в проекционной геометрии, точно так же, как декартовы координаты, используемые в евклидовой геометрии.
умножение матриц
Умножение матриц господин Жуань Ифэн написал понятно, можно посмотреть детализдесь
Линейное преобразование матрицы
Линейное преобразование матрицы — это преобразование из линейного пространстваОпределенная точка переходит в другое линейное пространстводругой точки движения. То есть точка может быть преобразована не только в другую точку того же линейного пространства, но и в другую точку другого линейного пространства.
Связь между матрицами и линейными преобразованиями: Сама матрица описывает систему координат, а умножение матрицы на матрицу описывает движение. Другими словами: если матрица появляется только сама по себе, то она описывает систему координат, если она появляется одновременно с другой матрицей или вектором и производит умножение, то она представляет движение (линейное преобразование)
Математическое выражение:, то есть матрица M описывает векторв векторупражнение
Если трехмерную координату D1 преобразовать в координату D2 через матрицу M, то это можно выразить как:
Преобразование координат
Сковорода
Предположим, что в трехмерной системе координат координат пространства точка(x, y, z) перемещает dx в направлении x, dy в направлении y и dz в направлении z. пункт прибытия(Х, Y, Z), то
X = x + dx
Y = y + dy
Z = z + dz
Как упоминалось выше, существует матрица переноса M такая, что, но в чисто трехмерной матрице мы никогда не сможем найти такую матрицу M, которая делает условие верным. В этом случае можно использовать однородные координаты. Однородные координаты указывают, что n + 1-мерный вектор используется для представления исходного n-мерного вектора.(x, y, z) выражается как (x, y, z, 1), то можно получить матрицу M
Валидация: предположение(4, 8, 2), направление x перемещает dx, направление y перемещает dy, а направление z перемещает dz, тогда(4+dx, 8+dy , 2+dz)
зум
Предположим, что в трехмерной пространственной системе координат точка(x, y, z) масштабирует Sx по оси x, Sy по оси y и Sz по оси z. пункт прибытия(Х, Y, Z), то
X = x * Sx
Y = y * Sy
Z = z * Sz
Точно так же масштабная матрица
вращать
Вращение матриц сложнее и требует тригонометрических функций. точкаКогда (x, y, z) поворачивается на θ градусов вокруг оси X, достигается точка(Х, Y, Z), то
X = X
Y = y*cosθ - y*sinθ
z = z*sinθ + z*cosθ
Матрица M
При вращении вокруг оси Y
При вращении вокруг оси Z
Трансформация EULER - это продукт трех вращений о оси матрицы вращения
Пример анализа
В webgl — библиотека, обычно используемая для матричных преобразований.glmatrixЕсть расчет матрицы переводаtranslateметод
/**
* Translate a mat4 by the given vector
*
* @param {mat4} out the receiving matrix
* @param {mat4} a the matrix to translate
* @param {vec3} v vector to translate by
* @returns {mat4} out
*/
function translate(out, a, v) {
var x = v[0],
y = v[1],
z = v[2];
var a00 = void 0,
a01 = void 0,
a02 = void 0,
a03 = void 0;
var a10 = void 0,
a11 = void 0,
a12 = void 0,
a13 = void 0;
var a20 = void 0,
a21 = void 0,
a22 = void 0,
a23 = void 0;
if (a === out) {
out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];
} else {
a00 = a[0];a01 = a[1];a02 = a[2];a03 = a[3];
a10 = a[4];a11 = a[5];a12 = a[6];a13 = a[7];
a20 = a[8];a21 = a[9];a22 = a[10];a23 = a[11];
out[0] = a00;out[1] = a01;out[2] = a02;out[3] = a03;
out[4] = a10;out[5] = a11;out[6] = a12;out[7] = a13;
out[8] = a20;out[9] = a21;out[10] = a22;out[11] = a23;
out[12] = a00 * x + a10 * y + a20 * z + a[12];
out[13] = a01 * x + a11 * y + a21 * z + a[13];
out[14] = a02 * x + a12 * y + a22 * z + a[14];
out[15] = a03 * x + a13 * y + a23 * z + a[15];
}
return out;
}
Обычно метод перевода используется для создания матрицы перевода, а затем шейдер может использовать эту матрицу перевода для вычисления значения gl_Position. Из приведенных выше результатов мы знаем, что матрица перевода определяется последними четырьмя цифрами, поэтому нам нужно вычислить только последние четыре цифры массива. По алгоритму матрицы можно получить результат.
Обычно, если вы хотите создать матрицу перевода в webgl, вы можете использовать следующий метод.
var translateMatrix = mat4.create(); //创建单位矩阵
mat4.translate(translateMatrix, translateMatrix, vec3.fromValues(dx, dy, dz));
После того, как матрица трансляции получена, она передается в вершинный шейдер и умножается на вычисляемую точку, чтобы получить координаты целевой точки.