Matrix3D 结构
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
表示用于三维空间中转换的 4 × 4 矩阵。 用作 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>
- 继承
-
Matrix3D
- 属性
示例
本示例使用简单的 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;
}
注解
与 PlaneProjection 类型相比,可以将 Matrix3DProjection 和 Matrix3D 类型用于更复杂的半三维方案。 Matrix3DProjection 提供了一个完整的三维转换矩阵,可应用于任何 UIElement (将其用作 UIElement.Projection 属性) 的值。 通过矩阵,可以将任意模型转换矩阵和透视矩阵应用于可视元素。
Matrix3D 具有以下行向量语法:
M11 | M12 | M13 | M14 |
M21 | M22 | M23 | M24 |
M31 | M32 | M33 | M34 |
OffsetX | OffsetY | OffsetZ | M44 |
由于第四列是可访问的,因此 Matrix3D 可以表示仿射和非仿射转换。
Matrix3D 的 XAML 语法
Matrix3D 值可以在 XAML 中声明,但语法是有限的,并且不同于预期的,具体取决于其他Windows 运行时结构 ((如 Thickness) )如何支持 XAML UI 的值:+ Matrix3D 类型属性的最典型用法是依赖于 Matrix3D 类型内置的初始化字符串行为,并设置使用 Matrix3D 值作为属性的任何值。 指定“初始化文本”格式的字符串来构造 Matrix3D 值:16 个单独的 Double 值,每个值用逗号或空格分隔。 可以在下面的“示例”中看到 XAML 中使用的此格式。
- 只有一个使用 Matrix3D 值的现有属性: Matrix3DProjection.ProjectionMatrix。 因此,这就是此处显示的主要 XAML 语法。
- 显示的辅助 XAML 语法具有实际的 Matrix3D 对象元素。 但请注意,它具有 XAML 命名空间前缀。 Windows.UI.Xaml.Media.Media3D 命名空间未包含在 xaml 分析程序用于默认 XAML 命名空间Windows 运行时代码命名空间集中。 若要在 XAML 中使用 Matrix3D 作为元素,必须在 XAML 中包含 一个 xmlns 声明,该声明通过 ** using:** 语句引用 Windows.UI.Xaml.Media.Media3D 。 然后使用为 Windows.UI.Xaml.Media.Media3D 中的类型映射的 xmlns 前缀限定 Matrix3D。
- 即使执行此映射,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 具有可用的非数据成员,并且其数据成员公开为读写属性,而不是字段。
如果使用 Windows 运行时 模板库 (WRL) 使用 C++ 进行编程,则只有数据成员字段作为 Matrix3D 的成员存在,并且无法使用成员表中列出的实用工具方法或属性。 WRL 代码可以访问 Matrix3DHelper 类中存在的类似实用工具方法。
无法使用单个 XAML 属性在 XAML 中设置 Matrix3D 的属性。 必须使用指定所有 16 个值的初始化字符串初始化 Matrix3D 对象元素,或者对使用此相同字符串格式的 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 的第四行和第三列的值。 |