Поделиться через


Обзор преобразования

Преобразования матрицы обрабатывают много низкоуровневой математики трехмерной графики.

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

Преобразование и пространство Description
Координаты модели в пространстве модели В начале конвейера вершины модели объявляются относительно локальной системы координат. Это локальный источник и ориентация. Эта ориентация координат часто называется пространством модели. Отдельные координаты называются координатами модели.
Мир преобразуется в пространство мира Первый этап конвейера геометрии преобразует вершины модели из локальной системы координат в систему координат, которая используется всеми объектами в сцене. Процесс переориентации вершин называется преобразованием Мира, которое преобразуется из пространства модели в новую ориентацию, называемую мировым пространством. Каждая вершина в мировом пространстве объявлена с помощью координат мира.
Преобразование представления в пространство просмотра (пространство камеры) На следующем этапе вершины, описывающие трехмерный мир, ориентированы на камеру. То есть приложение выбирает точку зрения для сцены, а координаты мирового пространства перемещаются и поворачиваются вокруг представления камеры, превращая пространство мира в пространство просмотра (также известное как пространство камеры). Это преобразование представления, которое преобразуется из мирового пространства для просмотра пространства.
Преобразование проекции в пространство проекции Следующий этап — преобразование проекции, которое преобразуется из пространства представления в пространство проекции. В этой части конвейера объекты обычно масштабируются по отношению к их расстоянию от средства просмотра, чтобы дать иллюзию глубины сцене; Закрываемые объекты создаются для отображения большего размера, чем удаленные объекты. Для простоты эта документация ссылается на пространство, в котором вершины существуют после преобразования проекции в качестве пространства проекции. Некоторые графические книги могут ссылаться на пространство проекции как однородное пространство после перспективы. Не все преобразования проекции масштабирует размер объектов в сцене. Такая проекция иногда называется аффинной или ортогональной проекцией.
Вырезка в пространстве экрана В последней части конвейера все вершины, которые не будут видимы на экране, удаляются, чтобы растризатор не занимает время, чтобы вычислить цвета и затенение для чего-то, что никогда не будет видно. Этот процесс называется вырезки. После вырезки остальные вершины масштабируются в соответствии с параметрами окна просмотра и преобразуются в координаты экрана. Полученные вершины, видимые на экране, когда сцена растеризована, существуют в пространстве экрана.

 

Преобразования используются для преобразования геометрии объектов из одного пространства координат в другое. Direct3D использует матрицы для выполнения трехмерных преобразований. Матрицы создают трехмерные преобразования. Матрицы можно объединить для создания одной матрицы, которая охватывает несколько преобразований.

Можно преобразовать координаты между пространством модели, пространством мира и пространством просмотра.

  • Преобразование мира — преобразуется из пространства модели в мир.
  • Преобразование представления — преобразуется из мирового пространства для просмотра пространства.
  • Преобразование проекции — преобразуется из пространства представления в пространство проекции.

Преобразования матрицы

В приложениях, работающих с трехмерной графикой, можно использовать геометрические преобразования для выполнения следующих действий:

  • Выражение расположения объекта относительно другого объекта.
  • Поворот и размер объектов.
  • Изменение позиций, направлений и перспектив.

