Freigeben über


Matrix3D Struktur

Definition

Stellt eine 4 × 4-Matrix dar, die für Transformationen in einem 3D-Raum verwendet wird. Wird als Wert für Matrix3DProjection.ProjectionMatrix verwendet.

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>
Vererbung
Matrix3D
Attribute

Windows-Anforderungen

Gerätefamilie
Windows 10 (eingeführt in 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (eingeführt in v1.0)

Beispiele

In diesem Beispiel wird eine einfache Matrix3D-Matrix verwendet, um das Bild in die X- und Y-Richtung zu transformieren, wenn Sie auf das Bild klicken.

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

Hinweise

Sie können die Matrix3DProjection - und Matrix3D-Typen für komplexere Semi-3D-Szenarien als mit dem PlaneProjection-Typ verwenden. Matrix3DProjection stellt eine vollständige 3D-Transformationsmatrix bereit, die auf ein beliebiges UIElement angewendet werden kann (Sie verwenden dies als Wert für die UIElement.Projection-Eigenschaft ). Mit der Matrix können Sie beliebige Modelltransformationsmatrizen und Perspektivmatrizen auf visuelle Elemente anwenden.

Matrix3D verfügt über die folgende Zeilenvektorsyntax:

M11M12M13M14
M21M22M23M24
M31M32M33M34
OffsetXOffsetYOffsetZM44

Da auf die vierte Spalte zugegriffen werden kann, kann Matrix3D sowohl affine als auch nicht affine Transformationen darstellen.

XAML-Syntax für Matrix3D

Matrix3D-Werte können in XAML deklariert werden, aber die Syntax ist begrenzt und unterscheidet sich davon, wie andere Windows-Runtime-Strukturen (z. B. Thickness) Werte für XAML UI unterstützen:+ Die typischste Verwendung für Matrix3D-Typeigenschaften besteht darin, sich auf das Initialisierungszeichenfolgenverhalten zu verlassen, das in den Matrix3D-Typ integriert ist, und jeden Wert festzulegen, der einen Matrix3D-Wert als Attribut verwendet. Sie geben eine Zeichenfolge im Format "Initialisierungstext" zum Erstellen eines Matrix3D-Werts an: 16 separate Double-Werte , die jeweils durch Kommas oder Leerzeichen getrennt sind. Dieses format, das im XAML verwendet wird, sehen Sie unten unter "Beispiele".

  • Es gibt nur eine vorhandene Eigenschaft, die einen Matrix3D-Wert verwendet: Matrix3DProjection.ProjectionMatrix. Daher wird dies hier als primäre XAML-Syntax angezeigt.
  • Die gezeigte sekundäre XAML-Syntax weist ein tatsächliches Matrix3D-Objektelement auf. Beachten Sie jedoch, dass es über ein XAML-Namespacepräfix verfügt. Der Windows.UI.Xaml.Media.Media3D-Namespace war nicht in den Codenamespaces enthalten, den der Windows-Runtime XAML-Parser für den XAML-Standardnamespace verwendet. Um Matrix3D als Element in XAML zu verwenden, müssen Sie eine xmlns-Deklaration in Ihren XAML-Code einschließen, die mit einer ** using:**-Anweisung auf Windows.UI.Xaml.Media.Media3D verweist. Qualifizieren Sie dann Matrix3D mit dem Präfix xmlns , das Sie den Typen in Windows.UI.Xaml.Media.Media3D zugeordnet haben.
  • Selbst wenn Sie diese Zuordnung durchgeführt haben, kann das Matrix3D-Objektelement keine Attributwerte zum Festlegen der 16 Eigenschaften haben, es ist nicht durch den XAML-Parser aktiviert (andere XAML-Strukturen verfügen über eine spezielle Behandlung für eigenschaften-as-Attribut-Syntax; Matrix3D hat dies nicht). Sie müssen weiterhin den Initialisierungstext verwenden, der die 16 Werte als aufeinanderfolgende Atome einer Zeichenfolge festlegt. In diesem Fall ist die Zeichenfolge als "innerer Text" / Inhalt des Matrix3D-Objektelements enthalten.
  • Wie Sie sehen, ist die Objektelementsyntax nicht einfacher zu lesen oder zu verwenden als die Inline-Attributsyntax für Matrix3DProjection.ProjectionMatrix, sodass die Syntax des ausführlichen Matrix3D-Objektelements nicht üblich ist.

Projektion und Elemente von Matrix3D

Wenn Sie eine Microsoft .NET-Sprache (C# oder Microsoft Visual Basic) oder in Visual C++-Komponentenerweiterungen (C++/CX) verwenden, stehen in Matrix3D Nicht-Datenelemente zur Verfügung, und die Datenmember werden als Lese-/Schreibeigenschaften und nicht als Felder verfügbar gemacht.

Wenn Sie mit C++ mit der Windows-Runtime Template Library (WRL) programmieren, sind nur die Datenmemberfelder als Member von Matrix3D vorhanden, und Sie können die in der Membertabelle aufgeführten Hilfsprogrammmethoden oder -eigenschaften nicht verwenden. WRL-Code kann auf ähnliche Hilfsprogrammmethoden zugreifen, die für die Matrix3DHelper-Klasse vorhanden sind.

Sie können die Eigenschaften von Matrix3D in XAML nicht mit einzelnen XAML-Attributen festlegen. Sie müssen ein Matrix3D-Objektelement mithilfe einer Initialisierungszeichenfolge initialisieren, die alle 16 Werte angibt, oder die Attributsyntax für Matrix3DProjection.ProjectionMatrix verwenden, die dasselbe Zeichenfolgenformat verwendet.

Felder

M11

Der Wert der ersten Zeile und ersten Spalte dieses Matrix3D-Werts.

M12

The value of the first row and second column of this Matrix3D.

M13

The value of the first row and third column of this Matrix3D.

M14

The value of the first row and fourth column of this Matrix3D.

M21

Der Wert der zweiten Zeile und der ersten Spalte dieses Matrix3D-Werts.

M22

The value of the second row and second column of this Matrix3D.

M23

The value of the second row and third column of this Matrix3D.

M24

The value of the second row and fourth column of this Matrix3D.

M31

Der Wert der dritten Zeile und der ersten Spalte dieser Matrix3D.

M32

The value of the third row and second column of this Matrix3D.

M33

The value of the third row and third column of this Matrix3D.

M34

The value of the third row and fourth column of this Matrix3D.

M44

The value of the fourth row and fourth column of this Matrix3D.

OffsetX

The value of the fourth row and first column of this Matrix3D.

OffsetY

The value of the fourth row and second column of this Matrix3D.

OffsetZ

The value of the fourth row and third column of this Matrix3D.

Gilt für:

Weitere Informationen