WPF翻转动画

原文:WPF翻转动画

小丫头比较调皮,为了做个东东来哄一下小丫头,我想到了做一个简单的三维翻转动画。在登录QQ 2013 的时候,我看到登录窗口也有类似的动画。

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

先看看效果。

 

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

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

<Window x:Class="Wall3D_wpf.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1"
        Height="500"
        Width="500">
    <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>
                            <Grid>
                                <Grid.Background>
                                    <RadialGradientBrush Center="1,0.2"
                                                         RadiusX="1"
                                                         RadiusY="1"
                                                         SpreadMethod="Reflect">
                                        <GradientStop Color="#FF4FE024"
                                                      Offset="0" />
                                        <GradientStop Color="#FFD3F3CA"
                                                      Offset="1" />
                                        <GradientStop Color="#FFB7FBA4"
                                                      Offset="0.562" />
                                    </RadialGradientBrush>
                                </Grid.Background>
                                <Grid Margin="20">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="80" />
                                        <RowDefinition Height="*" />
                                        <RowDefinition Height="auto" />
                                    </Grid.RowDefinitions>
                                    <TextBlock Text="用户登录"
                                               FontSize="42"
                                               FontFamily="华文行楷"
                                               VerticalAlignment="Center"
                                               HorizontalAlignment="Center" />
                                    <Grid Margin="5"
                                          Grid.Row="1">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="auto" />
                                            <ColumnDefinition Width="*" />
                                        </Grid.ColumnDefinitions>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="auto" />
                                            <RowDefinition Height="auto" />
                                        </Grid.RowDefinitions>
                                        <TextBlock Grid.Column="0"
                                                   Grid.Row="0"
                                                   HorizontalAlignment="Right"
                                                   Text="用户名:"
                                                   FontSize="24"
                                                   VerticalAlignment="Center" />
                                        <TextBox Grid.Column="1"
                                                 Grid.Row="0"
                                                 Margin="3,4,16,4"
                                                 FontSize="24" />
                                        <TextBlock Grid.Column="0"
                                                   Grid.Row="1"
                                                   Text="密码:"
                                                   FontSize="24"
                                                   HorizontalAlignment="Right"
                                                   VerticalAlignment="Center" />
                                        <PasswordBox Grid.Column="1"
                                                     Grid.Row="1"
                                                     Margin="3,4,16,4"
                                                     FontSize="24" />
                                    </Grid>
                                    <Button Content="确  定"
                                            Grid.Row="2"
                                            HorizontalAlignment="Center"
                                            Margin="0,15,0,15"
                                            Width="180"
                                            FontSize="20" />
                                </Grid>
                            </Grid>
                        </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>
                            <Grid>
                                <Grid.Background>
                                    <LinearGradientBrush EndPoint="1,1"
                                                         StartPoint="0,0">
                                        <GradientStop Color="#FF7367E6"
                                                      Offset="0" />
                                        <GradientStop Color="#FF789AF3"
                                                      Offset="1" />
                                        <GradientStop Color="#FFD5CCF7"
                                                      Offset="0.558" />
                                    </LinearGradientBrush>
                                </Grid.Background>
                                <Canvas Margin="20"
                                        SnapsToDevicePixels="True">
                                    <TextBlock Text="连接方式:"
                                               FontSize="22" />
                                    <StackPanel Orientation="Vertical"
                                                Canvas.Top="36">
                                        <RadioButton GroupName="g"
                                                     Content="TCP"
                                                     FontSize="20" />
                                        <RadioButton GroupName="g"
                                                     Content="UDP"
                                                     FontSize="20" />
                                    </StackPanel>
                                    <GroupBox Canvas.Top="120"
                                              Header="设置代理">
                                        <Grid Margin="12">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="auto" />
                                                <ColumnDefinition Width="auto" />
                                            </Grid.ColumnDefinitions>
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="auto" />
                                                <RowDefinition Height="auto" />
                                            </Grid.RowDefinitions>
                                            <TextBlock Grid.Column="0"
                                                       Grid.Row="0"
                                                       Text="IP地址:"
                                                       VerticalAlignment="Center" />
                                            <TextBox Grid.Row="0"
                                                     Grid.Column="1"
                                                     Width="150"
                                                     Margin="5" />
                                            <TextBlock Grid.Column="0"
                                                       Grid.Row="1"
                                                       Text="端口:"
                                                       VerticalAlignment="Center" />
                                            <TextBox Grid.Column="1"
                                                     Grid.Row="1"
                                                     Width="150"
                                                     Margin="5" />
                                        </Grid>
                                    </GroupBox>
                                </Canvas>
                            </Grid>
                        </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.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.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Shapes;

namespace Wall3D_wpf
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            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的坐标模型,即三角型叠加模型,要注意点逆时针方向顺序来定义,如果弄反了,那么图形就跑到模型的背面去了。因此,正面图形和背面图形的点的方向是刚好相反的。

 

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

 下载地址:http://download.csdn.net/detail/tcjiaan/5243065

 

