Partage via


Matrix3D Structure

Définition

Représente une matrice 4 × 4 utilisée pour les transformations dans un espace 3D. Utilisé comme valeur pour 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>
Héritage
Matrix3D
Attributs

Configuration requise pour Windows

Famille d’appareils
Windows 10 (introduit dans 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (introduit dans v1.0)

Exemples

Cet exemple utilise une matrice Matrix3D simple pour transformer l’image dans les directions X et Y lorsque vous cliquez sur l’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)
{
    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;
}

Remarques

Vous pouvez utiliser les types Matrix3DProjection et Matrix3D pour des scénarios semi-3D plus complexes que ce qui est possible avec le type PlaneProjection . Matrix3DProjection fournit une matrice de transformation 3D complète à appliquer à n’importe quel élément UIElement (vous l’utilisez comme valeur pour la propriété UIElement.Projection ). La matrice vous permet d’appliquer des matrices de transformation de modèle arbitraires et des matrices de perspective à des éléments visuels.

Matrix3D a cette syntaxe de vecteur de ligne :

M11M12M13M14
M21M22M23M24
M31M32M33M34
OffsetXOffsetYOffsetZM44

Étant donné que la quatrième colonne est accessible, Matrix3D peut représenter des transformations affine et non affine.

Syntaxe XAML pour Matrix3D

Les valeurs Matrix3D peuvent être déclarées en XAML, mais la syntaxe est limitée et différente de ce que vous pouvez attendre en fonction de la façon dont d’autres structures Windows Runtime (telles que l’épaisseur) prennent en charge les valeurs pour l’interface utilisateur XAML :+ L’utilisation la plus classique pour les propriétés de type Matrix3D consiste à s’appuyer sur le comportement de chaîne d’initialisation intégré au type Matrix3D et à définir toute valeur qui utilise une valeur Matrix3D en tant qu’attribut. Vous spécifiez une chaîne au format « texte d’initialisation » pour la construction d’une valeur Matrix3D : 16 valeurs double distinctes séparées chacune par une virgule ou un espace. Vous pouvez voir ce format utilisé dans le CODE XAML dans « Exemples » ci-dessous.

  • Une seule propriété existante utilise une valeur Matrix3D : Matrix3DProjection.ProjectionMatrix. Il s’agit donc de ce qui est affiché comme syntaxe XAML principale ici.
  • La syntaxe XAML secondaire indiquée a un élément objet Matrix3D réel. Notez toutefois qu’il a un préfixe d’espace de noms XAML. L’espace de noms Windows.UI.Xaml.Media.Media3D n’a pas été inclus dans l’ensemble d’espaces de noms de code que l’analyseur XAML Windows Runtime utilise pour l’espace de noms XAML par défaut. Pour utiliser Matrix3D en tant qu’élément dans XAML, vous devez inclure une déclaration xmlns dans votre code XAML qui fait référence à Windows.UI.Xaml.Media.Media3D par une instruction ** using:**. Ensuite, qualifiez matrix3D avec le préfixe xmlns que vous avez mappé pour les types dans Windows.UI.Xaml.Media.Media3D.
  • Même une fois que vous avez fait ce mappage, l’élément objet Matrix3D ne peut pas avoir de valeurs d’attribut pour définir les 16 propriétés, il n’est pas activé par l’analyseur XAML (d’autres structures XAML ont une gestion des cas spéciaux pour la syntaxe properties-as-attribute ; Matrix3D n’a pas ceci). Vous devez toujours utiliser le texte d’initialisation qui définit les 16 valeurs comme des atomes consécutifs d’une chaîne. Dans ce cas, la chaîne est contenue en tant que « texte interne » / contenu de l’élément objet Matrix3D.
  • Comme vous pouvez le constater, la syntaxe de l’élément objet n’est pas plus facile à lire ou à utiliser que la syntaxe d’attribut inline pour Matrix3DProjection.ProjectionMatrix. La syntaxe détaillée de l’élément objet Matrix3D n’est donc pas courante.

Projection et membres de Matrix3D

Si vous utilisez un langage Microsoft .NET (C# ou Microsoft Visual Basic) ou dans des extensions de composants Visual C++ (C++/CX), Matrix3D dispose de membres autres que les données, et ses membres de données sont exposés en tant que propriétés en lecture-écriture, et non en tant que champs.

Si vous programmez avec C++ à l’aide de la bibliothèque de modèles Windows Runtime (WRL), seuls les champs membres de données existent en tant que membres de Matrix3D, et vous ne pouvez pas utiliser les méthodes ou propriétés d’utilitaire répertoriées dans la table members. Le code WRL peut accéder à des méthodes d’utilitaire similaires qui existent sur la classe Matrix3DHelper .

Vous ne pouvez pas définir les propriétés de Matrix3D en XAML avec des attributs XAML individuels. Vous devez initialiser un élément objet Matrix3D à l’aide d’une chaîne d’initialisation qui spécifie les 16 valeurs, ou utiliser la syntaxe d’attribut pour Matrix3DProjection.ProjectionMatrix qui utilise ce même format de chaîne.

Champs

M11

Valeur de la première ligne et de la première colonne de ce Matrix3D.

M12

Valeur de la première ligne et de la deuxième colonne de ce Matrix3D.

M13

Valeur de la première ligne et de la troisième colonne de ce Matrix3D.

M14

Valeur de la première ligne et de la quatrième colonne de ce Matrix3D.

M21

Valeur de la deuxième ligne et de la première colonne de ce Matrix3D.

M22

Valeur de la deuxième ligne et de la deuxième colonne de ce Matrix3D.

M23

Valeur de la deuxième ligne et de la troisième colonne de ce Matrix3D.

M24

Valeur de la deuxième ligne et de la quatrième colonne de ce Matrix3D.

M31

Valeur de la troisième ligne et de la première colonne de ce Matrix3D.

M32

Valeur de la troisième ligne et de la deuxième colonne de ce Matrix3D.

M33

Valeur de la troisième ligne et de la troisième colonne de ce Matrix3D.

M34

Valeur de la troisième ligne et de la quatrième colonne de ce Matrix3D.

M44

Valeur de la quatrième ligne et de la quatrième colonne de ce Matrix3D.

OffsetX

Valeur de la quatrième ligne et de la première colonne de ce Matrix3D.

OffsetY

Valeur de la quatrième ligne et de la deuxième colonne de ce Matrix3D.

OffsetZ

Valeur de la quatrième ligne et de la troisième colonne de ce Matrix3D.

S’applique à

Voir aussi