几乎在任何图形系统中,转换都是最重要的功能,但它事实上并未参与绘制。转换的作用是利用数学公式(通常以矩阵乘法的形式表示 )来修改坐标,从而改变可视对象的外观。
Silverlight 从其出现开始一直采用由 UIElement 定义的 RenderTransform 属性,而此前,该属性一直在 Windows Presentation Foundation (WPF) 中应用。由于该属性是由 UIElement 定义的,因此,您可以将其用于图形对象、文本、控件和媒体。只需将 RenderTransform 设置为类型 TranslateTransform、ScaleTransform、RotateTransform、SkewTransform、 MatrixTransform(为实现对 转换矩阵的完全控制)或 TransformGroup 的对象,即可实现多种转换的组合。
利用 RenderTransform 设置的转换类型全部属于二维 (2D) 仿射转换。仿射转换始终规规矩矩,因此有些乏味:直线永远转换为直线, 椭圆始终转换为椭圆,正方形始终转换为平行四边形。转换前的两条平行线在转换后永远是平行的。
伪 3D
Silverlight 3 引入了名为 Projection 的新 UIElement 属性,从而实现对图形对象、文本、控件和媒体设置非仿射转换。非仿射转换 不会保留转换前的平行状态。
Silverlight 3 中允许的非仿射转换类型仍以矩阵乘法表示,并且对其能够执行的操作仍有限制。直线永远转换为直线,正方形始终转 换为简单凸四边形。此处的“四边形”是指由四条边组成的图形(又称作“四角形”);此处的“简单”是指除了顶点之外,各边不会相交 ;此处的“凸”是指各内角小于 180 度。
这种非仿射转换可用于创建锥化转换,在此转换中,正方形和长方形的对边朝一个方向进行一定的锥化。图 1 显示一些文本通过非常简 单的 Projection 属性设置实现锥化转换。
图 1 锥化转换文 本
文本看起来有一定的三维 (3D) 立体感,这是因为文本的尾端看起来有逐渐远去的感觉,这种效果称作“透视投影” 。
从某种意义上说, Projection 属性使 Silverlight 具有了一定的“伪 3D”功能。但 Silverlight 不是真正的 3D 系统,这是因为它不支持在 3D 空间中定义对象,没有镜头概念、光源或阴影 — 也许最重要的是不支持在 3D 空间中根据对象的排 列剪辑对象。
此外,在进行投影转换时,程序员需要开始考虑三维,尤其是 3D 旋转。幸运的是,Silverlight 的开发人员使 Projection 属性的常规和简单使用非常容易进行。
更简单的方法
您可以将 Projection 属性设置为 Matrix3DProjection 对象或 PlaneProjection 对象。Matrix3DProjection 属性只定义了一个对象,但它属于 4x4 Matrix3D 结构,需要大量数学运算。
但是在此篇文章中,我已自我承诺在大多数情况下避免数学运算,这意味着我将坚持使用 PlaneProjection 类。尽管该类定义了 12 个可设置属性,但我只重点关注其中的 6 个。
在此篇文章中,可下载的源代码是 PlaneProjectionExperimenter,它允许您对 这 6 个属性进行互动实验。图 2 显示了运行中的程序。您可以通过编译该可下载程序运行它,也可以在我的网站 charlespetzold.com/silverlight/PlaneProjectionDemos 运行它,同时还可以运行此篇文章中的所有其他程序。现在,先忽略中间的蓝点 。
图 2 PlaneProjectionExperimenter 程序