Поделиться через


Matrix3D Структура

Определение

Представляет матрицу 4 × 4, которая используется для преобразований в трехмерном пространстве. Используется в качестве значения для 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>
Наследование
Matrix3D
Атрибуты

Требования к Windows

Семейство устройств
Windows 10 (появилось в 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (появилось в v1.0)

Примеры

В этом примере используется простая матрица Matrix3D для преобразования изображения в направлениях X и Y при щелчке изображения.

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

Комментарии

Типы Matrix3DProjection и Matrix3D можно использовать для более сложных полу-трехмерных сценариев, чем это возможно с типом PlaneProjection . Matrix3DProjection предоставляет полную матрицу трехмерного преобразования для применения к любому элементу UIElement (используется в качестве значения для свойства UIElement.Projection ). Матрица позволяет применять к визуальным элементам матрицы произвольного преобразования модели и матрицы перспективы.

Matrix3D имеет следующий синтаксис вектора строк:

M11M12M13M14
M21M22M23M24
M31M32M33M34
OffsetXOffsetYOffsetZM44

Так как четвертый столбец доступен, Matrix3D может представлять как аффинные, так и неаффинные преобразования.

Синтаксис XAML для Matrix3D

Значения Matrix3D можно объявлять в XAML, но синтаксис ограничен и отличается от ожидаемого в зависимости от того, как другие структуры среда выполнения Windows (например, Толщина) поддерживают значения для пользовательского интерфейса XAML:+. Наиболее типичное использование свойств типа Matrix3D заключается в том, чтобы полагаться на поведение строки инициализации, встроенное в тип Matrix3D, и задать любое значение, использующее значение Matrix3D в качестве атрибута. Вы указываете строку в формате "текст инициализации" для создания значения Matrix3D: 16 отдельных значений Double , каждое из которых разделено запятыми или пробелами. Этот формат, используемый в XAML, можно увидеть в разделе "Примеры" ниже.

  • Существует только одно свойство, использующее значение Matrix3D: Matrix3DProjection.ProjectionMatrix. Вот что здесь показано в качестве основного синтаксиса XAML.
  • Показанный дополнительный синтаксис XAML содержит фактический элемент объекта Matrix3D. Но обратите внимание, что у него есть префикс пространства имен XAML. Пространство имен Windows.UI.Xaml.Media.Media3D не было включено в набор пространств имен кода, которые средство синтаксического анализа среда выполнения Windows XAML использует для пространства имен XAML по умолчанию. Чтобы использовать Matrix3D в качестве элемента в XAML, необходимо включить в XAML объявление xmlns , которое ссылается на Windows.UI.Xaml.Media.Media3D с помощью оператора ** using:*. Затем укажите matrix3D с префиксом xmlns , сопоставленным для типов в Windows.UI.Xaml.Media.Media3D.
  • Даже после выполнения этого сопоставления объектный элемент Matrix3D не может иметь значения атрибутов для задания 16 свойств, он не включается в средстве синтаксического анализа XAML (другие структуры XAML имеют специальную обработку для синтаксиса properties-as-attribute; Matrix3D не имеет этого). По-прежнему необходимо использовать текст инициализации, который задает 16 значений как последовательные атомы строки. В этом случае строка содержится в виде "внутреннего текста" / содержимого элемента объекта Matrix3D.
  • Как видите, синтаксис объектного элемента не проще для чтения или использования, чем синтаксис встроенного атрибута для Matrix3DProjection.ProjectionMatrix, поэтому подробный синтаксис элемента объекта Matrix3D не распространен.

Проекция и члены Matrix3D

Если вы используете язык Microsoft .NET (C# или Microsoft Visual Basic) или расширения компонентов Visual C++ (C++/CX), matrix3D имеет доступные элементы, не относящиеся к данным, и его члены данных предоставляются как свойства чтения и записи, а не поля.

При программировании на C++ с помощью библиотеки шаблонов среда выполнения Windows (WRL) в качестве элементов Matrix3D существуют только поля элементов данных, и вы не сможете использовать служебные методы или свойства, перечисленные в таблице элементов. Код WRL может обращаться к аналогичным служебным методам, существующим в классе Matrix3DHelper .

Нельзя задать свойства Matrix3D в XAML с помощью отдельных атрибутов XAML. Необходимо инициализировать объектный элемент Matrix3D с помощью строки инициализации, указывающей все 16 значений, или использовать синтаксис атрибута для Matrix3DProjection.ProjectionMatrix , использующего тот же формат строки.

Поля

M11

Значение первой строки и первого столбца этой матрицы Matrix3D.

M12

Значение первой строки и второго столбца этой матрицы Matrix3D.

M13

Значение первой строки и третьего столбца этой матрицы Matrix3D.

M14

Значение первой строки и четвертого столбца этой матрицы Matrix3D.

M21

Значение второй строки и первого столбца этой матрицы Matrix3D.

M22

Значение второй строки и второго столбца этой матрицы Matrix3D.

M23

Значение второй строки и третьего столбца этой матрицы Matrix3D.

M24

Значение второй строки и четвертого столбца этой матрицы Matrix3D.

M31

Значение третьей строки и первого столбца этой матрицы Matrix3D.

M32

Значение третьей строки и второго столбца этой матрицы Matrix3D.

M33

Значение третьей строки и третьего столбца этого matrix3D.

M34

Значение третьей строки и четвертого столбца этой матрицы Matrix3D.

M44

Значение четвертой строки и четвертого столбца этой матрицы Matrix3D.

OffsetX

Значение четвертой строки и первого столбца этой матрицы Matrix3D.

OffsetY

Значение четвертой строки и второго столбца этой матрицы Matrix3D.

OffsetZ

Значение четвертой строки и третьего столбца этой матрицы Matrix3D.

Применяется к

См. также раздел