所谓三维变换,其实是在二维平面上产生三维的视觉效果。前面老周简单提了一下透视效果,如果透视效果不能满需求,那可以考虑用三维变换。

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 应用开发】三维变换的更多相关文章

  1. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  2. 【Win 10 应用开发】导入.pfx证书

    这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...

  3. 【Win 10应用开发】Adaptive磁贴模板的XML文档结构

    在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...

  4. 【Win 10 应用开发】RTM版的UAP项目解剖

    Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...

  5. 【Win 10应用开发】认识一下UAP项目

    Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...

  6. 【Win 10 应用开发】在代码中加载文本资源

    记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...

  7. 【Win 10 应用开发】透视效果

    所谓透视效果,就是在平面坐标空间上模拟出“好像”三维的效果.要是老周没有记错的话,以前在写WP8相关的内容时写过,UWP中的透视方法也保留了以前的Do法,其实这玩意儿是从 Silverlight 沿袭 ...

  8. 【Win 10应用开发】延迟共享

    延迟共享是啥呢,这么说吧,就是在应用程序打开共享面板选择共享目标时,不会设置要共享的数据,而是等到共享目标请求数据时,才会发送数据,而且,延迟操作可以在后台进行. 这样说似乎过于抽象,最好的诠释方法, ...

  9. 【Win 10 应用开发】Toast通知激活应用——前台&后台

    老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  2. 【开源】.Net 动态脚本引擎NScript

    开源地址: https://git.oschina.net/chejiangyi/NScript 开源QQ群: .net 开源基础服务  238543768 .Net 动态脚本引擎 NScript   ...

  3. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  4. 用FSM一键制作逐帧动画雪碧图 Vue2 + webpack

    因为工作需要要将五六十张逐帧图拼成雪碧图,网上想找到一件制作工具半天没有找到,就自己用canvas写了一个. 写成之后就再没有什么机会使用了,因此希望有人使用的时候如果遇到bug了能及时反馈给我. 最 ...

  5. [原]分享一下我和MongoDB与Redis那些事

    缘起:来自于我在近期一个项目上遇到的问题,在Segmentfault上发表了提问 知识背景: 对不是很熟悉MongoDB和Redis的同学做一下介绍. 1.MongoDB数组查询:MongoDB自带L ...

  6. bzoj1079--记忆化搜索

    题目大意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得 ...

  7. bzoj1584--DP

    题目大意:有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若 ...

  8. 【转】java通用URL接口地址调用方式GET和POST方式

    java通用URL接口地址调用方式GET和POST方式,包括建立请求和设置请求头部信息等等......... import java.io.ByteArrayOutputStream; import ...

  9. ESLint的使用笔记

    原文地址:https://csspod.com/getting-started-with-eslint/?utm_source=tuicool&utm_medium=referral 在团队协 ...

  10. 敏捷转型历程 - Sprint3 Grooming

    我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...