原文:WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体

运行结果:

事实上很简单,定义好一个正方体,处理好纹理。关于MeshGeometry3D的正确定义和纹理这里就不多讲了,可以参考我以前写过的一些文章:

WPF 3D: MeshGeometry3D纹理坐标的正确定义

WPF 3D:MeshGeometry3D的定义和光照

接下来就是怎样让它动起来。我们通过3D点动画来改变照相机(Camera类型)的位置(Position属性)从而使正方体动起来(这样的话实际上正方体没动,而是照相机在动)。由于正方体是水平旋转的,那么Y轴可以忽略,参考下面整个3D图形的俯视图,动画是这样进行的:

我们的照相机初始时放置在Z轴(0,0,5)的位置,如下图:

所以旋转照相机只需要把Position属性调整到相应的点就可以,分别是0,0,5 5,0,0 0,0,-5 –5,0,0 ,如下代码:

<Point3DAnimationUsingKeyFrames Storyboard.TargetProperty="Position"

Storyboard.TargetName="camera">

<LinearPoint3DKeyFrame KeyTime="0:0:1" Value="5 0 0"/>

<LinearPoint3DKeyFrame KeyTime="0:0:2" Value="0 0 -5"/>

<LinearPoint3DKeyFrame KeyTime="0:0:3" Value="-5 0 0"/>

<LinearPoint3DKeyFrame KeyTime="0:0:4" Value="0 0 5"/>

</Point3DAnimationUsingKeyFrames>

注意上面使用的是Point3DAnimation类型。接下来需要注意的,我们还需要调整照相机的方向(Camera类型的LookDirection属性),否则照相机还会保持原方向。这个属性类型是3D向量,所以需要用Vector3DAnimation类型,调整向量也很简单,只需要根据照相机的移动点把方向调整到中心点。

如下代码:

<Vector3DAnimationUsingKeyFrames Storyboard.TargetProperty="LookDirection"

Storyboard.TargetName="camera">

<LinearVector3DKeyFrame KeyTime="0:0:1" Value="-1 0 0"/>

<LinearVector3DKeyFrame KeyTime="0:0:2" Value="0 0 1"/>

<LinearVector3DKeyFrame KeyTime="0:0:3" Value="1 0 0"/>

<LinearVector3DKeyFrame KeyTime="0:0:4" Value="0 0 -1"/>

</Vector3DAnimationUsingKeyFrames>

当运行动画时,你会发现等方块背面转过来后,它还保持这暗色,原因是整个光照没有被旋转。因此最好把光照再旋转一下就趋近完美了,在动画中再调节DirectionalLight的Direction属性就可以了,这个也是Vector3D类型。

下面是完整的XAML代码:

<Viewport3D>

<Viewport3D.Triggers>

<EventTrigger RoutedEvent="Loaded">

<BeginStoryboard>

<Storyboard RepeatBehavior="Forever">

<Point3DAnimationUsingKeyFrames Storyboard.TargetProperty="Position"

Storyboard.TargetName="camera">

<LinearPoint3DKeyFrame KeyTime="0:0:1" Value="5 0 0"/>

<LinearPoint3DKeyFrame KeyTime="0:0:2" Value="0 0 -5"/>

<LinearPoint3DKeyFrame KeyTime="0:0:3" Value="-5 0 0"/>

<LinearPoint3DKeyFrame KeyTime="0:0:4" Value="0 0 5"/>

</Point3DAnimationUsingKeyFrames>

<Vector3DAnimationUsingKeyFrames Storyboard.TargetProperty="LookDirection"

Storyboard.TargetName="camera">

<LinearVector3DKeyFrame KeyTime="0:0:1" Value="-1 0 0"/>

<LinearVector3DKeyFrame KeyTime="0:0:2" Value="0 0 1"/>

<LinearVector3DKeyFrame KeyTime="0:0:3" Value="1 0 0"/>

<LinearVector3DKeyFrame KeyTime="0:0:4" Value="0 0 -1"/>

