UI前沿技术-无需进行数学运算的投影转换

几乎在任何图形系统中,转换都是最重要的功能,但它事实上并未参与绘制。转换的作用是利用数学公式(通常以矩阵乘法的形式表示 )来修改坐标,从而改变可视对象的外观。

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 程序

时间: 2024-11-05 06:13:23

UI前沿技术-无需进行数学运算的投影转换的相关文章

MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件

原文  MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件 UI 前沿技术 WPF 中的多点触控操作事件 Charles Petzold 下载代码示例 就在过去几年,多点触控还只是科幻电影中表现未来主义的一种重要手法,现在俨然已经成为主流的用户界面技术. 多点触控显示屏现在成了新型智能手机和 Tablet 计算机的标准显示屏. 此外,它还可能在公共场所的计算机上普及,例如 Microsoft Surface 率先开发的网亭或桌面计算机. 实际存在的唯一不确定因素是多点触控在常规台式

UI前沿技术

"流畅 UI"这个词最近常被用来形容一种 UI 设计技术,这种技术能够避免 让可视化对象突然进入视野或者从一个位置跳到另一个位置.流畅的可视化对象 在进入视野和变换位置时更加优雅,有时就像从雾中浮现或者滑入视野. 我在本专栏的前两篇文章中介绍过一些您自己实现流畅 UI 的技术,当时的 部分灵感就来源于 Silverlight 4 中即将推出的流畅 UI 功能.现在, Silverlight 4 已经正式发布,本文就为您介绍其功能.Silverlight 4 中流畅 UI 的使用范围很窄

UI前沿技术: 不局限于网格

画布是 Windows Presentation Foundation (WPF) 和 Silverlight 中提供的若干布局选项之一,它是其中与传统布局传承最为紧密的.在使用子元素填充画布时,通过使用 Canvas.Left 和 Canvas.Top 附加属性指定坐标可以定位每个子元素.此模式与其他面板有显著区别,其他面板是基于简单的算法来布置子元素的,无需程序员指出实际位置. 听到"画布"一词时,您可能会想到绘图和绘画.因此,使用 WPF 和 Silverlight 的程序员可能

UI前沿技术:XNA颜色滚动程序

导读:在2011年1月的MSDN杂志中,MSDN长期特约编辑Charles Petzold发表了一篇有关"XNA颜色滚动程序"的文章 全文如下 我最早编写并发布的 Windows 程序之一名为 COLORSCR("颜色滚动程序"),发表在本杂志的前身 Microsoft Systems Journal 的 1987 年 5 月号中. 很多年过去了,我时常发现针对其他 API 和框架重写此程序很有意义. 尽管这个程序很简单(操控红.绿.蓝三种颜色值对应的滚动条或滑块来

UI前沿技术-WPF中的多点触控操作事件

就在过去几年,多点触控还只是科幻电影中表现未来主义的一种重要手法,现在俨然已经成为主流的用户界面技术.多点触控显示屏现在成了新型智能手机和 Tablet 计算机的标准显示屏.此外,它还可能在公共场所的计算机上普及,例如 Microsoft Surface 率先开发的网亭或桌面计算机. 实际存在的唯一不确定因素是多点触控在常规台式计算机上的普及.这种普及的最大障碍或许是长时间在垂直屏幕上移动手指所产生的疲劳(称为"大猩猩手臂").我个人希望多点触控的强大功能将切实推进桌面显示屏的重新设计

UI前沿技术 – WPF应用程序中的MIDI音乐

每一台 PC 都包含一个内置的 16 人乐队,可播放一些音乐.人们不容易注意此乐队的成员,因为它 们表示的可能是 Windows 所支持的声音和视频功能阵列中利用最不充分的组件. 此 16 人乐队是在符合 MIDI(乐器数字接口)标准的硬件或软件中实现的电子音乐合成器.在 Win32 API 中,以单词 midiOut 开头的函数支持使用 MIDI 合成器播放音乐. MIDI 支持不是 .NET Framework 的一部分,但如果要在 Windows 窗体或 Windows Presentat

大盘点:全球智慧城市都有哪些特色与前沿技术?

全球国家智慧城市建设的辐射效应和集群现象也初步显露,除了美国和加拿大互相影响,智慧城市数量名列第一二名以外,并列第三名的英国.日本.澳大利亚也十分明显的在其所在地区引领了智慧城市建设的热潮,法国(5个智慧城市).德国(4个智慧城市).韩国(4个城市)紧随其后,与之初步形成了各自地区的智慧城市集群网络. (一)韩国:泛在网络 韩国的智慧城市以网络为基础,将医疗.教育等服务系统统一部署在思科公司的数据中心,通过无处不在的网络接入,方便的实现远程的医疗.远程的教育等服务.并且通过标准化的方式向企业开放

smarty模板数学运算示例

本文实例讲述了smarty模板数学运算用法.分享给大家供大家参考,具体如下: {* $height=4, $width=5 *} {math equation="x + y" x=$height y=$width} 输出: 9 {* $row_height = 10, $row_width = 20, #col_div# = 2, assigned in template *} {math equation="height * width / division" h

JAVA之旅(二十三)——System,RunTime,Date,Calendar,Math的数学运算

JAVA之旅(二十三)--System,RunTime,Date,Calendar,Math的数学运算 map实在是太难写了,整理得我都晕都转向了,以后看来需要开一个专题来讲这个了,现在我们来时来学习一些新的小东西吧 一.System 翻译过来系统的意思,系统类,里面的方法都是静态的,可以直接调用 我们来演示一下吧,先从获取系统信息开始: package com.lgl.hellojava; import java.util.Properties; public class HelloJJAVA