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"));
本文基于 署名 2.5 中国大陆 许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 hackerzhou 并包含 原文链接
本文暂时还没有评论,你可以抢沙发哟。

发表评论