【Win 10 应用开发】三维变换
所谓三维变换,其实是在二维平面上产生三维的视觉效果。前面老周简单提了一下透视效果,如果透视效果不能满需求,那可以考虑用三维变换。
UIElement类有一个属性叫Transform3D,它定义的类型为Transform3D,但,这个类是没有公共的构造函数的,困为它只作为基类。从这个类派生出两个类:
PerspectiveTransform3D——这个类的作用是设置观察点的位置,它不能单独使用,单独使用这个类,看不到变换效果。所谓观察点,就好比咱们照相时照相机的观察窗口,照相机放到什么位置,就会看到不同的场景。如果照相机放到咱们头顶上,那拍到的就是咱们的头发;如果照相机放到我们身后,就会拍到许多“背影杀手”。PerspectiveTransform3D类包含几个参数,OffsetX表示X轴上的偏移距离,OffsetY自然就是Y轴上的偏移距离,这些位移都是相对于可视化元素的中心而言的。还有一个Depth值,表示对象离观察点的距离,相当于Z距离。这些参数都是以像素为单位的,一定要注意,是绝对数值,不是相对值。
CompositeTransform3D——这个类可以设置对象的:1、变换中心位置(CenterX、CenterY、CenterZ),注意与透视的区别,透视的中心点用的是相对坐标([0,1]),而这里用的绝对坐标,以像素为单位。2、旋转(RotationX、RotationY、RotationZ),旋转以角为单位。3、位移(TranslateX、TranslateY、TranslateZ),表示对象在各个坐标轴上偏移的距离,以像素为单位。4、缩放(ScaleX、ScaleY、ScaleZ),表示对象在各个轴上的缩放倍数,由于是倍数,所以不应该为0,0倍你就看不到对象了,因此,缩放参数的默认值为1。
这两个三维变换的类型,必须搭配着使用。PerspectiveTransform3D类通常用在容器中,比如Page、Grid、Canvas等,用于设定观察点;而CompositeTransform3D用在容器中的各个子元素上,描述单个对象的变换情况。
其实三维变换用起来也不算复杂,至少比WPF的三维模型简单,不过比透视效果略复杂一点。
下面看一个例子。
<Canvas>
<Rectangle Width="350" Height="100" Fill="Red" Canvas.Left="180" Canvas.Top="60">
<Rectangle.Transform3D>
<CompositeTransform3D RotationY="60" CenterX="100"/>
</Rectangle.Transform3D>
</Rectangle>
<TextBlock FontSize="20" Text="Document" Canvas.Left="450" Canvas.Top="125">
<TextBlock.Transform3D>
<CompositeTransform3D ScaleY="3" RotationZ="30"/>
</TextBlock.Transform3D>
</TextBlock>
<Canvas.Transform3D>
<PerspectiveTransform3D OffsetX="10" OffsetY="-200"/>
</Canvas.Transform3D>
</Canvas>
上面的例子中,容器元素是Canvas,Canvas本身应用了PerspectiveTransform3D变换,OffsetY为负值,表示观察点移到对象的下方。
在Canvas中放了两个对象,一个是矩形,一个是文本,它们分别用CompositeTransform3D来设置了变换参数。
得到的运行结果如下图所示。

既然比WPF的三维模型简单,所以肯定不会像WPF那样具备材质、正背面、光照等效果。主要还是考虑到性能的优化,三维变换只是产生简单的三维视觉。
在运行阶段,可以使用 “实时可视化树” 和 “实时属性资源管理器” 这两个窗口来动态改变变换参数,然后我们就可以实时看到运行效果,不妨通过这个方法来研究三维变换。

