在WPF中要翻转对象,估计是得用三维变换,所以我用到了AxisAngleRotation3D,让图形绕着Z轴来旋转。

先看看效果。

是的,就是这样的效果,在XAML中,由于涉及三维图形,我先做了两个用户控件,作为正面和背面,然后让它旋转。

设计完用户控件后,就在主窗口上放一个Viewport3D控件,这个是必须的,它是三维模型的容器,如果不用就不知道怎么弄出三维图形来了。具体请看下面的XAML:

  1. <Window x:Class="翻转.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="MainWindow" Height="420" Width="650"
  5. xmlns:local="clr-namespace:翻转"
  6. WindowStyle="None"
  7. ResizeMode="NoResize"
  8. AllowsTransparency="True"
  9. Background="Transparent"
  10. WindowStartupLocation="CenterScreen">
  11. <Grid>
  12. <Grid.RowDefinitions>
  13. <RowDefinition Height="*"/>
  14. <RowDefinition Height="auto"/>
  15. </Grid.RowDefinitions>
  16. <Viewport3D Grid.Row="0" Margin="3">
  17. <Viewport3D.Camera>
  18. <PerspectiveCamera Position="0 0 800" LookDirection="0 0 -1" NearPlaneDistance="100"/>
  19. </Viewport3D.Camera>
  20. <Viewport3D.Children>
  21. <ContainerUIElement3D>
  22. <Viewport2DVisual3D>
  23. <Viewport2DVisual3D.Geometry>
  24. <MeshGeometry3D Positions="-200 150 0  -200 -150 0  200 -150 0  200 150 0" TriangleIndices="0 1 2  0 2 3" TextureCoordinates="0 0  0 1  1 1  1 0"/>
  25. </Viewport2DVisual3D.Geometry>
  26. <Viewport2DVisual3D.Material>
  27. <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/>
  28. </Viewport2DVisual3D.Material>
  29. <Viewport2DVisual3D.Visual>
  30. <local:UcSample1 Width="400" Height="300"/>
  31. </Viewport2DVisual3D.Visual>
  32. </Viewport2DVisual3D>
  33. <Viewport2DVisual3D>
  34. <Viewport2DVisual3D.Geometry>
  35. <MeshGeometry3D Positions="200 150 0  200 -150 0  -200 -150 0  -200 150 0" TriangleIndices="0 1 2  0 2 3" TextureCoordinates="0 0  0 1  1 1  1 0"/>
  36. </Viewport2DVisual3D.Geometry>
  37. <Viewport2DVisual3D.Material>
  38. <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/>
  39. </Viewport2DVisual3D.Material>
  40. <Viewport2DVisual3D.Visual>
  41. <local:UcSample2 Width="400" Height="300"/>
  42. </Viewport2DVisual3D.Visual>
  43. </Viewport2DVisual3D>
  44. <!-- 三维变换 -->
  45. <ContainerUIElement3D.Transform>
  46. <RotateTransform3D CenterX="0.5" CenterY="0.5" CenterZ="0.5">
  47. <RotateTransform3D.Rotation>
  48. <AxisAngleRotation3D x:Name="axr" Angle="0" Axis="0 1 0"/>
  49. </RotateTransform3D.Rotation>
  50. </RotateTransform3D>
  51. </ContainerUIElement3D.Transform>
  52. </ContainerUIElement3D>
  53. <ModelVisual3D>
  54. <ModelVisual3D.Content>
  55. <DirectionalLight Color="Transparent"/>
  56. </ModelVisual3D.Content>
  57. </ModelVisual3D>
  58. </Viewport3D.Children>
  59. </Viewport3D>
  60. <StackPanel Grid.Row="1" Margin="0,5,0,6" Orientation="Horizontal" HorizontalAlignment="Center">
  61. <Button Padding="25,5" Content="向前" Click="OnClick"/>
  62. <Button Padding="25,5" Content="向后" Click="OnClick" Margin="12,0,0,0"/>
  63. <Button Padding="25,5" Content="关闭" Click="OnClick" Margin="12,0,0,0"/>
  64. </StackPanel>
  65. </Grid>
  66. </Window>

里面还有几个按钮,我是通过单击按钮来控制动画的,所以,后面还要写必要的处理代码,生成动画。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Data;
  9. using System.Windows.Documents;
  10. using System.Windows.Input;
  11. using System.Windows.Media;
  12. using System.Windows.Media.Imaging;
  13. using System.Windows.Navigation;
  14. using System.Windows.Shapes;
  15. using System.Windows.Media.Media3D;
  16. using System.Windows.Media.Animation;
  17. namespace 翻转
  18. {
  19. /// <summary>
  20. /// MainWindow.xaml 的交互逻辑
  21. /// </summary>
  22. public partial class MainWindow : Window
  23. {
  24. public MainWindow()
  25. {
  26. InitializeComponent();
  27. }
  28. private void OnClick(object sender, RoutedEventArgs e)
  29. {
  30. Button btn = e.OriginalSource as Button;
  31. if (btn != null)
  32. {
  33. string s = btn.Content.ToString();
  34. if (s == "关闭")
  35. {
  36. this.Close();
  37. }
  38. DoubleAnimation da = new DoubleAnimation();
  39. da.Duration = new Duration(TimeSpan.FromSeconds(1));
  40. if (s == "向前")
  41. {
  42. da.To = 0d;
  43. }
  44. else if (s == "向后")
  45. {
  46. da.To = 180d;
  47. }
  48. this.axr.BeginAnimation(AxisAngleRotation3D.AngleProperty, da);
  49. }
  50. }
  51. }
  52. }

