Matrix3D 结构

定义

表示用于三维空间中转换的 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 具有以下行向量语法:

M11M12M13M14
M21M22M23M24
M31M32M33M34
OffsetXOffsetYOffsetZM44

由于第四列是可访问的,因此 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 的第四行和第三列的值。

适用于

另请参阅