时间: 2024-08-28 20:18:11

WPF翻转动画的相关文章

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(三十二)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(三十二) 雷.混.冰.毒.火.风 - 幻化中的魔法魅力 本节,我将为大家演示如何为游戏中的魔法增加华丽的附加属性. 第一步,定义规则: 1)定义魔法附加属性分类:在本教程示例游戏中,我将魔法附加属性定义为6类:雷.混.冰.毒.火.风,为什么要以这样无规律的方式去命名?因为是教程,我们需要学习的是如何实现对应效果,此6类属性算是目前网游中最流行的六大魔法属性,如果大家都掌握了,无论是中国式5行还是诸如其他的风格设

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十五)

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十五)制作精美的可任意拖放对象的物品栏及装备栏 在通常的网络游戏中,物品.装备.技能.快捷按钮等窗口中的图标都是可以相互拖放的,不同的栏目有着不同的限制,例如技能图标不能拖放到物品栏及装备栏中,且不是所有的魔法技能都可以拖放(如被动技能等):而非装备类的所有物品则无法拖放到角色的装备栏中.那么本节我将向大家讲解如何在本教程示例游戏中添加物品栏及装备栏,并实现它们之间双向物品交换的两种模式:拖放模式和双击模

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十四)

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十四)制作主角属性面板及加点器 游戏中会使用大量的菜单面板,而这些面板往往都带有选项卡.如果用Silverlight工具中的TabControl,则需要通过复杂的xaml重写模板来实现自定义样式,这一点时常让开发者头疼,毕竟界面的东西应该属于美工的范畴,这也是我所发现在目前Silverlight中唯一一处只能通过xaml而无法用代码实现的地方.当然,如果您对此特别感兴趣,同样可以到http://www.c

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十三)

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十三)制作游戏主菜单面板及鼠标左右键快捷技能栏 每款MMORPG都有一个主菜单,通常置于窗口的底部.游戏中主角大部分的设置操作都从这里开启.如人物属性.物品(包裹).技能.任务.队伍.地图.家族.门派.商城.系统设置等等:当然,还包括快捷自定义菜单栏,以及类似<暗黑破坏神>中经典式的左右键快捷技能栏.这些内容在不同的游戏中往往会根据自身的特性稍做调整,但整体上大同小异.本节,我将同样以<剑侠世界&

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十二)

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十二)制作精美的Mini地图② 前面章节中讲解的包括对象头像面板.Mini雷达地图等窗体都是位置固定的,在处理起来方式多样且简单:而RPG.SLG.休闲养成等类型的游戏中往往会大量使用到悬浮且可自由拖动的窗体,比如包裹面板.武器装备面板.个人属性面板.技能面板.系统设置面板等等,这就要求我们必须为游戏量身定做一个通用且易用的ChildWindow控件.那么本节我将为大家讲解如何制作一个包含可拖动头部.关闭

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十一)

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十一)制作精美的Mini地图① 用什么来承受未来几个月日思夜想的折磨?除了学习还是学习. 感慨了一翻,嘿嘿.本节我将为大家讲解如何为Silverlight游戏制作一个精美的Mini地图.Mini地图又分两种,一种是通常处于游戏窗口右上角的Mini雷达(导航)地图:另一种是全景Mini寻路地图.本节我先向大家讲解如何制作导航Mini雷达地图.此类地图在游戏中主要起到导航作用,即引导主角前行的方向,并且呈现出

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十)斜度α地图的构造及算法 在当前的网络游戏中,地图基本都是采取一定斜度的拼装地图,这其中存在两种斜度地图的构造方式: 第一种我称之为伪斜度地图:该类型地图表现层图片为斜度的,但地图基底障碍物等的构造则实为正方形,如下图: 其实最典型的例子就是上一节所演示的内容了,地图是斜的,但是我们却用垂直的障碍物对其进行基底布局,这就是典型的伪斜度地图了. 这样的地图优点在于可以使用简单直接的地图构造算法(上一节中有详细的

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(九)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(九) 2D游戏角色在地图上的移动 本节将运用前两节的知识到实际的2D游戏人物在地图上移动中,同时也算是对前面八节的内容进行一次综合运用吧. 那么先从最底层的地图讲起.首先我将一张地图添加进游戏窗口中,这里我同样使用Image控件: Image Map = new Image(); private void InitMap() { Map.Width = 800; Map.Height = 600; Map.So

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(八)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(八) 完美实现A*寻径动态动画 本节将紧接着上一节,在它的基础上实现鼠标点击动态创建完美的A*寻路动画.(模拟游戏中人物的真实移动,这次可是有障碍物的,可以说基本上完成了人物移动引擎的一半了呢) 首先,在上一节的代码前部分加入一个叫做player的圆形作为我们将要控制的对象(模拟游戏中的主角,下文均称之为"主角"): Ellipse player = new Ellipse(); //用一个圆来模拟目