SilverLight用代码实现对任意控件向4个方向进行3D旋转的类
2010-07-14 17:08
531 查看
转载地址:http://www.cnblogs.com/fanxiaokaitp/archive/2010/05/21/1740532.html
最近在做一个SilverLight项目,两个屏幕面板切换(比如从一个Grid切换到另一个Grid)时需要用到3D旋转的方式,部分文字、按钮切换时也要用到3D旋转的方式,刚开始看到这样需求的时候,自然而然的想到了用storyboard来做动画,于是开始动起手来画,研究了一阵3D旋转的方式,画出了第一个面板的3D左切换方式,但随之而来的问题让人头疼,不光有右、上、下的不同甚至随机的切换方式,还有不同控件、动画速度等需要控制,用动画的方式做出来似乎程序的伸缩很小,也不是太方便,于是有了写一个实现这样功能的类来用的想法,日后如果碰到需要这类功能的需要还可以重复使用。
用了一天来写代码并测试,感觉还算可以,写代码时用了几种Timer来尝试控制动画,包括使用Thread,发现还是用storyboard来做Timer比较合适,没有过多的限制和线程外控件等问题,所以类中的动画主要用了两个storyboard来做Timer,分别控控制一进一出,实现动画则用PlaneProjection类来控制。3D旋转的主要实现方法是对PlaneProjection类的LocalOffsetZ和GlobalOffsetZ属性值进行正确的设置,左右旋转时LocalOffsetZ设置为控件的Widh/2,上下旋转则为Height/2,GlobalOffsetZ设置为相应的负值,也就是GlobalOffsetZ=-LocalOffsetZ,如果不写这句,控件会被拉伸大一截,要加上这一句花了我好长时间在HELP看了老半天,其次就是RotationX和RotationY的角度设置问题,弄清楚后就基本可以写完成了。
找到了个可以上传XAP在线演示的地方,大家可以先看看在线演示,地址: http://www.bbniu.com/matrix/ShowApplication.aspx?id=122
下面是类代码,大家可以把类引用到工程里或者是编译成DLL引用,后面还写了一个基本的应用例子:
应用图例:
MainPage.xaml.cs代码
以上是类和应用代码。
最近在做一个SilverLight项目,两个屏幕面板切换(比如从一个Grid切换到另一个Grid)时需要用到3D旋转的方式,部分文字、按钮切换时也要用到3D旋转的方式,刚开始看到这样需求的时候,自然而然的想到了用storyboard来做动画,于是开始动起手来画,研究了一阵3D旋转的方式,画出了第一个面板的3D左切换方式,但随之而来的问题让人头疼,不光有右、上、下的不同甚至随机的切换方式,还有不同控件、动画速度等需要控制,用动画的方式做出来似乎程序的伸缩很小,也不是太方便,于是有了写一个实现这样功能的类来用的想法,日后如果碰到需要这类功能的需要还可以重复使用。
用了一天来写代码并测试,感觉还算可以,写代码时用了几种Timer来尝试控制动画,包括使用Thread,发现还是用storyboard来做Timer比较合适,没有过多的限制和线程外控件等问题,所以类中的动画主要用了两个storyboard来做Timer,分别控控制一进一出,实现动画则用PlaneProjection类来控制。3D旋转的主要实现方法是对PlaneProjection类的LocalOffsetZ和GlobalOffsetZ属性值进行正确的设置,左右旋转时LocalOffsetZ设置为控件的Widh/2,上下旋转则为Height/2,GlobalOffsetZ设置为相应的负值,也就是GlobalOffsetZ=-LocalOffsetZ,如果不写这句,控件会被拉伸大一截,要加上这一句花了我好长时间在HELP看了老半天,其次就是RotationX和RotationY的角度设置问题,弄清楚后就基本可以写完成了。
找到了个可以上传XAP在线演示的地方,大家可以先看看在线演示,地址: http://www.bbniu.com/matrix/ShowApplication.aspx?id=122
下面是类代码,大家可以把类引用到工程里或者是编译成DLL引用,后面还写了一个基本的应用例子:
应用图例:
MainPage.xaml.cs代码
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using c3dplane; namespace _3dPlaneTest { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); PlaneProjection pp = new PlaneProjection(); pp.RotationY = 90; gridUp.Projection = pp; gridDown.Projection = pp; gridLeft.Projection = pp; gridCur = gridRight; } private cShow3DPlane c3d=new cShow3DPlane(); private Grid gridCur=new Grid(); private void btnUp_Click(object sender, RoutedEventArgs e) { if (gridCur ==gridUp ) { MessageBox.Show("现在已经是 上 了"); return; } if (c3d.MoveOver()) { c3d.SetInOutPlane(gridUp, gridCur, enumDirection.Up); gridCur = gridUp; c3d.Begin(); } } private void btnRight_Click(object sender, RoutedEventArgs e) { if (gridCur == gridRight) { MessageBox.Show("现在已经是 右 了"); return; } if (c3d.MoveOver()) { c3d.SetInOutPlane(gridRight, gridCur, enumDirection.Right); gridCur = gridRight; c3d.Begin(); } } private void btnLeft_Click(object sender, RoutedEventArgs e) { if (gridCur == gridLeft) { MessageBox.Show("现在已经是 左 了"); return; } if (c3d.MoveOver()) { c3d.SetInOutPlane(gridLeft, gridCur, enumDirection.Left); gridCur = gridLeft; c3d.Begin(); } } private void btnDown_Click(object sender, RoutedEventArgs e) { if (gridCur == gridDown) { MessageBox.Show("现在已经是 下 了"); return; } if (c3d.MoveOver()) { c3d.SetInOutPlane(gridDown, gridCur, enumDirection.Down); gridCur = gridDown; c3d.Begin(); } } private void btnTest2_Click(object sender, RoutedEventArgs e) { if (c3d.MoveOver()) { c3d.SetInOutPlane(btnTest1, btnTest2, enumDirection.Left); c3d.Begin(); } } private void btnTest1_Click(object sender, RoutedEventArgs e) { if (c3d.MoveOver()) { c3d.SetInOutPlane(btnTest2, btnTest1, enumDirection.Right); c3d.Begin(); } } private void btnTest3_Click(object sender, RoutedEventArgs e) { if (c3d.MoveOver()) { c3d.SetInOutPlane(btnTest4, btnTest3, enumDirection.Up); c3d.Begin(); } } private void btnTest4_Click(object sender, RoutedEventArgs e) { if (c3d.MoveOver()) { c3d.SetInOutPlane(btnTest3, btnTest4, enumDirection.Down); c3d.Begin(); } } } }
以上是类和应用代码。
相关文章推荐
- 【转】Silverlight用代码实现对任意控件向4个方向进行3D旋转
- SilverLight用代码实现对任意控件向4个方向进行3D旋转的类
- globe和scene控件中使用鼠标中键进行缩放的实现代码
- SilverLight使用C#代码实现3D透视效果
- Silverlight表单控件实现自动属性编辑代码讲解
- opencv实现图像任意角度旋转的算法解析及代码实现
- Android使用Rotate3dAnimation实现3D旋转动画效果的实例代码
- 【原创】Silverlight DataGrid对核心控件DataGrid的任意单元格进行获取和设置分析。
- 数量积 向量的点积 即3D中任意两个三维向量的点积(数量积)推导及代码实现
- 3d数学基础-欧拉角转换与旋转矩阵或旋转矩阵转换成欧拉角-用C++代码实现
- javassist实现对类的任意方法进行代码增强
- vitamio videoView 用隐藏除videoview的控件,并旋转屏幕方向实现的全屏功能,出现的画面不能填充满videoview(画面不完整)
- 请教方法和例子:VS2003的datagrid控件,如何实现用鼠标拖动的方法选中任意区域的多个单元格,然后进行统一编辑??
- JS实现3D图片旋转展示效果代码
- 3d(三维)验证码实现(部分代码来自网络),旋转未完成,有待改进(一)
- OpenGL实现3D模型自由旋转——之代码解析
- 通过旋转候选框实现任意方向的场景文本检测
- 手把手教你使用Silverlight实现3D场景二(创建自定义模版控件为物件应用3D动画)
- 三维世界里的坐标和变换,逆方向旋转移动三维世界的方式来实现3D漫游
- 3d(三维)验证码实现(部分代码来自网络),旋转未完成,有待改进(二)