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


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

Матричные преобразования выполняют множество низкоуровневых математических вычислений трехмерной графики.

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

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

 

Преобразования используются для преобразования геометрии объектов из одного пространства координат в другое. 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₁ до Mₙ представляют собой отдельные матрицы. В большинстве случаев сцепляются только две или три матрицы, но нет предела.

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

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

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

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

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

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