Matrix3D Struct
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Rappresenta una matrice 4 × 4 utilizzata per le trasformazioni in uno spazio 3D. Usato come valore per 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>
- Ereditarietà
-
Matrix3D
- Attributi
Esempio
Questo esempio usa una semplice matrice Matrix3D per trasformare l'immagine nelle direzioni X e Y quando si fa clic sull'immagine.
<!-- 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;
}
Commenti
È possibile usare i tipi Matrix3DProjection e Matrix3D per scenari semi-3D più complessi di quanto sia possibile con il tipo PlaneProjection . Matrix3DProjection fornisce una matrice di trasformazione 3D completa da applicare a qualsiasi UIElement (questa opzione viene usata come valore per la proprietà UIElement.Projection ). La matrice consente di applicare matrici di trasformazione di modelli arbitrari e matrici prospettiche agli elementi visivi.
Matrix3D ha questa sintassi del vettore di riga:
| M11 | M12 | M13 | M14 |
| M21 | M22 | M23 | M24 |
| M31 | M32 | M33 | M34 |
| OffsetX | OffsetY | OffsetZ | M44 |
Poiché la quarta colonna è accessibile, Matrix3D può rappresentare sia trasformazioni affine che non affine.
Sintassi XAML per Matrix3D
I valori Matrix3D possono essere dichiarati in XAML, ma la sintassi è limitata e diversa da quella prevista in base al modo in cui altre strutture Windows Runtime (ad esempio Thickness) supportano i valori per l'interfaccia utente XAML:+ L'utilizzo più tipico per le proprietà di tipo Matrix3D consiste nell'basarsi sul comportamento della stringa di inizializzazione predefinito per il tipo Matrix3D e impostare qualsiasi valore che usa un valore Matrix3D come attributo. Specificare una stringa nel formato "testo di inizializzazione" per costruire un valore Matrix3D: 16 valori Double separati da virgole o spazi. Puoi vedere questo formato usato nel codice XAML in "Esempi" di seguito.
- Esiste una sola proprietà esistente che usa un valore Matrix3D: Matrix3DProjection.ProjectionMatrix. Ecco cosa viene mostrato come sintassi XAML principale qui.
- La sintassi XAML secondaria mostrata ha un elemento oggetto Matrix3D effettivo. Si noti tuttavia che ha un prefisso dello spazio dei nomi XAML. Windows. UI. Lo spazio dei nomi Xaml.Media.Media3D non è stato incluso nel set di spazi dei nomi di codice usati dal parser XAML Windows Runtime per lo spazio dei nomi XAML predefinito. Per usare Matrix3D come elemento in XAML, devi includere una dichiarazione xmlns nel codice XAML che fa riferimento a Windows. UI. Xaml.Media.Media3D da un'istruzione ** using:**. Qualificare quindi Matrix3D con il prefisso xmlns mappato per i tipi in Windows. UI. Xaml.Media.Media3D.
- Anche dopo aver eseguito questo mapping, l'elemento oggetto Matrix3D non può avere valori di attributo per l'impostazione delle 16 proprietà, non è abilitato dal parser XAML (altre strutture XAML dispongono di una gestione di maiuscole e minuscole speciali per la sintassi delle proprietà come attributo; Matrix3D non ha questo problema. È comunque necessario usare il testo di inizializzazione che imposta i 16 valori come atomi consecutivi di una stringa. In questo caso la stringa è contenuta come "testo interno" /contenuto dell'elemento oggetto Matrix3D.
- Come si può notare, la sintassi dell'elemento oggetto non è più facile da leggere o usare rispetto alla sintassi dell'attributo inline per Matrix3DProjection.ProjectionMatrix, quindi la sintassi dettagliata degli elementi oggetto Matrix3D non è comune.
Proiezione e membri di Matrix3D
Se si usa un linguaggio di Microsoft .NET (C#), Matrix3D dispone di membri non dati disponibili e i relativi membri dati vengono esposti come proprietà di lettura/scrittura, non come campi.
Se si esegue la programmazione con C++ usando la libreria dei modelli di Windows Runtime (WRL), esistono solo i campi membro dati come membri di Matrix3D e non è possibile usare i metodi di utilità o le proprietà elencate nella tabella membri. Il codice WRL può accedere a metodi di utilità simili esistenti nella classe Matrix3DHelper .
Non è possibile impostare le proprietà di Matrix3D in XAML con singoli attributi XAML. È necessario inizializzare un elemento oggetto Matrix3D usando una stringa di inizializzazione che specifica tutti i 16 valori oppure usare la sintassi dell'attributo per Matrix3DProjection.ProjectionMatrix che usa lo stesso formato di stringa.
Campi
| Nome | Descrizione |
|---|---|
| M11 |
Valore della prima riga e della prima colonna di matrix3D. |
| M12 |
Valore della prima riga e della seconda colonna di matrix3D. |
| M13 |
Valore della prima riga e della terza colonna di matrix3D. |
| M14 |
Valore della prima riga e della quarta colonna di matrix3D. |
| M21 |
Valore della seconda riga e della prima colonna di matrix3D. |
| M22 |
Valore della seconda riga e della seconda colonna di matrix3D. |
| M23 |
Valore della seconda riga e della terza colonna di matrix3D. |
| M24 |
Valore della seconda riga e della quarta colonna di matrix3D. |
| M31 |
Valore della terza riga e della prima colonna di matrix3D. |
| M32 |
Valore della terza riga e della seconda colonna di matrix3D. |
| M33 |
Valore della terza riga e della terza colonna di matrix3D. |
| M34 |
Valore della terza riga e della quarta colonna di matrix3D. |
| M44 |
Valore della quarta riga e della quarta colonna di matrix3D. |
| OffsetX |
Valore della quarta riga e della prima colonna di matrix3D. |
| OffsetY |
Valore della quarta riga e della seconda colonna di matrix3D. |
| OffsetZ |
Valore della quarta riga e della terza colonna di matrix3D. |
Si applica a
Vedi anche
- Matrix3DHelper
- Matrix3DProjection
- Projection
- effetti prospettica 3D per dell'interfaccia utente XAML
- effetti prospettica 3D per dell'interfaccia utente XAML