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

是的,就是这样的效果,在XAML中,由于涉及三维图形,我先做了两个用户控件,作为正面和背面,然后让它旋转。
设计完用户控件后,就在主窗口上放一个Viewport3D控件,这个是必须的,它是三维模型的容器,如果不用就不知道怎么弄出三维图形来了。具体请看下面的XAML:
- <Window x:Class="翻转.MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="MainWindow" Height="420" Width="650"
- xmlns:local="clr-namespace:翻转"
- WindowStyle="None"
- ResizeMode="NoResize"
- AllowsTransparency="True"
- Background="Transparent"
- WindowStartupLocation="CenterScreen">
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="*"/>
- <RowDefinition Height="auto"/>
- </Grid.RowDefinitions>
- <Viewport3D Grid.Row="0" Margin="3">
- <Viewport3D.Camera>
- <PerspectiveCamera Position="0 0 800" LookDirection="0 0 -1" NearPlaneDistance="100"/>
- </Viewport3D.Camera>
- <Viewport3D.Children>
- <ContainerUIElement3D>
- <Viewport2DVisual3D>
- <Viewport2DVisual3D.Geometry>
- <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"/>
- </Viewport2DVisual3D.Geometry>
- <Viewport2DVisual3D.Material>
- <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/>
- </Viewport2DVisual3D.Material>
- <Viewport2DVisual3D.Visual>
- <local:UcSample1 Width="400" Height="300"/>
- </Viewport2DVisual3D.Visual>
- </Viewport2DVisual3D>
- <Viewport2DVisual3D>
- <Viewport2DVisual3D.Geometry>
- <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"/>
- </Viewport2DVisual3D.Geometry>
- <Viewport2DVisual3D.Material>
- <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/>
- </Viewport2DVisual3D.Material>
- <Viewport2DVisual3D.Visual>
- <local:UcSample2 Width="400" Height="300"/>
- </Viewport2DVisual3D.Visual>
- </Viewport2DVisual3D>
- <!-- 三维变换 -->
- <ContainerUIElement3D.Transform>
- <RotateTransform3D CenterX="0.5" CenterY="0.5" CenterZ="0.5">
- <RotateTransform3D.Rotation>
- <AxisAngleRotation3D x:Name="axr" Angle="0" Axis="0 1 0"/>
- </RotateTransform3D.Rotation>
- </RotateTransform3D>
- </ContainerUIElement3D.Transform>
- </ContainerUIElement3D>
- <ModelVisual3D>
- <ModelVisual3D.Content>
- <DirectionalLight Color="Transparent"/>
- </ModelVisual3D.Content>
- </ModelVisual3D>
- </Viewport3D.Children>
- </Viewport3D>
- <StackPanel Grid.Row="1" Margin="0,5,0,6" Orientation="Horizontal" HorizontalAlignment="Center">
- <Button Padding="25,5" Content="向前" Click="OnClick"/>
- <Button Padding="25,5" Content="向后" Click="OnClick" Margin="12,0,0,0"/>
- <Button Padding="25,5" Content="关闭" Click="OnClick" Margin="12,0,0,0"/>
- </StackPanel>
- </Grid>
- </Window>
里面还有几个按钮,我是通过单击按钮来控制动画的,所以,后面还要写必要的处理代码,生成动画。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
- using System.Windows.Media.Media3D;
- using System.Windows.Media.Animation;
- namespace 翻转
- {
- /// <summary>
- /// MainWindow.xaml 的交互逻辑
- /// </summary>
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- }
- private void OnClick(object sender, RoutedEventArgs e)
- {
- Button btn = e.OriginalSource as Button;
- if (btn != null)
- {
- string s = btn.Content.ToString();
- if (s == "关闭")
- {
- this.Close();
- }
- DoubleAnimation da = new DoubleAnimation();
- da.Duration = new Duration(TimeSpan.FromSeconds(1));
- if (s == "向前")
- {
- da.To = 0d;
- }
- else if (s == "向后")
- {
- da.To = 180d;
- }
- this.axr.BeginAnimation(AxisAngleRotation3D.AngleProperty, da);
- }
- }
- }
- }
当图形绕Z轴转0度,就表示是正面,如果为180度,就转到反面。我们在声明Viewport2DVisual3D.Geometry的坐标模型,即三角型叠加模型,要注意点逆时针方向顺序来定义,如果弄反了,那么图形就跑到模型的背面去了。因此,正面图形和背面图形的点的方向是刚好相反的。
三维的东西不太好解释,所以我稍后把代码上传,以供参考。
WPF翻转动画的更多相关文章
- Wpf(Storyboard)动画简单实例
原文:Wpf(Storyboard)动画简单实例 动画的三种变换方式 RotateTransform:旋转变换变化值:CenterX围绕转的圆心横坐标 CenterY纵坐标 Angle旋转角度(角度正 ...
- WPF利用动画实现圆形进度条
原文:WPF利用动画实现圆形进度条 这是我的第一篇随笔,最近因为工作需要,开始学习WPF相关技术,自己想实现以下圆形进度条的效果,逛了园子发现基本都是很久以前的文章,实现方式一般都是GDI实现的,想到 ...
- WPF弹性模拟动画
原文:WPF弹性模拟动画 我们此次将要制作模拟物理中的弹性现象的交互动画,我们让一个小球向鼠标点击位置移动,这个移动的轨迹不是简单的位移,而是根据胡克定律计算得出的. 胡克定律:F=-kd F代表弹性 ...
- WPF控制动画开始、停止、暂停和恢复
1.闲言 好久也没更新一博客了,自己有点发懒,同时确实这几个月来也有点忙.风机监测软件,项目中,有这样一个小需求:正常风机在旋转的时候,上位机软要做一个风机的图片,让它不停地旋转,一但检测到下面风机停 ...
- CSS图片翻转动画技术详解
因为不断有人问我,现在我补充一下:IE是支持这种技术的!尽管会很麻烦.需要做的是旋转front和back元素,而不是旋转整个容器元素.如果你使用的是最新版的IE,可以忽略这一节.IE10+是支持的,I ...
- 两个activity的3D翻转动画.md
一.业务需求 这里在公司项目设计时,用到了一个小的需求,就是点击一个按钮然后整个activity的页面进行3d翻转; 二.设计思路 由于是2个activity的之间的翻转动画,就意味着前90度是A页面 ...
- CSS3图片翻转动画技术详解
CSS动画非常的有趣:这种技术的美就在于,通过使用很多简单的属性,你能创建出漂亮的消隐效果.其中代表性的一种就是CSS图片翻转效果,能让你看到一张卡片的正反两面上的内容.本文就是要用最简单的方法向大家 ...
- 解决web翻转动画闪屏
首先确保backface-visibility: hidden.这样做可以解决大部分闪屏的情况. 然后需要特别注意的是谷歌的浏览器,不管是桌面端还是移动端,在翻转的过程中在该元素上绘制其他元素也会导致 ...
- WPF实现动画的几种方式及其小案例
WPF实现动画的方式: 基于计时器的动画 建立一个定时器,然后根据其频率循环调用函数或者一个事件处理函数,在这个函数中可以手工更新目标属性,直到达到最终值,这时可以停止计时器. 案例: 效果图: XA ...
随机推荐
- 转自 void- man 差分约束系统详解
一直不知道差分约束是什么类型题目,最近在写最短路问题就顺带看了下,原来就是给出一些形如x-y<=b不等式的约束,问你是否满足有解的问题 好神奇的是这类问题竟然可以转换成图论里的最短路径问题,下面 ...
- C#用xpath查找某节点
C#用xpath查找某节点 从根节点一直下来的相对路径才能确定Xpath的写法. /root/<节点1>/<节点2>//<@属性> Xpath是功能很强大的,但是也 ...
- vs2010 和 svn的结合运用,svn的安装
转自:http://www.cnblogs.com/joeylee/archive/2012/10/08/2715142.html 1:svn的安装,如何在vs2010里面添加 svn的插件呢? 在这 ...
- NOIP 2015 子串
借鉴大神思路... #include<cstdio> #include<cstring> #include<cstdlib> #include<iostrea ...
- 可在Azure上运行.NET的SDK
本节包含前几个版本的 for .NET 的发行说明.有关早期版本的详细信息,请参阅早期版本:Azure SDK for .NET.有关 SDK 支持和停用的信息,请参阅 Azure SDK for . ...
- 从打车软件你能想到多少?盈利模式?商机?大数据?移动互联网蛋糕?生活方式改变withApp?
物联网.云服务.大数据.. 淘宝.12306.卡通...一个产品改变一次生活方式. 打车app,无疑是改变生活方式的又一个产品.从打车软件,你能看到什么? 个人认为,打车软件值得各种投资方斥资,最重要 ...
- Linear Regreesion
3.似然函数:我是这么理解的,比如说我们知道某个X的概率分布密度函数,但是这个概率分布有未知的参数,但是我想得到这个未知的参数θ,然后我们就通过很多个已知的变量,把这些概率分布密度函数乘起来,这 ...
- HW5.7
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- Sitemap Editors for Dynamics CRM 2013
I’ve started using a couple of different sitemap editors in my projects for CRM 2013. These tools he ...
- CodeForces 352D. Jeff and Furik
题意:给n个数,第一个人选取相邻两个递降的数交换顺序,第二个人一半的概率选取相邻两个递降的数交换顺序,一半的概率选取相邻两个递增的数交换顺序.两个人轮流操作,求整个数列变成递增数列所需交换次数的期望. ...