所谓三维变换,其实是在二维平面上产生三维的视觉效果。前面老周简单提了一下透视效果,如果透视效果不能满需求,那可以考虑用三维变换。
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一样,正是老周对编程感兴趣,所以学习起来不会感到乏味,反而感到好玩和有趣,跟别人讨论起编程来滔滔不绝。
不过嘛,老周有一个怪癖,老周是热爱编程,可是老周不喜欢做项目。在阿拉看来,做项目和编程完全是本质不同的两件事,做项目为啥痛苦,不用我多说,许多朋友深有体会。编程的时候我是自由的,做项目的时候总感觉自己被人操控着,所以很不高兴。