要使用实时可视化树在运行阶段修改属性值,请安装 VS 2015 任意版本的 Update 2。
好,今天的牛逼就吹到这里,欢迎下个世纪的同一时间,锁定火星卫视,继续收看老周吹牛节目。
==============================================
有好几回没讲故事了,今天说一个不少朋友都有点兴趣的话题。
不少同学在学习编程的过程,总会感到枯燥,无聊,都有这种感觉吧?不过,老周想说的是,你如果真的热爱某件事情的话,你是不会感到寂寞的,更不会有坐冷板凳的苦闷。孔老头说过,“知之者不如好之者,好之者不如乐之者”。
就像老周当年从QBasic到C,到C++,到PHP,再到.NET一样,正是老周对编程感兴趣,所以学习起来不会感到乏味,反而感到好玩和有趣,跟别人讨论起编程来滔滔不绝。
不过嘛,老周有一个怪癖,老周是热爱编程,可是老周不喜欢做项目。在阿拉看来,做项目和编程完全是本质不同的两件事,做项目为啥痛苦,不用我多说,许多朋友深有体会。编程的时候我是自由的,做项目的时候总感觉自己被人操控着,所以很不高兴。
【Win 10 应用开发】三维变换的更多相关文章
- 【Win 10 应用开发】启动远程设备上的应用
这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...
- 【Win 10 应用开发】导入.pfx证书
这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...
- 【Win 10应用开发】Adaptive磁贴模板的XML文档结构
在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...
- 【Win 10 应用开发】RTM版的UAP项目解剖
Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...
- 【Win 10应用开发】认识一下UAP项目
Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...
- 【Win 10 应用开发】在代码中加载文本资源
记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...
- 【Win 10 应用开发】透视效果
所谓透视效果,就是在平面坐标空间上模拟出“好像”三维的效果.要是老周没有记错的话,以前在写WP8相关的内容时写过,UWP中的透视方法也保留了以前的Do法,其实这玩意儿是从 Silverlight 沿袭 ...
- 【Win 10应用开发】延迟共享
延迟共享是啥呢,这么说吧,就是在应用程序打开共享面板选择共享目标时,不会设置要共享的数据,而是等到共享目标请求数据时,才会发送数据,而且,延迟操作可以在后台进行. 这样说似乎过于抽象,最好的诠释方法, ...
- 【Win 10 应用开发】Toast通知激活应用——前台&后台
老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...
随机推荐
- Visual Studio 2010的MSDN帮助文档离线使用
如果没有在安装vs过程中安装帮助,也可通过Visual Studio帮助菜单中的Manage Help Settings来对帮助进行设置或安装. 可以选择从磁盘安装内容,如果选择从磁盘安装可能会要求提 ...
- Springmvc数据校验
步骤一:导入四个jar包 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- AFNetworking 3.0 源码解读(六)之 AFHTTPSessionManager
AFHTTPSessionManager相对来说比较好理解,代码也比较短.但却是我们平时可能使用最多的类. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilit ...
- MFC中成员变量的声明顺序与析构顺序
第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- mono中发送邮件并保存本次收件人的地址
在ios端mono开发中,发送邮件可以选择调用ios原生email程序.有两种方式实现这种功能,一是程序跳转到ipad中email程序,另外一种是将发送邮件的界面在自己应用里弹出. 首先第一种方式的代 ...
- Handlebars 模板引擎之前后端用法
前言 不知不觉间,居然已经这么久没有写博客了,坚持还真是世界上最难的事情啊. 不过我最近也没闲着,辞工换工.恋爱失恋.深圳北京都经历了一番,这有起有落的生活实在是太刺激了,就如拿着两把菜刀剁洋葱一样, ...
- 用Go实现的简易TCP通信框架
接触到GO之后,GO的网络支持非常令人喜欢.GO实现了在语法层面上可以保持同步语义,但是却又没有牺牲太多性能,底层一样使用了IO路径复用,比如在LINUX下用了EPOLL,在WINDOWS下用了IOC ...
- CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口
CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口 开始 像下面这样的四个视口的功能是很常用的,所以我花了几天时间在CSharpGL中集成了这个功能. 在CSh ...
- Entity Framework 6 Recipes 2nd Edition(12-7)译 -> 设定默认值
12-7. 设定默认值 问题 在把一个实体保存到数据库之前,设置该实体属性的默认值 解决方案 假设你有一个如Figure 12-9所示的表, 它保存采购订单(purchase order). 主键Pu ...