Matrix3D Struktur

Definisi

Mewakili matriks 4 × 4 yang digunakan untuk transformasi dalam spasi 3-D. Digunakan sebagai nilai untuk 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>
Warisan
Matrix3D
Atribut

Persyaratan Windows

Rangkaian perangkat
Windows 10 (diperkenalkan dalam 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (diperkenalkan dalam v1.0)

Contoh

Contoh ini menggunakan matriks Matrix3D sederhana untuk mengubah gambar ke arah X dan Y saat Anda mengklik gambar.

<!-- 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;
}

Keterangan

Anda dapat menggunakan jenis Matrix3DProjection dan Matrix3D untuk skenario semi-3-D yang lebih kompleks daripada yang dimungkinkan dengan jenis PlaneProjection . Matrix3DProjection menyediakan matriks transformasi 3-D lengkap untuk diterapkan ke UIElement apa pun (Anda menggunakan ini sebagai nilai untuk properti UIElement.Projection ). Matriks memungkinkan Anda menerapkan matriks transformasi model arbitrer dan matriks perspektif ke elemen visual.

Matriks3D memiliki sintaks vektor baris ini:

M11M12M13M14
M21M22M23M24
M31M32M33M34
OffsetXOffsetyOffsetZM44

Karena kolom keempat dapat diakses, Matrix3D dapat mewakili transformasi affine dan non-affine.

Sintaks XAML untuk Matrix3D

Nilai matriks3D dapat dideklarasikan dalam XAML, tetapi sintaksnya terbatas, dan berbeda dari apa yang mungkin Anda harapkan berdasarkan bagaimana struktur Windows Runtime lainnya (seperti Ketebalan) mendukung nilai untuk UI XAML:+ Penggunaan paling umum untuk properti jenis Matrix3D adalah mengandalkan perilaku string inisialisasi yang bawaan ke jenis Matrix3D, dan mengatur nilai apa pun yang menggunakan nilai Matrix3D sebagai atribut. Anda menentukan string dalam format "teks inisialisasi" untuk membuat nilai Matriks3D: 16 nilai Ganda terpisah masing-masing dipisahkan oleh koma atau spasi. Anda dapat melihat format ini yang digunakan dalam XAML di "Contoh" di bawah ini.

  • Hanya ada satu properti yang ada yang menggunakan nilai Matrix3D: Matrix3DProjection.ProjectionMatrix. Jadi itulah yang ditampilkan sebagai sintaks XAML utama di sini.
  • Sintaks XAML sekunder yang ditampilkan memiliki elemen objek Matrix3D yang sebenarnya. Tetapi perhatikan bahwa ia memiliki awalan namespace XAML. Namespace Windows.UI.Xaml.Media.Media3D tidak disertakan dalam kumpulan namespace kode yang digunakan pengurai XAML Windows Runtime untuk namespace XAML default. Untuk menggunakan Matrix3D sebagai elemen di XAML, Anda harus menyertakan deklarasi xmln di XAML Anda yang mereferensikan Windows.UI.Xaml.Media.Media3D oleh ** menggunakan pernyataan:**. Kemudian kualifikasi Matrix3D dengan awalan xmln yang Anda petakan untuk jenis di Windows.UI.Xaml.Media.Media3D.
  • Bahkan setelah Anda melakukan pemetaan ini, elemen objek Matrix3D tidak dapat memiliki nilai atribut untuk mengatur 16 properti, itu tidak diaktifkan oleh parser XAML (struktur XAML lainnya memiliki penanganan kasus khusus untuk sintaks properti sebagai atribut; Matriks3D kebetulan tidak memiliki ini). Anda masih harus menggunakan teks inisialisasi yang menetapkan 16 nilai sebagai atom berturut-turut dari string. Dalam hal ini string dimuat sebagai "teks dalam" / konten elemen objek Matrix3D.
  • Seperti yang Anda lihat sintaks elemen objek tidak lebih mudah dibaca atau digunakan daripada sintaks atribut sebaris untuk Matrix3DProjection.ProjectionMatrix, sehingga sintaks elemen objek Matrix3D verbose tidak umum.

Proyeksi dan anggota Matrix3D

Jika Anda menggunakan bahasa Microsoft .NET (C# atau Microsoft Visual Basic), atau di ekstensi komponen Visual C++ (C++/CX), maka Matrix3D memiliki anggota non-data yang tersedia, dan anggota datanya diekspos sebagai properti baca-tulis, bukan bidang.

Jika Anda memprogram dengan C++ menggunakan Pustaka Templat Runtime Windows (WRL), maka hanya bidang anggota data yang ada sebagai anggota Matrix3D, dan Anda tidak dapat menggunakan metode utilitas atau properti yang tercantum dalam tabel anggota. Kode WRL dapat mengakses metode utilitas serupa yang ada di kelas Matrix3DHelper .

Anda tidak dapat mengatur properti Matrix3D di XAML dengan atribut XAML individual. Anda harus menginisialisasi elemen objek Matrix3D menggunakan string inisialisasi yang menentukan semua 16 nilai, atau menggunakan sintaks atribut untuk Matrix3DProjection.ProjectionMatrix yang menggunakan format string yang sama ini.

Bidang

M11

Nilai baris pertama dan kolom pertama Matriks3D ini.

M12

Nilai baris pertama dan kolom kedua dari Matriks3D ini.

M13

Nilai baris pertama dan kolom ketiga Matriks3D ini.

M14

Nilai baris pertama dan kolom keempat dari Matriks3D ini.

M21

Nilai baris kedua dan kolom pertama Matriks3D ini.

M22

Nilai baris kedua dan kolom kedua dari Matriks3D ini.

M23

Nilai baris kedua dan kolom ketiga Matriks3D ini.

M24

Nilai baris kedua dan kolom keempat dari Matriks3D ini.

M31

Nilai baris ketiga dan kolom pertama Matriks3D ini.

M32

Nilai baris ketiga dan kolom kedua dari Matriks3D ini.

M33

Nilai baris ketiga dan kolom ketiga Matriks3D ini.

M34

Nilai baris ketiga dan kolom keempat dari Matriks3D ini.

M44

Nilai baris keempat dan kolom keempat dari Matriks3D ini.

OffsetX

Nilai baris keempat dan kolom pertama Matriks3D ini.

OffsetY

Nilai baris keempat dan kolom kedua dari Matriks3D ini.

OffsetZ

Nilai baris keempat dan kolom ketiga dari Matriks3D ini.

Berlaku untuk

Lihat juga