Compartilhar via


Visão geral de transformações

Este tópico discute os conceitos básicos de transformações Direct2D e inclui exemplos de várias transformações. Ele contém as seguintes partes:

O que é uma transformação Direct2D?

Uma transformação especifica como mapear os pontos de um objeto de um espaço de coordenadas para outro ou de uma posição para outra dentro do mesmo espaço de coordenadas. Esse mapeamento é descrito por uma matriz de transformação, definida como uma coleção de três linhas com três colunas de valores FLOAT, conforme mostrado na tabela a seguir.

     
M11Default: 1.0 M12Default: 0.0 0.0
M21Default: 0.0 M22Default: 1.0 0.0
M31OffsetX: 0.0 M32OffsetY: 0.0 1,0

 

Nessa matriz, os membros M11, M12, M21 e M22 definem uma transformação linear que pode dimensionar, girar ou distorcer um objeto; Os membros OffsetX e OffsetY definem a tradução a ser aplicada após a transformação linear ter sido feita. Para transformações afim, os valores na terceira coluna são sempre 0,0, 0,0 e 1,0.

Como Direct2D dá suporte apenas a transformações afim (lineares), sua matriz de transformação é definida como uma matriz de 3 por 2, omitindo a terceira coluna da matriz de transformação anterior. A tabela a seguir mostra o layout da matriz de transformação Direct2D.

   
M11Default: 1.0 M12Default: 0.0
M21Default: 0.0 M22Default: 1.0
M31OffsetX: 0.0 M32OffsetY: 0.0

 

Em Direct2D, essa matriz de 3 por 2 é representada pela estrutura D2D1_MATRIX_3X2. Para simplificar as operações comuns de matriz, Direct2D também fornece uma classe chamada Matrix3x2F, que é derivada da estrutura D2D1_MATRIX_3X2.

O construtor padrão para Matrix3x2F deixa o objeto não inicializado. Para recuperar uma matriz de identidade, use Matrix3x2F::Identity.

Quando uma transformação de identidade é aplicada a um objeto , ela não altera a posição, a forma ou o tamanho do objeto. É semelhante à maneira como multiplicar um número por 1 não altera o número. Em outras palavras, a transformação de identidade deixa as coordenadas dos pontos sozinhas e não desloca os pontos para uma nova posição. Qualquer transformação diferente da transformação de identidade modificará a posição, a forma e/ou o tamanho dos objetos.

As transformações são todas sobre coordenadas, e entender o Direct2D espaço de coordenadas é importante para entender o uso de transformações.

O espaço de coordenadas do Direct2D

Direct2D usa um espaço de coordenadas à esquerda; ou seja, os valores positivos do eixo x aumentam para a direita e os valores positivos do eixo y aumentam para baixo. Tudo na tela é posicionado em relação à origem, que é o ponto em que o eixo x e o eixo y se cruzam (0, 0), conforme mostrado na ilustração a seguir. Direct2D destinos de renderização usam esse espaço de coordenadas.

ilustração do eixo x e do eixo y de um espaço de coordenadas à esquerda

Ao manipular valores em uma matriz de transformação, você pode girar, dimensionar, distorcer e mover (traduzir) um objeto. Por exemplo, se você definir OffsetX como 100 e OffsetY como 200, mova o objeto para a direita 100 pixels e reduza 200 pixels.

Para mostrar o efeito da movimentação do objeto, você precisa aplicar a transformação de tradução para renderizar destinos, pincéis ou geometrias. A aplicação de uma transformação para renderizar destinos afeta toda a tela, enquanto aplicar uma transformação a um pincel ou a uma geometria afeta apenas esse pincel ou geometria específico. Para criar uma matriz de transformação, use a classe Matrix3x2F .

Criando matrizes de transformação

Para criar transformações de rotação, escala, distorção e tradução, a classe Matrix3x2F fornece os métodos estáticos mostrados na tabela a seguir. A coluna Exemplo da tabela contém links para os tópicos de instruções que demonstram como usar cada método de transformação.

Método Descrição Exemplo Ilustração
matrix3x2f::rotate cria uma transformação de rotação que tem o ângulo e o ponto central especificados. como girar um objeto ilustração de um quadrado girado 45 graus no sentido horário sobre o centro do quadrado original
matrix3x2f::scale cria uma transformação de escala que tem os fatores de escala e o ponto central especificados. como dimensionar um objeto ilustração de uma escala quadrada de 130%
matrix3x2f::skew cria uma transformação de distorção que tem os valores do eixo x e do eixo y e o ponto central especificados. como distorcer um objeto ilustração de um quadrado distorcido 30 graus no sentido anti-horário do eixo y
matrix3x2f::translation cria uma transformação de tradução e especifica os deslocamentos na direção do eixo x e do eixo y. como traduzir um objeto ilustração de um quadrado movido 20 unidades ao longo do eixo x positivo e 10 unidades ao longo do eixo y positivo

 

Transformações de destino de renderização