当图形绕Z轴转0度,就表示是正面,如果为180度,就转到反面。我们在声明Viewport2DVisual3D.Geometry的坐标模型,即三角型叠加模型,要注意点逆时针方向顺序来定义,如果弄反了,那么图形就跑到模型的背面去了。因此,正面图形和背面图形的点的方向是刚好相反的。

三维的东西不太好解释,所以我稍后把代码上传,以供参考。

WPF翻转动画的更多相关文章

  1. Wpf(Storyboard)动画简单实例

    原文:Wpf(Storyboard)动画简单实例 动画的三种变换方式 RotateTransform:旋转变换变化值:CenterX围绕转的圆心横坐标 CenterY纵坐标 Angle旋转角度(角度正 ...

  2. WPF利用动画实现圆形进度条

    原文:WPF利用动画实现圆形进度条 这是我的第一篇随笔,最近因为工作需要,开始学习WPF相关技术,自己想实现以下圆形进度条的效果,逛了园子发现基本都是很久以前的文章,实现方式一般都是GDI实现的,想到 ...

  3. WPF弹性模拟动画

    原文:WPF弹性模拟动画 我们此次将要制作模拟物理中的弹性现象的交互动画,我们让一个小球向鼠标点击位置移动,这个移动的轨迹不是简单的位移,而是根据胡克定律计算得出的. 胡克定律:F=-kd F代表弹性 ...

  4. WPF控制动画开始、停止、暂停和恢复

    1.闲言 好久也没更新一博客了,自己有点发懒,同时确实这几个月来也有点忙.风机监测软件,项目中,有这样一个小需求:正常风机在旋转的时候,上位机软要做一个风机的图片,让它不停地旋转,一但检测到下面风机停 ...

  5. CSS图片翻转动画技术详解

    因为不断有人问我,现在我补充一下:IE是支持这种技术的!尽管会很麻烦.需要做的是旋转front和back元素,而不是旋转整个容器元素.如果你使用的是最新版的IE,可以忽略这一节.IE10+是支持的,I ...

  6. 两个activity的3D翻转动画.md

    一.业务需求 这里在公司项目设计时,用到了一个小的需求,就是点击一个按钮然后整个activity的页面进行3d翻转; 二.设计思路 由于是2个activity的之间的翻转动画,就意味着前90度是A页面 ...

  7. CSS3图片翻转动画技术详解

    CSS动画非常的有趣:这种技术的美就在于,通过使用很多简单的属性,你能创建出漂亮的消隐效果.其中代表性的一种就是CSS图片翻转效果,能让你看到一张卡片的正反两面上的内容.本文就是要用最简单的方法向大家 ...

  8. 解决web翻转动画闪屏

    首先确保backface-visibility: hidden.这样做可以解决大部分闪屏的情况. 然后需要特别注意的是谷歌的浏览器,不管是桌面端还是移动端,在翻转的过程中在该元素上绘制其他元素也会导致 ...

  9. WPF实现动画的几种方式及其小案例

    WPF实现动画的方式: 基于计时器的动画 建立一个定时器,然后根据其频率循环调用函数或者一个事件处理函数,在这个函数中可以手工更新目标属性,直到达到最终值,这时可以停止计时器. 案例: 效果图: XA ...

随机推荐

  1. AS 学习笔记 加载数据

    AS2 加载本地(外部)数据.swf .png .jpg 等资源使用loadMovie() 加载库里面的mc 用 attachMovie AS3 加载本地(外部)数据 用 Loader 类来完成这个操 ...

  2. CodeForces_#354_Div.2_2016.5.25(A+B+C)

    A 描述:给出一串数,可以互换任意两个数的位置一次,求最大的数和最小的数的最大距离. 分析:找到最大的数和最小的数的位置,求右边的数到左端点的距离和左边的数到右端点的距离. #include < ...

  3. [转] HDU 题目分类

    转载来自:http://www.cppblog.com/acronix/archive/2010/09/24/127536.aspx 分类一: 基础题:1000.1001.1004.1005.1008 ...

  4. apache开源项目--nutch

    Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch的创始人是Doug Cutting,他同时也是Lucene.Hado ...

  5. 【转】 Xcode基本操作 -- 不错

    原文网址:http://blog.csdn.net/phunxm/article/details/17044337 1.Xcode IDE概览 说明:从左到右,依次是“导航窗格(Navigator)- ...

  6. sqliteExpert软件使用(创建数据库和表)

    sqliteExpert是sqlite数据库的可视化操作软件,通过该软件可以进行可视化的创建数据库以及表,免去了复杂的建表语句.首先在下面地址下载该软件http://www.ddooo.com/sof ...

  7. GotFocus和PreviewLeftButtonDown事件

    当TextBox获得焦点后,其中的文字会被全选.通过GotFocus和PreviewLeftButtonDown事件,就可以模拟上述行为. 如果用户只是用键盘操作,GotFocus事件就足够了. 如果 ...

  8. spilt用法简介

    //获取墓位位置 string MWFLMC = "和平区祥和园D组A碑11排"; //得到字符数组 ]; //分割字符数组 sArray1 = MWFLMC.Split(] { ...

  9. 【转】git使用教程

    Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是 ...

  10. SQL Server查询性能优化——创建索引原则(一)

    索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页 就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索 ...