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 4 usata per le trasformazioni in uno spazio 3D. Utilizzato come valore per 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>
- Ereditarietà
-
Matrix3D
- Attributi
Requisiti Windows
Famiglia di dispositivi |
Windows 10 (è stato introdotto in 10.0.10240.0)
|
API contract |
Windows.Foundation.UniversalApiContract (è stato introdotto in v1.0)
|
Esempio
In questo esempio viene usata 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 siano possibili con il tipo PlaneProjection . Matrix3DProjection fornisce una matrice di trasformazione 3D completa da applicare a qualsiasi UIElement (si usa questo come valore per la proprietà UIElement.Projection). La matrice consente di applicare matrici di trasformazione arbitrarie del modello e matrici di prospettiva agli elementi visivi.
Matrix3D ha questa sintassi del vettore di righe:
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 alla modalità di supporto di altre strutture Windows Runtime (ad esempio Spessore) per l'interfaccia utente XAML:+ L'utilizzo più tipico per le proprietà di tipo Matrix3D consiste nel basarsi sul comportamento della stringa di inizializzazione predefinito nel tipo Matrix3D e impostare qualsiasi valore che usa un valore Matrix3D come attributo. Specificare una stringa nel formato "inizializzazione del testo" per costruire un valore Matrix3D: 16 valori Double separati da virgole o spazio. È possibile visualizzare questo formato usato nel codice XAML in "Esempi" di seguito.
- Esiste solo una proprietà esistente che usa un valore Matrix3D: Matrix3DProjection.ProjectionMatrix. Questo è ciò che viene mostrato come sintassi XAML primaria qui.
- La sintassi XAML secondaria mostrata ha un elemento oggetto Matrix3D effettivo. Si noti tuttavia che ha un prefisso dello spazio dei nomi XAML. Lo spazio dei nomi Windows.UI.Xaml.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, è necessario includere una dichiarazione xmlns nel codice XAML che fa riferimento a Windows.UI.Xaml.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 hanno una gestione speciale per le proprietà-as-attributo sintassi; Matrix3D non ha questo problema. È comunque necessario usare il testo di inizializzazione che imposta i 16 valori come atom 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 dell'elemento matrice3D dettagliata non è comune.
Proiezione e membri di Matrix3D
Se si usa un linguaggio Microsoft .NET (C# o Microsoft Visual Basic) o nelle estensioni dei componenti di Visual C++ (C++/CX), Matrix3D dispone di membri non dati disponibili e i relativi membri dati vengono esposti come proprietà di lettura-scrittura, non campi.
Se si esegue la programmazione con C++ usando la libreria di modelli di Windows Runtime , esistono solo i campi membro dati come membri di Matrix3D e non è possibile usare i metodi di utilità o le proprietà elencate nella tabella dei 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 o usare la sintassi dell'attributo per Matrix3DProjection.ProjectionMatrix che usa lo stesso formato stringa.
Campi
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. |