Partilhar via


Matrix3D Estrutura

Definição

Representa uma matriz 4 × 4 usada para transformações em um espaço 3D. Usado como um valor para Matrix3DProjection.ProjectionMatrix.

public value class Matrix3D
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
struct Matrix3D
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
public struct Matrix3D
Public Structure Matrix3D
<Matrix3DProjection ProjectionMatrix="m11, m12, m13, m14, 
  m21, m22, m23, m24, m31, m32, m33, m34, offsetX, offsetY, offsetZ, m44" />
- or -
<!--xmlns:m3d="using:Windows.UI.Xaml.Media.Media3D"-->
<m3d:Matrix3D>
m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, offsetX, offsetY, offsetZ, m44
</m3d:Matrix3D>
Herança
Matrix3D
Atributos

Exemplos

Este exemplo usa uma matriz Matrix3D simples para transformar a imagem nas direções X e Y quando você clica na imagem.

<!-- When you click on the image, the projection is applied. -->
<Image PointerPressed="ApplyProjection" x:Name="BeachImage" Source="guy_by_the_beach.jpg"
       Width="200"/>
private void ApplyProjection(Object sender, PointerRoutedEventArgs e)
{
    Matrix3D m = new Matrix3D();

    // This matrix simply translates the image 100 pixels
    // down and 100 pixels right.
    m.M11 = 1.0; m.M12 = 0.0; m.M13 = 0.0; m.M14 = 0.0;
    m.M21 = 0.0; m.M22 = 1.0; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = 0.0; m.M32 = 0.0; m.M33 = 1.0; m.M34 = 0.0;
    m.OffsetX = 100; m.OffsetY = 100; m.OffsetZ = 0; m.M44 = 1.0;

    Matrix3DProjection m3dProjection = new Matrix3DProjection();
    m3dProjection.ProjectionMatrix = m;

    BeachImage.Projection = m3dProjection;

}
<Image Source="guy_by_the_beach.jpg">
    <Image.Projection>
        <Matrix3DProjection  ProjectionMatrix="2, 0, 0, 0,
                                              0, 2, 0, 0,
                                              0, 0, 1, 0,
                                              100, 100, 0, 1"/>
    </Image.Projection>
</Image>
<!-- When you click on the image, the projection is applied. -->
<Image PointerPressed="ApplyProjection" x:Name="BeachImage" Source="guy_by_the_beach.jpg" 
       Width="200"/>
private void ApplyProjection(Object sender, PointerRoutedEventArgs e)
{
    // Translate the image along the negative Z-axis such that it occupies 50% of the
    // vertical field of view.
    double fovY = Math.PI / 2.0;
    double translationZ = -BeachImage.ActualHeight / Math.Tan(fovY / 2.0);
    double theta = 20.0 * Math.PI / 180.0;

    // You can create a 3D effect by creating a number of simple 
    // tranformation Matrix3D matrices and then multiply them together.
    Matrix3D centerImageAtOrigin = TranslationTransform(
             -BeachImage.ActualWidth / 2.0,
             -BeachImage.ActualHeight / 2.0, 0);
    Matrix3D invertYAxis = CreateScaleTransform(1.0, -1.0, 1.0);
    Matrix3D rotateAboutY = RotateYTransform(theta);
    Matrix3D translateAwayFromCamera = TranslationTransform(0, 0, translationZ);
    Matrix3D perspective = PerspectiveTransformFovRH(fovY,
            LayoutRoot.ActualWidth / LayoutRoot.ActualHeight,   // aspect ratio
            1.0,                                                // near plane
            1000.0);                                            // far plane
    Matrix3D viewport = ViewportTransform(LayoutRoot.ActualWidth, LayoutRoot.ActualHeight);

    Matrix3D m = Matrix3DHelper.Multiply(centerImageAtOrigin,invertYAxis);
    m = Matrix3D.Multiply(m ,rotateAboutY);
    m = Matrix3D.Multiply(m,translateAwayFromCamera);
    m = Matrix3D.Multiply(m,perspective);
    m = Matrix3D.Multiply(m,viewport);

    Matrix3DProjection m3dProjection = new Matrix3DProjection();
    m3dProjection.ProjectionMatrix = m;

    BeachImage.Projection = m3dProjection;
}

