Matrix3D Struktur
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt eine 4 × 4-Matrix dar, die für Transformationen in einem 3D-Leerzeichen verwendet wird. Wird als Wert für Matrix3DProjection.ProjectionMatrix verwendet.
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>
- Vererbung
-
Matrix3D
- Attribute
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 verwenden, als mit dem PlaneProjection-Typ möglich sind. 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 perspektivische Matrizen auf visuelle Elemente anwenden.
Matrix3D weist diese Zeilenvektorsyntax auf:
| M11 | M12 | M13 | M14 |
| M21 | M22 | M23 | M24 |
| M31 | M32 | M33 | M34 |
| OffsetX | OffsetY | OffsetZ | M44 |
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 von dem, was Sie erwarten können, basierend auf der Art und Weise, wie andere Windows-Runtime Strukturen (z. B. Thickness) Werte für XAML-UI unterstützen:+ Die typischste Verwendung für Matrix3D-Typeigenschaften besteht darin, auf das Initialisierungszeichenfolgenverhalten zu basieren, 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 jeweils durch Komma oder Leerzeichen getrennt. Dieses Format wird im XAML-Code unten in "Beispiele" verwendet.
- Es gibt nur eine vorhandene Eigenschaft, die einen Matrix3D-Wert verwendet: Matrix3DProjection.ProjectionMatrix. Das ist also die hier gezeigte primäre XAML-Syntax.
- Die dargestellte sekundäre XAML-Syntax weist ein tatsächliches Matrix3D-Objektelement auf. Beachten Sie jedoch, dass es über ein XAML-Namespacepräfix verfügt. Die Windows. BENUTZEROBERFLÄCHE. Der Xaml.Media.Media3D-Namespace wurde nicht in den Codenamespaces enthalten, die der Windows-Runtime XAML-Parser für den standardmäßigen XAML-Namespace verwendet. Um die Matrix3D als Element in XAML zu verwenden, müssen Sie eine XMLns-Deklaration in Ihren XAML-Code einschließen, die auf Windows verweist. BENUTZEROBERFLÄCHE. Xaml.Media.Media3D durch eine ** using:** -Anweisung. Qualifizieren Sie dann die Matrix3D mit dem xmlns-Präfix, das Sie für die Typen in Windows zugeordnet haben. BENUTZEROBERFLÄCHE. Xaml.Media.Media3D.
- Selbst wenn Sie diese Zuordnung ausführen, kann das Matrix3D-Objektelement keine Attributwerte zum Festlegen der 16 Eigenschaften aufweisen, es ist nicht vom XAML-Parser aktiviert (andere XAML-Strukturen weisen spezielle Behandlung für eigenschaften-as-Attribut-Syntax auf; Matrix3D hat dies nicht). Sie müssen weiterhin den Initialisierungstext verwenden, der die 16 Werte als aufeinander folgende Atome einer Zeichenfolge festlegt. In diesem Fall ist die Zeichenfolge als "innerer Text" / Inhalt des Matrix3D-Objektelements enthalten.
- Wie Sie sehen können, ist die Objektelementsyntax nicht einfacher zu lesen oder zu verwenden als die Inline-Attributsyntax für Matrix3DProjection.ProjectionMatrix, sodass die ausführliche Matrix3D-Objektelementsyntax nicht üblich ist.
Projektion und Elemente von Matrix3D
Wenn Sie eine Microsoft .NET Sprache (C#) verwenden, steht Matrix3D nicht-Datenmember zur Verfügung, und die Datenmember werden als Eigenschaften mit Lese-/Schreibzugriff verfügbar gemacht, nicht als Felder.
Wenn Sie mit C++ mit der Windows-Runtime Template Library (WRL) programmieren, sind nur die Datenmemberfelder als Elemente von Matrix3D vorhanden, und Sie können die in der Membertabelle aufgeführten Hilfsmethoden oder -eigenschaften nicht verwenden. WRL-Code kann auf ähnliche Hilfsmethoden zugreifen, die in der Matrix3DHelper-Klasse vorhanden sind.
Sie können keine Eigenschaften von Matrix3D in XAML 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
| Name | Beschreibung |
|---|---|
| M11 |
Der Wert der ersten Zeile und der ersten Spalte dieser Matrix3D. |
| M12 |
Der Wert der ersten Zeile und der zweiten Spalte dieser Matrix3D. |
| M13 |
Der Wert der ersten Zeile und der dritten Spalte dieser Matrix3D. |
| M14 |
Der Wert der ersten Zeile und vierten Spalte dieser Matrix3D. |
| M21 |
Der Wert der zweiten Zeile und der ersten Spalte dieser Matrix3D. |
| M22 |
Der Wert der zweiten Zeile und der zweiten Spalte dieser Matrix3D. |
| M23 |
Der Wert der zweiten Zeile und der dritten Spalte dieser Matrix3D. |
| M24 |
Der Wert der zweiten Zeile und vierten Spalte dieser Matrix3D. |
| M31 |
Der Wert der dritten Zeile und der ersten Spalte dieser Matrix3D. |
| M32 |
Der Wert der dritten Zeile und der zweiten Spalte dieser Matrix3D. |
| M33 |
Der Wert der dritten Zeile und der dritten Spalte dieser Matrix3D. |
| M34 |
Der Wert der dritten Zeile und vierten Spalte dieser Matrix3D. |
| M44 |
Der Wert der vierten Zeile und vierten Spalte dieser Matrix3D. |
| OffsetX |
Der Wert der vierten Zeile und der ersten Spalte dieser Matrix3D. |
| OffsetY |
Der Wert der vierten Zeile und der zweiten Spalte dieser Matrix3D. |
| OffsetZ |
Der Wert der vierten Zeile und der dritten Spalte dieser Matrix3D. |