Um destino de renderização é um recurso que herda da interface ID2D1RenderTarget . Ele cria recursos para desenhar e executa operações de desenho reais. Ele também fornece métodos para transformar o espaço de coordenadas. Você pode chamar o método ID2D1RenderTarget::SetTransform para aplicar a transformação especificada ao destino de renderização. Todas as operações de desenho subsequentes ocorrem no espaço transformado.

Para renderizar o conteúdo, use os métodos de desenho do destino de renderização. Antes de começar a desenhar, chame o método BeginDraw . Para concluir a renderização do conteúdo, chame o método EndDraw . Para obter um exemplo, consulte Como aplicar várias transformações a um objeto .

Transformações de pincel

Você pode ajustar a transformação no pincel chamando SetTransform. Para essa transformação, você pode pensar no pincel como um grande pedaço de papel e dos diferentes primitivos de renderização (texto, geometria, retângulo e assim por diante) como estênceis. Quando você ajusta a transformação do pincel, é como se você estivesse deslizando o grande pedaço de papel sob o estêncil, sem alterar a posição do estêncil em si. Você pode usar essa técnica para fazer o texto desaparecer de amarelo para preto em espaço 3D.

Quando a transformação do pincel é a transformação de identidade, os pincéis aparecem no mesmo espaço de coordenadas que o destino de renderização no qual são desenhados. A transformação de pincel permite que um chamador altere como as coordenadas de pincel são mapeadas para esse espaço.

O espaço de pincel é especificado de forma diferente em Direct2D do que no WPF (Windows Presentation Foundation). Em Direct2D, o espaço de pincel não é relativo ao objeto que está sendo desenhado, mas sim ao sistema de coordenadas atual do destino de renderização, transformado pela transformação de pincel, se houver um. Para que o pincel preencha um objeto como foi feito no WPF, você deve traduzir a origem do espaço de pincel para o canto superior esquerdo da caixa delimitadora do objeto e, em seguida, dimensionar o espaço de pincel para que o bloco base preencha a caixa delimitadora do objeto.

Para obter mais informações sobre transformações de pincel, consulte Visão geral Direct2D Pincéis.

Transformações de geometria

Ao dimensionar, mover, traduzir ou distorcer geometrias, você pode aplicar diretamente uma transformação a uma geometria específica, não a uma transformação de destino de renderização que afetaria toda a tela. Uma transformação de destino de renderização geralmente afeta o traço e o preenchimento de uma geometria. Por outro lado, uma transformação de geometria afeta apenas o preenchimento de uma geometria, pois a transformação é aplicada a uma geometria antes de ser traçada.

Observação

Começando com Windows 8, a transformação do mundo não afetará o traço se você definir o tipo de traço como D2D1_STROKE_TRANSFORM_TYPE_FIXED ou D2D1_STROKE_TRANSFORM_TYPE_HAIRLINE.

 

Você pode ajustar a transformação em uma geometria chamando ID2D1Factory::CreateTransformedGeometry para criar um objeto ID2D1TransformedGeometry . Para obter mais informações sobre transformações de geometria, consulte Visão geral Direct2D Geometrias.

Como uma transformação de destino de renderização afeta clipes

A transformação em um destino de renderização afeta como a caixa delimitadora de um clipe alinhado ao eixo é computada. Quando PushAxisAlignedClip é chamado, o parâmetro clipRect é transformado pela transformação do mundo atual definida no destino de renderização. Depois que a transformação é aplicada ao clipRect, a caixa delimitadora alinhada ao eixo do clipRect é computada. Para eficiência, o conteúdo é recortado para essa caixa delimitadora alinhada ao eixo e não para o clipRect original que é passado. Os diagramas a seguir mostram como uma transformação de rotação é aplicada ao destino de renderização, ao clipRect resultante e a uma caixa delimitadora alinhada ao eixo calculado.

  1. Suponha que o retângulo na ilustração a seguir seja um destino de renderização alinhado aos pixels de tela.

    ilustração de um retângulo (destino de renderização)

  2. Aplique uma transformação de rotação ao destino de renderização. Na ilustração a seguir, o retângulo preto representa o destino de renderização original e o retângulo vermelho tracejado representa o destino de renderização transformado.

    ilustração do retângulo original e um retângulo girado (destino de renderização transformado)

  3. Depois que PushAxisAlignedClip for chamado, a transformação de rotação será aplicada ao clipRect. Na ilustração a seguir, o retângulo azul representa o clipRect transformado.

    ilustração de um retângulo azul menor (cliprect) dentro do retângulo girado (destino de renderização transformado)

  4. A caixa delimitadora alinhada ao eixo é calculada. Na ilustração a seguir, o retângulo verde tracejado representa a caixa delimitadora. Todo o conteúdo é recortado nessa caixa delimitadora alinhada ao eixo.

    ilustração de uma caixa delimitadora verde no pequeno retângulo azul (cliprect)

Resumo

Direct2D facilita a transformação de objetos bidimensionais com espaços de coordenadas simplificados e classes relacionadas. Usando vários tipos de transformações, você pode traduzir, girar, distorcer e dimensionar seus objetos para obter muitos efeitos visuais impressionantes.

Referência de Direct2D