Matrix3D Struct

Definizione

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:

M11M12M13M14
M21M22M23M24
M31M32M33M34
OffsetXOffsetYOffsetZM44

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.

Si applica a

Vedi anche