【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来设置了变换参数。

得到的运行结果如下图所示。

【Win 10 应用开发】三维变换

既然比WPF的三维模型简单,所以肯定不会像WPF那样具备材质、正背面、光照等效果。主要还是考虑到性能的优化,三维变换只是产生简单的三维视觉。

在运行阶段,可以使用 “实时可视化树” 和 “实时属性资源管理器” 这两个窗口来动态改变变换参数,然后我们就可以实时看到运行效果,不妨通过这个方法来研究三维变换。

【Win 10 应用开发】三维变换

要使用实时可视化树在运行阶段修改属性值,请安装 VS 2015 任意版本的 Update 2。

好,今天的牛逼就吹到这里,欢迎下个世纪的同一时间,锁定火星卫视,继续收看老周吹牛节目。

示例源码下载地址

==============================================

有好几回没讲故事了,今天说一个不少朋友都有点兴趣的话题。

不少同学在学习编程的过程,总会感到枯燥,无聊,都有这种感觉吧?不过,老周想说的是,你如果真的热爱某件事情的话,你是不会感到寂寞的,更不会有坐冷板凳的苦闷。孔老头说过,“知之者不如好之者,好之者不如乐之者”。

就像老周当年从QBasic到C,到C++,到PHP,再到.NET一样,正是老周对编程感兴趣,所以学习起来不会感到乏味,反而感到好玩和有趣,跟别人讨论起编程来滔滔不绝。

不过嘛,老周有一个怪癖,老周是热爱编程,可是老周不喜欢做项目。在阿拉看来,做项目和编程完全是本质不同的两件事,做项目为啥痛苦,不用我多说,许多朋友深有体会。编程的时候我是*的,做项目的时候总感觉自己被人操控着,所以很不高兴。

上一篇:MyBatis进阶(一)运行原理


下一篇:Ionic2学习笔记(10):扫描二维码