Общие сведения о преобразованиях
В этом разделе рассматриваются основы преобразований Direct2D и примеры различных преобразований. Он содержит следующие части:
- Что такое преобразование Direct2D?
- В пространстве координат Direct2D
- создание матриц преобразования
- трансформации целевого отрисовочного объекта
- преобразования кисти
- геометрические преобразования
- как преобразование целевого объекта отрисовки влияет на клипы
- Сводка
- сопутствующие темы
Что такое преобразование Direct2D?
Преобразование указывает, как сопоставить точки объекта из одного пространства координат с другим или изменить их положение в пределах того же пространства координат. Это сопоставление описывается матрицей преобразования, определенной как коллекция из трех строк с тремя столбцами значений FLOAT, как показано в следующей таблице.
M11По умолчанию: 1.0 | M12Default: 0.0 | 0.0 |
M21Default: 0.0 | M22Default: 1.0 | 0.0 |
M31OffsetX: 0.0 | M32OffsetY: 0.0 | 1.0 |
В этой матрице элементы M11, M12, M21 и M22 определяют линейное преобразование, которое может масштабировать, поворачивать или наклонять объект, элементы OffsetX и OffsetY определяют сдвиг, применяемый после линейного преобразования. Для аффинных преобразований значения в третьем столбце всегда равно 0.0, 0.0 и 1.0.
Поскольку Direct2D поддерживает только аффинные (линейные) преобразования, его матрица преобразования определяется как матрица преобразования 3–2, пропуская третий столбец из предыдущей матрицы преобразования. В следующей таблице показан макет матрицы преобразования Direct2D.
M11Default: 1.0 | M12По умолчанию: 0.0 |
M21Default: 0.0 | M22Default: 1.0 |
M31OffsetX: 0.0 | M32OffsetY: 0.0 |
В Direct2D эта матрица размером три на два представлена структурой D2D1_MATRIX_3X2. Чтобы упростить распространенные операции матрицы, Direct2D также предоставляет класс с именем Matrix3x2F, который является производным от структуры D2D1_MATRIX_3X2.
Конструктор по умолчанию для Matrix3x2F оставляет объект неинициализированным. Чтобы получить матрицу удостоверений, используйте Matrix3x2F::Identity.
Если к объекту применяется тождественное преобразование, оно не изменяет его положение, размер или форму. Это аналогично тому, как умножение числа на 1 не изменяет число. Другими словами, преобразование идентичности оставляет координаты точек неизменными и не перемещает их на новую позицию. Любое преобразование, отличное от единичного преобразования, изменит положение, форму и/или размер объектов.
Преобразования — это все о координатах, и понимание пространства координат Direct2D важно для понимания использования преобразований.
Пространство координат Direct2D
Direct2D использует леворукую систему координат, что означает, что положительные значения по оси x увеличиваются вправо, а положительные значения по оси y увеличиваются вниз. Все на экране расположено относительно источника, то есть точка, в которой пересекаются оси x и Y (0, 0), как показано на следующем рисунке. Целевые объекты отрисовки Direct2D используют это пространство координат.
Управляя значениями в матрице преобразования, можно повернуть, масштабировать, наклонить и переместить (перевести) объект. Например, если для параметра OffsetX задано значение 100 и OffsetY равным 200, объект перемещается вправо на 100 пикселей и вниз 200 пикселей.
Чтобы показать эффект перемещения объекта, необходимо применить преобразование переноса к целевым поверхностям отрисовки, кистям или геометриям. Применение преобразования к целям отрисовки воздействует на весь экран, тогда как преобразование, применённое к кисти или геометрии, влияет только на конкретную кисть или геометрию. Чтобы создать матрицу преобразования, используйте класс Matrix3x2F.
Создание матриц преобразования
Для создания преобразований, таких как поворот, масштабирование, отклонение и перемещение, класс Matrix3x2F предоставляет доступ к статическим методам, показанным в следующей таблице. Столбец "Пример" в таблице содержит ссылки на разделы с инструкциями, как использовать каждый метод преобразования.
Метод | Описание | Пример | Иллюстрация |
---|---|---|---|
matrix3x2f::rotate | создает преобразование поворота, которое имеет указанный угол и центральную точку. | как повернуть объект |
![]() |
matrix3x2f::scale | создает преобразование масштабирования, которое имеет указанные коэффициенты масштабирования и центровую точку. | масштабирование объекта |
![]() |
matrix3x2f::skew | создает преобразование с отклонением, которое содержит указанные значения оси x и y-оси и центральную точку. | как исказить объект |
![]() |
matrix3x2f::translation | создает параллельный перенос и задает смещение в направлении осей X и Y. | как перевести объект |
![]() |
Преобразования целевого объекта отрисовки
Целевой объект отрисовки — это ресурс, наследующий интерфейс ID2D1RenderTarget. Он создает ресурсы для рисования и выполняет фактические операции рисования. Он также предоставляет методы преобразования пространства координат. Можно вызвать метод ID2D1RenderTarget::SetTransform, чтобы применить указанное преобразование к целевому объекту отрисовки. Все последующие операции рисования происходят в преобразованном пространстве.
Чтобы отобразить содержимое, используйте методы рисования целевого объекта отрисовки. Перед началом рисования вызовите метод BeginDraw. Чтобы завершить отрисовку содержимого, вызовите метод EndDraw. Пример см. в разделе Применение нескольких преобразований к объекту.
Преобразования кисти
Вы можете настроить преобразование на кисти, вызвав SetTransform. Для этого преобразования можно рассматривать кисть как большой лист бумаги, а различные примитивы отрисовки (текст, геометрия, прямоугольник и т. д.) как трафареты. Когда вы корректируете преобразование кисти, это так, как если бы вы скользили большой кусок бумаги под трафаретом, не изменяя позицию самого трафарета. Этот метод можно использовать для того, чтобы текст исчезал от желтого до черного в трехмерное пространство.
Когда преобразование кисти является тождественным преобразованием, кисти отображаются в том же пространстве координат, что и целевой объект визуализации, в котором они рисуются. Преобразование кисти позволяет пользователю изменять сопоставление координат кисти с этим пространством.
Пространство кисти указывается иначе в Direct2D, чем в Windows Presentation Foundation (WPF). В Direct2D пространство кисти не относится к объекту, который рисуется, а является текущей системой координат целевого объекта отрисовки, преобразованной преобразованием кисти, если есть один. Чтобы заполнить объект, как было сделано в WPF, необходимо перевести исходное пространство кисти в левый верхний угол ограничивающего прямоугольника объекта, а затем масштабировать пространство кисти, чтобы базовая плитка заполняла ограничивающий прямоугольник объекта.
Дополнительные сведения о трансформациях кистей см. в Обзоре кистей Direct2D.
Преобразования геометрии
При масштабировании, перемещении, сдвиге или наклоне геометрии можно напрямую применять преобразование к определенной геометрии, а не к преобразованию целевого объекта визуализации, которое будет воздействовать на весь экран. Преобразование целевого объекта отрисовки обычно влияет на штрих и заливку геометрии. В отличие от этого, преобразование геометрии влияет только на заливку геометрии, так как преобразование применяется к геометрии перед ее обводкой.
Заметка
Начиная с Windows 8, преобразование мира не влияет на штрих, если вы установите тип штриха D2D1_STROKE_TRANSFORM_TYPE_FIXED или D2D1_STROKE_TRANSFORM_TYPE_HAIRLINE.
Вы можете настроить преобразование в геометрии, вызвав ID2D1Factory::CreateTransformedGeometry для создания объекта ID2D1TransformedGeometry. Дополнительные сведения о преобразованиях геометрии см. в обзоре геометрий Direct2D.
Как преобразование целевого объекта отрисовки влияет на клипы
Преобразование на целевой поверхности рендеринга влияет на то, как вычисляется ограничивающая рамка осе-ориентированного клипа. При вызове PushAxisAlignedClip параметр clipRect преобразуется текущим преобразованием мира, установленным в целевом объекте отрисовки. После применения преобразования к clipRectвычисляется ограничивающая рамка, выровненная по осям, для clipRect. Для повышения эффективности содержимое обрезается в этот выровненный по осям ограничивающий прямоугольник, а не в исходный clipRect, который передаётся. На следующих схемах показано, как преобразование поворота применяется к целевому объекту отрисовки, получающийся clipRectи вычисляемая ограничивающая рамка по осям.
Предположим, что прямоугольник на следующем рисунке является целевым объектом отрисовки, выровненным по пикселям экрана.
Примените преобразование поворота к целевому объекту отрисовки. На следующем рисунке черный прямоугольник представляет исходную цель отрисовки, а красный тиреный прямоугольник представляет преобразованный целевой объект отрисовки.
После вызова PushAxisAlignedClip преобразование поворота применяется к clipRect. На следующем рисунке синий прямоугольник представляет преобразованный clipRect.
Вычисляется выровненное по оси ограничивающее поле. На следующем рисунке зеленый пунктирный прямоугольник обозначает ограничивающую рамку. Все содержимое обрезается по этому ограничивающему по осям прямоугольнику.
Сводка
Direct2D упрощает преобразование двухмерных объектов с упрощенными пространствами координат и связанными классами. Используя различные типы преобразований, вы можете переводить, поворачивать, чередовать и масштабировать объекты, чтобы добиться большого количества впечатляющих визуальных эффектов.
Связанные разделы
-
Справочник по Direct2D