原文: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. 最优化WPF 3D性能(基于“Tier-2”硬件)

    原文:最优化WPF 3D性能(基于"Tier-2"硬件) 原文地址:Maximizing WPF 3D Performance on Tier-2 Hardware 开发人员在应用 ...

  3. WPF 3D 平移模型+动画(桥梁检测系统)

    原文:WPF 3D 平移模型+动画(桥梁检测系统) 关于WPF 3D,网上有很多旋转的例子,但是关于平移的例子并不是太多.本文并非WPF 3D扫盲篇,因此需要对WPF 3D有一定了解,至少知道View ...

  4. WPF 3D 知识点大全以及实例

    引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当 ...

  5. WPF 3D编程介绍

    原文:WPF 3D编程介绍 上一篇文章简单的介绍了WPF编程的相关的内容,也推荐了本书.今天要来讲一下在WPF如何开展3D编程. 使用的xmal 和C#开发的时候:需要使用如下的关键要素: 1:摄像机 ...

  6. WPF 3D 小小小小引擎 - ·WPF 3D变换应用

    原文:WPF 3D 小小小小引擎 - ·WPF 3D变换应用 WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开 ...

  7. WPF 3D变换应用

    WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开发效率高,而且也容易上手. 下面给大家演示的是使用在WPF 3 ...

  8. WPF 3D 获取鼠标在场景的3d坐标

    原文:WPF 3D 获取鼠标在场景的3d坐标 上一篇中我们谈到了WPF 3d做图的一些简单原理,这里我们简单介绍一下怎样获得鼠标在场景中的3d坐标,知道了3d坐标就可以进行很多操作了: 首先介绍一下3 ...

  9. WPF 3D球及进阶玩法

    在WPF中3D球的构建算法请参考: https://www.cnblogs.com/lonelyxmas/p/9844951.html 好玩以及值得借鉴的Demo:   (CSDN下载需要积分,避免你 ...

随机推荐

  1. hdu 4034 Graph

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4034 题目分类:图论 题意:n个顶点,然后给出从i到j的最短路径长度,求至少需要哪些边 第二组样例 第 ...

  2. win7+vs2008+opencv

    1.下载安装VS2008,然后直接下载opencv的windows的安装版, 2.把opencv解压出来,我的路径为:D:\Program\opencv 3.配置PATH:电脑--属性--高级系统设置 ...

  3. 深刻:截获windows的消息并分析实例(DefWindowProc),以WM_NCHITTEST举例(Windows下每一个鼠标消息都是由 WM_NCHITTEST 消息产生的,这个消息的参数包含了鼠标位置的信息)

    1,回调函数工作机制 回调函数由操作系统自动调用,回调函数的返回值当然也是返回给操作系统了. 2,截获操作系统发出的消息,截获到后,将另外一个消息返回给操作系统,已达到欺骗操作系统的目的. 下面还是以 ...

  4. POJ2828 Buy Tickets 【线段树】+【单点更新】+【逆序】

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 12296   Accepted: 6071 Desc ...

  5. 浅谈 PHP 变量可用字符

    原文:浅谈 PHP 变量可用字符 先来说说php变量的命名规则,百度下一抓一大把:(1) PHP的变量名区分大小写;(2) 变量名必须以美元符号$开始;(3) 变量名开头可以以下划线开始;(4) 变量 ...

  6. HDU 3277Marriage Match III(二分+并查集+拆点+网络流之最大流)

    题目地址:HDU 3277 这题跟这题的上一版建图方法差点儿相同,仅仅只是须要拆点.这个点拆的也非常巧妙,既限制了流量,还仅仅限制了一部分,曾经一直以为拆点会所有限制,原来也能够用来分开限制,学习了. ...

  7. Java---25---集合框架共性方法

    集合类 为什么会出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便对较多个对象的操作,就对对象进行存储,集合就是存储对象最经常使用的一种方式 数组和集合类同一时候容器,有何不同? 数组 ...

  8. Filter技术+职责链模式

    Filter是一个过滤器,存在Webclient与请求的资源之间.这里的资源能够说是jsp或servlet.它的作用就是在请求达到资源之前,先对请求进行预处理.而且也能够对servlet处理后的res ...

  9. Factorization Machines 学习笔记(四)学习算法

      近期学习了一种叫做 Factorization Machines(简称 FM)的算法.它可对随意的实值向量进行预測.其主要长处包含: 1) 可用于高度稀疏数据场景:2) 具有线性的计算复杂度.本文 ...

  10. Android笔记之网络-基本了解

    1.3个相关API接口 Android网络编程相关的API接口与相关用途例如以下图 2. 2种网络架构模式 B/S----浏览器/server端模式,通过应用层的HTTP协议通信,不须要特定clien ...