zoukankan      html  css  js  c++  java
  • WPF实现3D翻转的动画效果

    1、前端代码实现

    1.1 原理见代码注析

     1 <Grid MouseDown="Grid_MouseDown">
     2     <Viewport3D>
     3         <Viewport3D.Camera>
     4             <!-- Position属性指定3D空间中摄像机的位置,LookDirection属性为摄像机方向 -->
     5             <PerspectiveCamera Position="0 0 500" LookDirection="0 0 -1" />
     6         </Viewport3D.Camera>
     7         <Viewport3D.Children>
     8             <ContainerUIElement3D>
     9                 <Viewport2DVisual3D>
    10                     <Viewport2DVisual3D.Geometry>
    11                         <!-- Positions属性表示绘制对象的点集合,TriangleIndices属性表示对象的正反面(WPF通过逆时针环绕表示正面),TextureCoordinates属性表示2D纹理映射到3D对象 -->
    12                         <!-- 一般通过3D建模工具推导得出 -->
    13                         <MeshGeometry3D Positions="-200 200 0  -200 -200 0  200 -200 0  200 200 0" TriangleIndices="0 1 2  0 2 3" TextureCoordinates="0 0  0 1  1 1  1 0"/>
    14                     </Viewport2DVisual3D.Geometry>
    15                     <Viewport2DVisual3D.Material>
    16                         <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/>
    17                     </Viewport2DVisual3D.Material>
    18                     <Viewport2DVisual3D.Visual>
    19                         <!-- 放置正面自定义用户控件 -->
    20                         <Page:Win1 Width="400" Height="400"/>
    21                     </Viewport2DVisual3D.Visual>
    22                 </Viewport2DVisual3D>
    23                 <Viewport2DVisual3D>
    24                     <Viewport2DVisual3D.Geometry>
    25                         <MeshGeometry3D Positions="200 200 0  200 -200 0  -200 -200 0  -200 200 0" TriangleIndices="0 1 2  0 2 3" TextureCoordinates="0 0  0 1  1 1  1 0"/>
    26                     </Viewport2DVisual3D.Geometry>
    27                     <Viewport2DVisual3D.Material>
    28                         <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/>
    29                     </Viewport2DVisual3D.Material>
    30                     <Viewport2DVisual3D.Visual>
    31                         <!-- 放置反面自定义用户控件 -->
    32                         <Page:Win2 Width="400" Height="400"/>
    33                     </Viewport2DVisual3D.Visual>
    34                 </Viewport2DVisual3D>
    35                 <ContainerUIElement3D.Transform>
    36                     <RotateTransform3D>
    37                         <RotateTransform3D.Rotation>
    38                             <!-- 设置旋转轴为对齐坐标系统的Y轴 -->
    39                             <AxisAngleRotation3D x:Name="aar" Angle="0" Axis="0 1 0"/>
    40                         </RotateTransform3D.Rotation>
    41                     </RotateTransform3D>
    42                 </ContainerUIElement3D.Transform>
    43             </ContainerUIElement3D>
    44             <ModelVisual3D>
    45                 <ModelVisual3D.Content>
    46                     <!-- 设置指定方向传播的平行光线填充场景 -->
    47                     <DirectionalLight Color="Transparent"/>
    48                 </ModelVisual3D.Content>
    49             </ModelVisual3D>
    50         </Viewport3D.Children>
    51     </Viewport3D>
    52 </Grid>

    2、后端代码实现

    2.1 通过鼠标单击翻转动画180度显示对象反面,鼠标双击翻转动画0度显示对象正面。

     1 private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
     2 {
     3     DoubleAnimation da = new DoubleAnimation();
     4     da.Duration = new Duration(TimeSpan.FromSeconds(1));
     5     if (e.ClickCount == 2)
     6         da.To = 0d;
     7     else
     8         da.To = 180d;
     9     AxisAngleRotation3D aar = Application.Current.MainWindow.FindName("aar") as AxisAngleRotation3D;
    10     aar.BeginAnimation(AxisAngleRotation3D.AngleProperty, da);  
    11 }

  • 相关阅读:
    8月7号的练习:HDU 1069&&POJ 1636&&HDU 1031&&HDU 1051&&HDU 1551
    8月8号的线段树:HDU 1754&&POJ 3264&&HDU1166
    8月6号的题目:HDU 1003&& POJ 1050&&HDU 1800&&HDU 2036&& POJ 1088(记忆化搜索)
    HDU 1052
    背包问题九讲:
    一个人的旅行 HDU 2066 &&HDU Today HDU 2112
    8月3号的LCS,LIS,LICS:Longest Ordered Subsequence&&Common Subsequence&&Greatest Common Increasing Subsequence
    那些操蛋的搜索题目:逃离迷宫&&哈密顿绕行世界问题
    C语言栈调用机制初探
    linux0.11改进之四 基于内核栈的进程切换
  • 原文地址:https://www.cnblogs.com/softwyy/p/8954538.html
Copyright © 2011-2022 走看看