private Matrix3D TranslationTransform(double tx, double ty, double tz)
{
    Matrix3D m = new Matrix3D();

    m.M11 = 1.0; m.M12 = 0.0; m.M13 = 0.0; m.M14 = 0.0;
    m.M21 = 0.0; m.M22 = 1.0; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = 0.0; m.M32 = 0.0; m.M33 = 1.0; m.M34 = 0.0;
    m.OffsetX = tx; m.OffsetY = ty; m.OffsetZ = tz; m.M44 = 1.0;

    return m;
}

private Matrix3D CreateScaleTransform(double sx, double sy, double sz)
{
    Matrix3D m = new Matrix3D();

    m.M11 = sx; m.M12 = 0.0; m.M13 = 0.0; m.M14 = 0.0;
    m.M21 = 0.0; m.M22 = sy; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = 0.0; m.M32 = 0.0; m.M33 = sz; m.M34 = 0.0;
    m.OffsetX = 0.0; m.OffsetY = 0.0; m.OffsetZ = 0.0; m.M44 = 1.0;

    return m;
}

private Matrix3D RotateYTransform(double theta)
{
    double sin = Math.Sin(theta);
    double cos = Math.Cos(theta);

    Matrix3D m = new Matrix3D();

    m.M11 = cos; m.M12 = 0.0; m.M13 = -sin; m.M14 = 0.0;
    m.M21 = 0.0; m.M22 = 1.0; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = sin; m.M32 = 0.0; m.M33 = cos; m.M34 = 0.0;
    m.OffsetX = 0.0; m.OffsetY = 0.0; m.OffsetZ = 0.0; m.M44 = 1.0;

    return m;
}

private Matrix3D RotateZTransform(double theta)
{
    double cos = Math.Cos(theta);
    double sin = Math.Sin(theta);

    Matrix3D m = new Matrix3D();
    m.M11 = cos; m.M12 = sin; m.M13 = 0.0; m.M14 = 0.0;
    m.M21 = -sin; m.M22 = cos; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = 0.0; m.M32 = 0.0; m.M33 = 1.0; m.M34 = 0.0;
    m.OffsetX = 0.0; m.OffsetY = 0.0; m.OffsetZ = 0.0; m.M44 = 1.0;
    return m;
}

private Matrix3D PerspectiveTransformFovRH(double fieldOfViewY, double aspectRatio, double zNearPlane, double zFarPlane)
{
    double height = 1.0 / Math.Tan(fieldOfViewY / 2.0);
    double width = height / aspectRatio;
    double d = zNearPlane - zFarPlane;

    Matrix3D m = new Matrix3D();
    m.M11 = width; m.M12 = 0; m.M13 = 0; m.M14 = 0;
    m.M21 = 0; m.M22 = height; m.M23 = 0; m.M24 = 0;
    m.M31 = 0; m.M32 = 0; m.M33 = zFarPlane / d; m.M34 = -1;
    m.OffsetX = 0; m.OffsetY = 0; m.OffsetZ = zNearPlane * zFarPlane / d; m.M44 = 0;

    return m;
}

private Matrix3D ViewportTransform(double width, double height)
{
    Matrix3D m = new Matrix3D();

    m.M11 = width / 2.0; m.M12 = 0.0; m.M13 = 0.0; m.M14 = 0.0;
    m.M21 = 0.0; m.M22 = -height / 2.0; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = 0.0; m.M32 = 0.0; m.M33 = 1.0; m.M34 = 0.0;
    m.OffsetX = width / 2.0; m.OffsetY = height / 2.0; m.OffsetZ = 0.0; m.M44 = 1.0;

    return m;
}

Comentários

Você pode usar os tipos Matrix3DProjection e Matrix3D para cenários semi-3D mais complexos do que o possível com o tipo PlaneProjection . Matrix3DProjection fornece uma matriz de transformação 3D completa a ser aplicada a qualquer UIElement (você usa isso como um valor para a propriedade UIElement.Projection ). A matriz permite aplicar matrizes de transformação de modelo arbitrário e matrizes de perspectiva a elementos visuais.

Matrix3D tem essa sintaxe de vetor de linha:

M11M12M13M14
M21M22M23M24
M31M32M33M34
OffsetXOffsetYOffsetZM44

Como a quarta coluna é acessível, Matrix3D pode representar transformações affine e não affine.

Sintaxe XAML para Matrix3D