Вы можете преобразовать любую точку (x,y,z) в другую точку (x', y', z') с помощью матрицы 4x4, как показано в следующем уравнении.

уравнение преобразования любой точки в другую точку

Выполните следующие уравнения (x, y, z) и матрицу, чтобы создать точку (x', y', z).

уравнения для новой точки

Наиболее распространенными преобразованиями являются преобразование, поворот и масштабирование. Матрицы, которые создают эти эффекты, можно объединить в одну матрицу, чтобы вычислить несколько преобразований одновременно. Например, можно создать одну матрицу для преобразования и поворота ряда точек.

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

уравнение матрицы для равномерного масштабирования

В C++Direct3D объявляет матрицы в виде двухмерного массива с помощью структуры матрицы. В следующем примере показано, как инициализировать структуру D3DMATRIX для работы в качестве единой матрицы масштабирования (коэффициент масштабирования "s").

D3DMATRIX scale = {
    5.0f,            0.0f,            0.0f,            0.0f,
    0.0f,            5.0f,            0.0f,            0.0f,
    0.0f,            0.0f,            5.0f,            0.0f,
    0.0f,            0.0f,            0.0f,            1.0f
};

Перевести

Следующее уравнение преобразует точку (x, y, z) в новую точку (x', y', z').

уравнение матрицы перевода для новой точки

Матрицу перевода можно создать вручную в C++. В следующем примере показан исходный код функции, создающей матрицу для преобразования вершин.

D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
    D3DXMATRIX ret;

    D3DXMatrixIdentity(&ret);
    ret(3, 0) = dx;
    ret(3, 1) = dy;
    ret(3, 2) = dz;
    return ret;
}    // End of Translate

Шкала

Следующее уравнение масштабирует точку (x, y, z) произвольными значениями в направлениях x, y и z до новой точки (x', y', z').

уравнение матрицы масштабирования для новой точки

Вращать

Описанные здесь преобразования предназначены для систем координат левой руки и поэтому могут отличаться от матриц преобразования, которые вы видели в другом месте.

Следующее уравнение поворачивает точку (x, y, z) вокруг оси x, создавая новую точку (x', y', z').

уравнение матрицы поворота x для новой точки

Следующее уравнение поворачивает точку вокруг оси Y.

уравнение матрицы поворота y для новой точки

Следующее уравнение поворачивает точку вокруг оси Z.

уравнение матрицы поворота z для новой точки

В этих примерах матрицы греческие буквы тета обозначает угол поворота в радианах. Угловы измеряются по часовой стрелке при просмотре по оси поворота по отношению к источнику.

В следующем коде показана функция для обработки поворота по оси X.

    // Inputs are a pointer to a matrix (pOut) and an angle in radians.
    float sin, cos;
    sincosf(angle, &sin, &cos);  // Determine sin and cos of angle

    pOut->_11 = 1.0f; pOut->_12 =  0.0f;   pOut->_13 = 0.0f; pOut->_14 = 0.0f;
    pOut->_21 = 0.0f; pOut->_22 =  cos;    pOut->_23 = sin;  pOut->_24 = 0.0f;
    pOut->_31 = 0.0f; pOut->_32 = -sin;    pOut->_33 = cos;  pOut->_34 = 0.0f;
    pOut->_41 = 0.0f; pOut->_42 =  0.0f;   pOut->_43 = 0.0f; pOut->_44 = 1.0f;

    return pOut;
}

Сцепляющие матрицы

Одним из преимуществ использования матриц является объединение эффектов двух или нескольких матриц путем умножения их. Это означает, что для поворота модели и перевода ее в некоторое расположение не требуется применять две матрицы. Вместо этого вы умножаете матрицы поворота и перевода, чтобы создать составную матрицу, содержащую все их эффекты. Этот процесс, называемый объединением матриц, можно записать с помощью следующего уравнения.

уравнение объединения матриц

В этом уравнении C — это составная матрица, созданная, и M₁ через Mn являются отдельными матрицами. В большинстве случаев сцепляются только две или три матрицы, но нет предела.

Порядок, в котором выполняется умножение матрицы, имеет решающее значение. Предыдущая формула отражает правило объединения матрицы слева направо. То есть видимые эффекты матриц, которые используются для создания составной матрицы, происходят в левом порядке вправо. Типичная матрица мира показана в следующем примере. Представьте, что вы создаете мировую матрицу для стереотипного летающего соуса. Вы, вероятно, хотите спина летающего соуса вокруг своего центра - ось Y пространства модели - и перевести его в другое место в вашей сцене. Для этого сначала создайте матрицу поворота, а затем умножьте ее на матрицу перевода, как показано в следующем уравнении.

уравнение спина на основе матрицы поворота и матрицы перевода

В этой формуле Ry представляет собой матрицу для поворота вокруг оси y , а Tw — преобразование в некоторое положение в координатах мира.

Порядок умножения матриц важен, так как, в отличие от умножения двух скалярных значений, умножение матрицы не является коммутативным. Умножение матриц в противоположном порядке имеет визуальный эффект перевода летающего соуса в его положение мирового пространства, а затем поворот его по всему миру происхождения.

Независимо от типа создаваемой матрицы помните правило слева направо, чтобы обеспечить достижение ожидаемых эффектов.

Преобразования