Matrix3D Estructura

Definición

Representa una matriz de 4 × 4 que se usa para transformaciones en un espacio 3D. Se usa como valor para Matrix3DProjection.ProjectionMatrix.

public value class Matrix3D
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
struct Matrix3D
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 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>
Herencia
Matrix3D
Atributos

Requisitos de Windows

Familia de dispositivos
Windows 10 (se introdujo en la versión 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (se introdujo en la versión v1.0)

Ejemplos

En este ejemplo se usa una matriz Matrix3D sencilla para transformar la imagen en las direcciones X e Y al hacer clic en la imagen.

<!-- 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;
}

Comentarios

Puede usar los tipos Matrix3DProjection y Matrix3D para escenarios semi-3D más complejos de los que son posibles con el tipo PlaneProjection . Matrix3DProjection proporciona una matriz de transformación 3D completa que se aplicará a cualquier UIElement (se usa como un valor para la propiedad UIElement.Projection ). La matriz permite aplicar matrices de transformación de modelos arbitrarios y matrices de perspectiva a elementos visuales.

Matrix3D tiene esta sintaxis de vector de fila:

M11M12M13M14
M21M22M23M24
M31M32M33M34
OffsetXOffsetYOffsetZM44

Dado que la cuarta columna es accesible, Matrix3D puede representar transformaciones affine y no affine.

Sintaxis XAML para Matrix3D

Los valores matrix3D se pueden declarar en XAML, pero la sintaxis es limitada y diferente de lo que podría esperar en función de cómo otras estructuras de Windows Runtime (como Grosor) admiten valores para la interfaz de usuario XAML:+ El uso más típico para las propiedades de tipo Matrix3D es confiar en el comportamiento de la cadena de inicialización integrado en el tipo Matrix3D y establecer cualquier valor que use un valor Matrix3D como atributo. Especifique una cadena en el formato de "texto de inicialización" para construir un valor Matrix3D: 16 valores Dobles independientes separados por comas o espacio. Puedes ver este formato usado en xaml en "Ejemplos" a continuación.

  • Solo hay una propiedad existente que usa un valor Matrix3D: Matrix3DProjection.ProjectionMatrix. Así que eso es lo que se muestra como la sintaxis XAML principal aquí.
  • La sintaxis XAML secundaria que se muestra tiene un elemento de objeto Matrix3D real. Pero tenga en cuenta que tiene un prefijo de espacio de nombres XAML. El espacio de nombres Windows.UI.Xaml.Media.Media3D no se incluyó en el conjunto de espacios de nombres de código que usa el analizador XAML de Windows Runtime para el espacio de nombres XAML predeterminado. Para usar Matrix3D como elemento en XAML, debes incluir una declaración xmlns en tu XAML que haga referencia a Windows.UI.Xaml.Media.Media3D mediante una instrucción ** using:**. A continuación, califica matrix3D con el prefijo xmlns asignado para los tipos de Windows.UI.Xaml.Media.Media3D.
  • Incluso una vez que haces esta asignación, el elemento de objeto Matrix3D no puede tener valores de atributo para establecer las 16 propiedades, no está habilitado por el analizador XAML (otras estructuras XAML tienen control de mayúsculas y minúsculas especiales para la sintaxis de propiedades como atributo; Matrix3D no tiene esto). Todavía tiene que usar el texto de inicialización que establece los 16 valores como átomos consecutivos de una cadena. En este caso, la cadena está contenida como el "texto interno" / contenido del elemento de objeto Matrix3D.
  • Como puede ver, la sintaxis del elemento de objeto no es más fácil de leer o usar que la sintaxis de atributo insertado para Matrix3DProjection.ProjectionMatrix, por lo que la sintaxis detallada del elemento de objeto Matrix3D no es común.

Proyección y miembros de Matrix3D

Si usa un lenguaje .NET de Microsoft (C# o Microsoft Visual Basic) o en extensiones de componentes de Visual C++ (C++/CX), Matrix3D tiene miembros que no son de datos disponibles y sus miembros de datos se exponen como propiedades de lectura y escritura, no campos.

Si va a programar con C++ con la biblioteca de plantillas de Windows Runtime (WRL), solo existen los campos de miembro de datos como miembros de Matrix3D y no puede usar los métodos o propiedades de la utilidad enumerados en la tabla de miembros. El código WRL puede tener acceso a métodos de utilidad similares que existen en la clase Matrix3DHelper .

No puedes establecer propiedades de Matrix3D en XAML con atributos XAML individuales. Debe inicializar un elemento de objeto Matrix3D mediante una cadena de inicialización que especifique todos los 16 valores o usar la sintaxis de atributo para Matrix3DProjection.ProjectionMatrix que usa este mismo formato de cadena.

Campos

M11

El valor de la primera fila y la primera columna de esta matriz3D.

M12

Valor de la primera fila y la segunda columna de esta matrix3D.

M13

Valor de la primera fila y la tercera columna de esta matriz3D.

M14

Valor de la primera fila y cuarta columna de esta matriz3D.

M21

El valor de la segunda fila y la primera columna de esta matriz3D.

M22

Valor de la segunda fila y segunda columna de esta matriz3D.

M23

Valor de la segunda fila y tercera columna de esta matrix3D.

M24

Valor de la segunda fila y cuarta columna de esta matriz3D.

M31

Valor de la tercera fila y la primera columna de esta matrix3D.

M32

Valor de la tercera fila y segunda columna de esta matrix3D.

M33

Valor de la tercera fila y tercera columna de esta matrix3D.

M34

Valor de la tercera fila y cuarta columna de esta matrix3D.

M44

Valor de la cuarta fila y cuarta columna de esta matriz3D.

OffsetX

El valor de la cuarta fila y la primera columna de esta matriz3D.

OffsetY

Valor de la cuarta fila y segunda columna de esta matrix3D.

OffsetZ

Valor de la cuarta fila y tercera columna de esta matriz3D.

Se aplica a

Consulte también