信息
您所需的主题如下所示。但此主题未包含在此库中。

Matrix3DProjection 类

2013/12/13

可用于将 Matrix3D 应用于对象。

System.Object
  System.Windows.DependencyObject
    System.Windows.Media.Projection
      System.Windows.Media.Matrix3DProjection

Namespace:  System.Windows.Media
程序集:  System.Windows(位于 System.Windows.dll 中)

[ContentPropertyAttribute("ProjectionMatrix", true)]
public sealed class Matrix3DProjection : Projection

Matrix3DProjection 类型公开以下成员。

  名称说明
公共方法Matrix3DProjection初始化 Matrix3DProjection 类的新实例。
返回顶部

  名称说明
公共属性Dispatcher获取与此对象关联的 Dispatcher (从 DependencyObject 继承。)
公共属性ProjectionMatrix获取或设置供应用于对象的投影使用的 Matrix3D
返回顶部

  名称说明
公共方法CheckAccess确定调用线程是否可以访问此对象。 (从 DependencyObject 继承。)
公共方法ClearValue清除依赖项属性的本地值。 (从 DependencyObject 继承。)
公共方法Equals(Object)确定指定的 Object 是否等于当前的 Object (从 Object 继承。)
受保护的方法Finalize允许 Object 在垃圾回收器回收该对象之前尝试释放资源并执行其他清理操作。 (从 Object 继承。)
公共方法GetAnimationBaseValue返回为 Windows Phone 依赖项属性设置的任意基值,在动画不活动时将应用它们。 (从 DependencyObject 继承。)
公共方法GetHashCode用作特定类型的哈希函数。 (从 Object 继承。)
公共方法GetType获取当前实例的 Type (从 Object 继承。)
公共方法GetValueDependencyObject 返回依赖项属性的当前有效值。 (从 DependencyObject 继承。)
受保护的方法MemberwiseClone创建当前 Object 的浅表副本。 (从 Object 继承。)
公共方法ReadLocalValue返回依赖项属性的本地值(如果设置了本地值)。 (从 DependencyObject 继承。)
公共方法SetValueDependencyObject 设置依赖项属性的本地值。 (从 DependencyObject 继承。)
公共方法ToString返回一个字符串,它表示当前的对象。 (从 Object 继承。)
返回顶部

  名称说明
公共字段静态成员ProjectionMatrixProperty标识 ProjectionMatrix 依赖项属性。
返回顶部

Matrix3DProjectionMatrix3D 周围的包装类。

您需要提供一个三维 (3-D) 变换矩阵,该矩阵从对象空间(UIElement 空间)转到均质屏幕空间,而系统隐式对生成的坐标进行透视划分。

可以将 Matrix3DProjectionMatrix3D 类型用于比使用 PlaneProjection 可能更复杂的半三维方案。Matrix3DProjection 向您提供可应用于任何 UIElement 的完整三维变换矩阵,以便您可以将任意模型变换矩阵和透视矩阵应用于 XAML UI 元素。

由于这些 API 是最简化的形式,因此,如果您使用它们,需要编写正确创建 3-D 转换矩阵的代码。因此,将 PlaneProjection 用于大多数三维方案将更为轻松。

若要使用 Matrix3DProjection,您需要使用标准 3-D 变换矩阵。有关如何构造和使用这些三维矩阵的更多信息,请参见 DirectX documentation(DirectX 文档)。Matrix3DProjection 用户应特别注意的功能是标准的转换、缩放、旋转和透视矩阵。

下面的示例使用简单的 Matrix3D 矩阵,使您在点击图形时变换图形的 X 和 Y 方向。


<!-- When you click on the image, the projection is applied. -->
<Image MouseLeftButtonDown="ApplyProjection" x:Name="BeachImage" Source="guy_by_the_beach.jpg"
       Width="200"/>


还可以通过使用 XAML 将 Matrix3DProjection 应用于对象。下面的示例演示里如何像前一示例中一样应用相同变换,不过使用的是 XAML 而不是程序代码:


<Image Source="guy_by_the_beach.jpg" Width="200">
    <Image.Projection>
        <Matrix3DProjection  ProjectionMatrix="1, 0, 0, 0,
                                              0, 1, 0, 0,
                                              0, 0, 1, 0,
                                              100, 100, 0, 1"/>
    </Image.Projection>
</Image>


您可以将多个矩阵相乘以获得更复杂的效果。下面的示例使用多个 Matrix3D 矩阵,当您点击图像时,这些矩阵将 3-D 变换应用于此图像。


<!-- When you click on the image, the projection is applied. -->
<Image MouseLeftButtonDown="ApplyProjection" x:Name="BeachImage" Source="guy_by_the_beach.jpg" 
       Width="200"/>



private void ApplyProjection(Object sender, MouseButtonEventArgs 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 matrixes 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 = centerImageAtOrigin * invertYAxis;
    m = m * rotateAboutY;
    m = m * translateAwayFromCamera;
    m = m * perspective;
    m = 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;
}


Windows Phone OS

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

此类型的所有公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

显示: