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 имеет следующий синтаксис вектора строк:
M11 | M12 | M13 | M14 |
M21 | M22 | M23 | M24 |
M31 | M32 | M33 | M34 |
OffsetX | OffsetY | OffsetZ | M44 |
Так как четвертый столбец доступен, 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. |