Condividi tramite


Matrix3D Struct

Definizione

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 (questo valore viene usato 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:

M11M12M13M14
M21M22M23M24
M31M32M33M34
OffsetXOffsetYOffsetZM44

Poiché la quarta colonna è accessibile, Matrix3D può rappresentare trasformazioni affine e 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 a come 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 nel 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. Questo è ciò che 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. Lo spazio dei nomi Windows.UI.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 dell'oggetto Matrix3D non può avere valori di attributo per impostare le 16 proprietà, non è abilitato dal parser XAML (altre strutture XAML hanno una gestione speciale del case per la sintassi delle proprietà come attributo; Matrix3D non ha questo valore. È 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 dell'oggetto Matrix3D.
  • Come si può notare, la sintassi dell'elemento oggetto non è più semplice 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 Microsoft .NET (C# o Microsoft Visual Basic) o nelle estensioni del componente 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 modelli di Windows Runtime (WRL), esistono solo i campi membro dati come membri di Matrix3D e non è possibile usare i metodi o le proprietà dell'utilità elencati nella tabella membri. Il codice WRL può accedere a metodi di utilità simili esistenti nella classe Matrix3DHelper .

Non puoi 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 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