</Vector3DAnimationUsingKeyFrames>

<Vector3DAnimationUsingKeyFrames Storyboard.TargetProperty="Direction"

Storyboard.TargetName="light">

<LinearVector3DKeyFrame KeyTime="0:0:1" Value="-1 0 0"/>

<LinearVector3DKeyFrame KeyTime="0:0:2" Value="0 0 1"/>

<LinearVector3DKeyFrame KeyTime="0:0:3" Value="1 0 0"/>

<LinearVector3DKeyFrame KeyTime="0:0:4" Value="0 0 -1"/>

</Vector3DAnimationUsingKeyFrames>

</Storyboard>

</BeginStoryboard>

</EventTrigger>

</Viewport3D.Triggers>

<Viewport3D.Camera>

<PerspectiveCamera x:Name="camera" Position="0 0 5" LookDirection="0 0 -1"FieldOfView="60"/>

</Viewport3D.Camera>

<ModelVisual3D>

<ModelVisual3D.Content>

<Model3DGroup>

<DirectionalLight Direction="0 0 -1"

x:Name="light"

Color="White"/>

<GeometryModel3D>

<GeometryModel3D.Geometry>

<MeshGeometry3D Positions="-1 1 1, 1 1 1, -1 -1 1, 1 -1 1, -1 1 -1, 1 1 -1, -1 -1 -1, 1 -1 -1

1 1 1, 1 1 -1, 1 -1 1, 1 -1 -1, -1 1 1, -1 1 -1, -1 -1 1, -1 -1 -1

-1 1 1, -1 1 -1, 1 1 1, 1 1 -1, -1 -1 1, -1 -1 -1, 1 -1 1, 1 -1 -1"

TriangleIndices="0 2 1, 1 2 3, 5 6 4, 5 7 6

8 10 9, 9 10 11, 13 14 12, 13 15 14

16 18 17, 17 18 19, 22 21 20, 22 23 21"

TextureCoordinates="0 0, 1 0, 0 1, 1 1,

0 0, 1 0, 0 1, 1 1,

0 0, 1 0, 0 1, 1 1,

0 0, 1 0, 0 1, 1 1,

0 0, 1 0, 0 1, 1 1,

0 0, 1 0, 0 1, 1 1" />

</GeometryModel3D.Geometry>

<GeometryModel3D.Material>

<DiffuseMaterial>

<DiffuseMaterial.Brush>

<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">

<GradientStop Color="YellowGreen" Offset="0"/>

<GradientStop Color="Green" Offset="1"/>

</LinearGradientBrush>

</DiffuseMaterial.Brush>

</DiffuseMaterial>

</GeometryModel3D.Material>

</GeometryModel3D>

</Model3DGroup>

</ModelVisual3D.Content>

</ModelVisual3D>

</Viewport3D>

WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体相关推荐

  1. WPF 3D中多个模型如何设置某一个在最前?

    原文:WPF 3D中多个模型如何设置某一个在最前? 问题:我们的模型包括导入的3D solid模型和axis坐标轴模型,当模型旋转的时候,3D会将axis挡住. 期望:axis一直在最前面,不会被3D ...

  2. html特效 wpf,利用WPF实现一个简单的文字粒子闪烁动画特效

    利用WPF实现一个简单的文字粒子闪烁动画特效 发布时间:2020-11-06 16:04:19 来源:亿速云 阅读:124 作者:Leah 本篇文章给大家分享的是有关利用WPF实现一个简单的文字粒子闪 ...

  3. WPF异步载入图片,附带载入中动画

    WPF异步载入图片,附带载入中动画 原文:WPF异步载入图片,附带载入中动画 WPF异步载入图片,附带载入中动画 最近,在做一个WPF项目.项目中有一个需求,就是以列表的方式显示出项目图片.这些图片有 ...

  4. WPF 3D:使用GeometryModel3D的BackMaterial

    WPF 3D:使用GeometryModel3D的BackMaterial 原文 WPF 3D:使用GeometryModel3D的BackMaterial 使用BackMaterial,我们可以定义 ...

  5. 3D游戏导论七 · 模型与动画

    3D游戏导论七 · 模型与动画 本次的作业我们需要制作一个简易的巡逻兵项目. 文章目录 3D游戏导论七 · 模型与动画 一.作业要求 二.具体实现 1.概念解释 2.项目详解 三.最终结果 一.作业要 ...

  6. DirectX3D游戏制作之---3D场景的渲染及人物动画的显示

    前言: 无所谓好或不好,人生一场虚空大梦,韶华白首,不够转瞬. ----慕容紫英<仙剑奇侠传四> PS:为了方便大家阅读,个人认为比较重要的内容-------红色字体显示 个人认为可以了解 ...

  7. WPF 3D开发教程(一)

    一.3D基础知识 1.1 坐标系 我们知道,在2D平面绘图时,WPF使用的坐标系(其实计算机上的图形处理一般都是这样)是以屏幕左上角为原点,向右为x轴正方向,向下为y轴正方向.而WPF的3D坐标系,取 ...

  8. 第八章 DirectX 3D模型加载和骨骼动画(下)

    接下来,我们介绍一些骨骼动画.我们之前大致讲过骨骼动画,存储骨骼动画的网格文件要比普通的文件复杂一下.主要是增加了骨骼信息,蒙皮信息以及动画帧信息.骨骼动画的实现原理是仿照人体运动学,将3D模型由一种 ...

  9. python和java的格斗动画_Unity3D一个简单的对打游戏

    我发现没有动画想做什么都不行噢~~~,这个动画还是一个大侠给我的,网上找了很多bip动作文件,但是转成FBX格式不行,好像是版本不一样的缘故.后来为了做进度条我之前学了一下EZGUI,但是没有得到想要 ...

  10. WPF随笔(九)--使用路径动画模拟管道流体流向

    WPF的一大特性就的动画系统,使用动画能够实现很多在WinForm很难实现的效果.最近在网上偶然看到大神用WPF动画实现对象沿特定路径正向或反向移动的效果,就想参考着自己试一试. 1.简单路径动画 先 ...

最新文章

  1. 加速针对COVID-19的医疗器械开发
  2. ODBC、OLE连接各种数据库的连接字符串
  3. Linux安装python3.6
  4. oracle的乐观锁和悲观锁
  5. 人工智能时代,企业的未来离不开云专线
  6. gitlab 如何关闭force push
  7. python网络爬虫系列(0)——爬虫概述 http协议复习
  8. 洛谷P1725琪露诺【单调队列+dp】
  9. 《天天数学》连载14:一月十四日
  10. 2021年专接本计算机院校,2021年专接本各类招生院校汇总
  11. Cere Network将在DAOMaker平台启动首次种子私募轮社区融资
  12. 留给华为、小米、OPPO 们的时间不多了!
  13. 苹果Ma视频剪辑软件:DaVinci Resolve Studio (达芬奇调色)
  14. MySQL中round函数
  15. 计算机网卡的安装过程,千兆网卡怎么装_千兆网卡安装步骤
  16. 工字型钢弹性截面模量计算公式_截面模量计算方法
  17. Kubernetes网络自学系列 | 千呼万唤始出来:veth pair
  18. 单片机中code、data、idata、xdata等关键字意思
  19. 挂载NFS的两种方法
  20. Python生成正则测试数据

热门文章

  1. javascript_php 正则匹配 转
  2. Nagios监控Linux主机
  3. linux内核虚拟内存之高端物理内存与非连续内存分配
  4. Linux电源管理-Operating Performance Points(OPP)
  5. 深度剖析MQTT协议的整个通信流程
  6. [Android] 查看MTD,EMMC,MMC三种设备的分区
  7. Android 网络评分机制
  8. Linux内核部件分析 记录生命周期的kref
  9. HihoCoder-1523(思维)
  10. MapReduce 1.x VS 2.x架构对比