Принцип преобразования трехмерных координат - перемещение, вращение, масштабирование

алгоритм

Однородные координаты

Для двумерной точки (x, y) все тройки вида (kx, ky, k) эквивалентны и являются однородными координатами точки. Однородные координаты — это представление исходного n-мерного вектора с n+1-мерным вектором, который относится к системе координат, используемой в проекционной геометрии, точно так же, как декартовы координаты, используемые в евклидовой геометрии.

умножение матриц

Умножение матриц господин Жуань Ифэн написал понятно, можно посмотреть детализдесь

Линейное преобразование матрицы

Линейное преобразование матрицы — это преобразование из линейного пространстваV_1Определенная точка переходит в другое линейное пространствоV_2другой точки движения. То есть точка может быть преобразована не только в другую точку того же линейного пространства, но и в другую точку другого линейного пространства.

Связь между матрицами и линейными преобразованиями: Сама матрица описывает систему координат, а умножение матрицы на матрицу описывает движение. Другими словами: если матрица появляется только сама по себе, то она описывает систему координат, если она появляется одновременно с другой матрицей или вектором и производит умножение, то она представляет движение (линейное преобразование)

Математическое выражение:\vec b = M\vec a, то есть матрица M описывает вектор\vec aв вектор\vec bупражнение

Если трехмерную координату D1 преобразовать в координату D2 через матрицу M, то это можно выразить как:D2 = D1·M=\begin{bmatrix}a1 & b1 & c1\\a2 & b2 & c2 \\a3 & b3 & c3 \\\end{bmatrix} \begin{pmatrix}x1\\y2\\z3\\\end{pmatrix}=x1\begin{pmatrix}a1\\a2\\a3\\\end{pmatrix} + y1\begin{pmatrix}b1\\b2\\b3\\\end{pmatrix} + z1\begin{pmatrix}c1\\c2\\c3\\\end{pmatrix} = \begin{pmatrix}X\\Y\\Z\\\end{pmatrix}

Преобразование координат

Сковорода

Предположим, что в трехмерной системе координат координат пространства точкаA_i(x, y, z) перемещает dx в направлении x, dy в направлении y и dz в направлении z. пункт прибытияA_j(Х, Y, Z), то

X = x + dx
Y = y + dy
Z = z + dz

Как упоминалось выше, существует матрица переноса M такая, чтоA_iM = A_j, но в чисто трехмерной матрице мы никогда не сможем найти такую ​​матрицу M, которая делает условие верным. В этом случае можно использовать однородные координаты. Однородные координаты указывают, что n + 1-мерный вектор используется для представления исходного n-мерного вектора.A_i(x, y, z) выражается как (x, y, z, 1), то можно получить матрицу M

M = \begin{bmatrix}1& 0 & 0& 0\\0 & 1 & 0 & 0 \\ 0& 0 & 1& 0\\dx & dy & dz & 1\\\end{bmatrix}

Валидация: предположениеA_i(4, 8, 2), направление x перемещает dx, направление y перемещает dy, а направление z перемещает dz, тогдаA_j(4+dx, 8+dy , 2+dz) A_j = A_i·M=\begin{pmatrix}4&8&2&1\\\end{pmatrix}\begin{bmatrix}1& 0 & 0& 0\\0 & 1 & 0 & 0 \\ 0& 0 & 1& 0\\dx & dy & dz & 1\\\end{bmatrix}  = \begin{pmatrix}4+dx& 8+dy & 2 + dz & 1\end{pmatrix}

зум

Предположим, что в трехмерной пространственной системе координат точкаA_i(x, y, z) масштабирует Sx по оси x, Sy по оси y и Sz по оси z. пункт прибытияA_j(Х, Y, Z), то

X = x * Sx
Y = y * Sy
Z = z * Sz

Точно так же масштабная матрица

M = \begin{bmatrix}Sx& 0 & 0& 0\\0 & Sy & 0 & 0 \\ 0& 0 & Sz& 0\\0 & 0 & 0 & 1\\\end{bmatrix}

вращать

Вращение матриц сложнее и требует тригонометрических функций. точкаA_iКогда (x, y, z) поворачивается на θ градусов вокруг оси X, достигается точкаA_j(Х, Y, Z), то

X = X
Y = y*cosθ - y*sinθ
z = z*sinθ + z*cosθ

Матрица M

M = \begin{bmatrix}1& 0 & 0& 0\\0  & cosθ & sinθ & 0 \\ 0 & -sinθ& cosθ& 0\\0 & 0 & 0 & 1\\\end{bmatrix}

При вращении вокруг оси Y

M = \begin{bmatrix}cosθ& 0 & -sinθ& 0\\0  & 1 & 0 & 0 \\ sinθ & 0& cosθ& 0\\0 & 0 & 0 & 1\\\end{bmatrix}

При вращении вокруг оси Z

M = \begin{bmatrix}cosθ& sinθ & 0& 0\\-sinθ  & cosθ & 0 & 0 \\ 0 & 0& 1& 0\\0 & 0 & 0 & 1\\\end{bmatrix}

Трансформация 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));

После того, как матрица трансляции получена, она передается в вершинный шейдер и умножается на вычисляемую точку, чтобы получить координаты целевой точки.