WPF之3D动画初体验
2010-09-11 7:56 by hackerzhou这两天老大要我们研究WPF,尝试做一些3D的场景切换效果。因为考虑到复用,因此我实现了一个进行3D翻页的容器,放进这个容器里面的两个子容器(可以是Canvas,Border或别的容器)就可以渲染出两个子容器之间的切换效果。下周会继续实现别的3D效果容器。
具体实现的代码在 http://code.google.com/p/hackerzhou/downloads/detail?name=WPF_3D_Rotate.rar
刚刚接触WPF,看了些示例代码后觉得和Adobe Air很类似,而且和Sliverlight的关系就好像Air和Flex的一样。一个直接跑在客户端上,一个跑在浏览器上。Sliverlight和WPF不能跨平台依旧是硬伤,不过不知道资源占用率是不是比Flash好,至少在我笔记本上跑几个机器是不会卡,Flash就难说了。。。
容器调用方法见MainWindow.xaml
<custom:Rotate3DContainer> <custom:Panel1/> <custom:Panel2/> </custom:Rotate3DContainer>
在字容器中需要进行翻页的时候可以调用ContainerUtils.GetNearestContainer(this)来找到最近的那个容器,调用哪个容器的Turn方法就可以了。
WPF的动画是用Storyboard包裹若干Timeline(由具体的动画和关键帧来实现)然后调用Begin方法来启动组合动画。有点类似PPT中的动画,所以做起来不算太困难。
遇到的问题:
1.要注册AxisAngleRotation3D,这是MSDN上的方法,我尝试过通过out关键字返回AxisAngleRotation3D的实例,然后在别的地方添加Storyboard.SetTargetName,发现并没有作用。
标准做法应该是
//在一个方法里注册 AxisAngleRotation3D rotate = ... this.RegisterName("AxisAngleRotation3D", rotate); //在另一个方法里绑定到对应的动画 Storyboard.SetTargetName(ani, "AxisAngleRotation3D"); Storyboard.SetTargetProperty(ani, new PropertyPath("Angle"));
包括camera的移动也是一样,不能直接绑定那个object,需要对Viewport3D的Camera.Position属性进行更改。
Viewport3D viewport = ... Storyboard.SetTarget(ani, view); Storyboard.SetTargetProperty(ani, new PropertyPath("Camera.Position"));