Os valores matrix3D podem ser declarados em XAML, mas a sintaxe é limitada e diferente do que você pode esperar com base em como outras estruturas de Windows Runtime (como Espessura) dão suporte a valores para interface do usuário XAML:+ O uso mais típico para propriedades do tipo Matrix3D é depender do comportamento da cadeia de caracteres de inicialização que é interno para o tipo Matrix3D e definir qualquer valor que use um valor Matrix3D como um atributo. Especifique uma cadeia de caracteres no formato "texto de inicialização" para construir um valor Matrix3D: 16 valores duplos separados por vírgula ou espaço. Você pode ver esse formato usado no XAML em "Exemplos" abaixo.

  • Há apenas uma propriedade existente que usa um valor Matrix3D: Matrix3DProjection.ProjectionMatrix. Portanto, isso é o que é mostrado como a sintaxe XAML primária aqui.
  • A sintaxe XAML secundária mostrada tem um elemento de objeto Matrix3D real. Mas observe que ele tem um prefixo de namespace XAML. O namespace Windows.UI.Xaml.Media.Media3D não foi incluído no conjunto de namespaces de código que o analisador XAML Windows Runtime usa para o namespace XAML padrão. Para usar o Matrix3D como um elemento em XAML, você precisa incluir uma declaração xmlns em seu XAML que faça referência a Windows.UI.Xaml.Media.Media3D por uma instrução ** using:**. Em seguida, qualifique o Matrix3D com o prefixo xmlns mapeado para os tipos em Windows.UI.Xaml.Media.Media3D.
  • Mesmo depois de fazer esse mapeamento, o elemento de objeto Matrix3D não pode ter valores de atributo para definir as 16 propriedades, ele não é habilitado pelo analisador XAML (outras estruturas XAML têm tratamento de maiúsculas e minúsculas especiais para sintaxe de propriedades como atributo; Matrix3D não tem isso). Você ainda precisa usar o texto de inicialização que define os 16 valores como átomos consecutivos de uma cadeia de caracteres. Nesse caso, a cadeia de caracteres está contida como o "texto interno" /conteúdo do elemento de objeto Matrix3D.
  • Como você pode ver, a sintaxe do elemento de objeto não é mais fácil de ler ou usar do que a sintaxe de atributo embutido para Matrix3DProjection.ProjectionMatrix, portanto, a sintaxe detalhada do elemento de objeto Matrix3D não é comum.

Projeção e membros de Matrix3D

Se você estiver usando uma linguagem Microsoft .NET (C# ou Microsoft Visual Basic) ou em extensões de componentes do Visual C++ (C++/CX), o Matrix3D tem membros que não são de dados disponíveis e seus membros de dados são expostos como propriedades de leitura/gravação, não campos.

Se você estiver programando com C++ usando a WRL (Biblioteca de Modelos de Windows Runtime), somente os campos de membro de dados existirão como membros do Matrix3D e você não poderá usar os métodos de utilitário ou as propriedades listadas na tabela de membros. O código WRL pode acessar métodos utilitários semelhantes que existem na classe Matrix3DHelper .

Você não pode definir propriedades de Matrix3D em XAML com atributos XAML individuais. Você precisa inicializar um elemento de objeto Matrix3D usando uma cadeia de caracteres de inicialização que especifica todos os 16 valores ou usar a sintaxe de atributo para Matrix3DProjection.ProjectionMatrix que usa esse mesmo formato de cadeia de caracteres.

Campos

M11

O valor da primeira linha e da primeira coluna deste Matrix3D.

M12

O valor da primeira linha e da segunda coluna desta Matrix3D.

M13

O valor da primeira linha e da terceira coluna deste Matrix3D.

M14

O valor da primeira linha e da quarta coluna deste Matrix3D.

M21

O valor da segunda linha e da primeira coluna deste Matrix3D.

M22

O valor da segunda linha e da segunda coluna desta Matrix3D.

M23

O valor da segunda linha e terceira coluna desta Matrix3D.

M24

O valor da segunda linha e da quarta coluna deste Matrix3D.

M31

O valor da terceira linha e da primeira coluna deste Matrix3D.

M32

O valor da terceira linha e da segunda coluna desta Matrix3D.

M33

O valor da terceira linha e terceira coluna desta Matrix3D.

M34

O valor da terceira linha e da quarta coluna desta Matrix3D.

M44

O valor da quarta linha e da quarta coluna deste Matrix3D.

OffsetX

O valor da quarta linha e da primeira coluna deste Matrix3D.

OffsetY

O valor da quarta linha e da segunda coluna desta Matrix3D.

OffsetZ

O valor da quarta linha e terceira coluna desta Matrix3D.

Aplica-se a

Confira também