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

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

关于WPF 3D,网上有很多旋转的例子,但是关于平移的例子并不是太多。本文并非WPF 3D扫盲篇,因此需要对WPF 3D有一定了解,至少知道Viewport, PerspectiveCamera, ModelVisual3D等数据结构。需要了解WPF 3D的基础知识,可以参考MSDN:?http://msdn.microsoft.com/zh-cn/library/ms747437.aspx

?

1. 摄像机平移OR物体平移:

WPF场景主要是由这两部分构成的:摄像机,物体。可以想象一下,自己拿着台摄像机正对着某个物体进行拍摄。

那么当发生平移的时候有两种方法,第一种是将摄像机平移;第二种是将物体平移。相对来说,摄像机平移实现较复杂,效率较高;物体平移效率较低,实现简单。

本文实现的是物体平移,如果希望做摄像机平移的朋友可以不往下读了。

?

2. 在本项目中平移的操作流程:?

1. 程序启动时可以看到整个3D场景,类似一个沙盘,此时旋转等操作会围绕沙盘中心;

2. 双击沙盘某个地方,将沙盘中心移动到双击的地方,此时旋转等操作会围绕新的沙盘中心。

?

3. 平移的算法:

1.获取双击屏幕后鼠标在3D中相对应的点,主要利用了射线和3D碰撞的一个原理。代码上主要应用的就是VisualTreeHelper.HitTest函数,它会将结果传入一个回调函数中,我们这里是HTResultCenter.

void BridgeVisual_MouseDoubleClick(object sender, MouseButtonEventArgs args)

{??

? ? ?Point?mouseposition?=?args.GetPosition(ViewPort);

? ?MoveCenter(mouseposition);

}

?

?public void MoveCenter(Point mouseposition)

?{

? ? ? PointHitTestParameters pointparams = new PointHitTestParameters(mouseposition);

? ? ? VisualTreeHelper.HitTest(ViewPort, null, HTResultCenter, pointparams);

?}?

?

?private HitTestResultBehavior HTResultCenter(HitTestResult result)

?{

? ? ? RayHitTestResult rayResult = result as RayHitTestResult;

? ? ? if (rayResult != null)

? ? ? {

? ? ? ? ? ?//这就是鼠标点击后在3D中的坐标

? ? ? ? ? ?var hitPoint = rayResult.PointHit;

? ? ? ? ? ?...

? ? ? }

?}?

?

2.根据相机位置 + 相机的投射方向 = 获取相机在3D上投影的点,camera.Postion就是摄像机在3D世界中的位置了,camera.LookDirection就是摄像机看的方向。那么两者加起来就可以获取这个摄像机投射过后的位置了。?

?

??////相机位置
??var?cameraPostion?= Camera.Position;

???????????????

??////相机看的方向
??var?lookDirection?= Camera.LookDirection;

??///?获取相机在3D投影的点?

??var?x?=?cameraPostion.X?+?lookDirection.X;

??var?y?=?cameraPostion.Y?+?lookDirection.Y;

??var?z?=?cameraPostion.Z?+?lookDirection.Z;

?

?

3. 那么利用摄像机投射的位置 - 鼠标双击的位置就可以获取物体应该偏移的量了,WPF中本来就有Transform3D?这个东西进行平移,

此处应用了动画DoubleAnimation,所以代码有点多。

DoubleAnimation?doubleAnimationX?=?new?DoubleAnimation();

doubleAnimationX.BeginTime?=?new?TimeSpan(0,?0,?0);

doubleAnimationX.Duration?=?TimeSpan.FromMilliseconds(500);

doubleAnimationX.From?= Transform3D.OffsetX;

doubleAnimationX.To?=?x?-?hitPoint.X;

DoubleAnimation?doubleAnimationY?=?new?DoubleAnimation();

doubleAnimationY.BeginTime?=?new?TimeSpan(0,?0,?0);

doubleAnimationY.Duration?=?TimeSpan.FromMilliseconds(500);

doubleAnimationY.From?=?_Transform3D.OffsetY;

doubleAnimationY.To?=?y?-?hitPoint.Y;

DoubleAnimation?doubleAnimationZ?=?new?DoubleAnimation();

doubleAnimationZ.BeginTime?=?new?TimeSpan(0,?0,?0);

doubleAnimationZ.Duration?=?TimeSpan.FromMilliseconds(500);

doubleAnimationZ.From?= Transform3D.OffsetZ;

doubleAnimationZ.To?=?z?-?hitPoint.Z;

Transform3D.BeginAnimation(TranslateTransform3D.OffsetXProperty,?doubleAnimationX);

Transform3D.BeginAnimation(TranslateTransform3D.OffsetYProperty,?doubleAnimationY); ?

Transform3D.BeginAnimation(TranslateTransform3D.OffsetZProperty,?doubleAnimationZ);??

?

?

4. 最终的效果:

1.平移前:

?

?2.平移后:

?

?

原文地址:https://www.cnblogs.com/lonelyxmas/p/9689211.html

时间: 2024-10-29 19:11:08

WPF 3D 平移模型+动画(桥梁检测系统)的相关文章

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

原文:WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体 运行结果: 事实上很简单,定义好一个正方体,处理好纹理.关于MeshGeometry3D的正确定义和纹理这里就不多讲了,可以参考我以前写过的一些文章: WPF 3D: MeshGeometry3D纹理坐标的正确定义 WPF 3D:MeshGeometry3D的定义和光照 接下来就是怎样让它动起来.我们通过3D点动画来改变照相机(Camera类型)的位置(Position属性)从而使正方体动起来(这样的话实际上正方

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

原文:WPF 3D中多个模型如何设置某一个在最前? 问题:我们的模型包括导入的3D solid模型和axis坐标轴模型,当模型旋转的时候,3D会将axis挡住. 期望:axis一直在最前面,不会被3D挡住. 方法: (1) 将模型设置为透明,<SolidColorBrush Color="#3333CC" Opacity="0.8"/>,同时,将axis使用EmissiveMaterial. 这样实现可以在旋转后看到axis,但是这种方法并没有让axis

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

原文:WPF 3D 知识点大全以及实例 引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当然还有体感游戏等等. 3D 用来增加视觉效果,给人以更加直观,真实的感觉. 3D如此美妙,那我们在WPF中又该从何处入手开启我们的3D编程旅程? WPF中3D开发技术的基础知识应该有以下几点: 3D开发基础知识 WPF中3D开发的基础元素(Elements)

WPF的线程模型

原文:WPF的线程模型 WPF的线程模型 周银辉 谈到多线程,很多人对其可能都不太有好感,觉得麻烦与易出错.所以我们不排除有这样的情况:假设我对“多线程”.“异步”这些字眼潜意识地有些反感,所以在编码过程中能不用就不用,觉得延迟几百毫秒还是可以忍受的,如果系统中这种“可以忍受”的地方很多,最后我们会发现系统的性能变得一团糟,界面总是在“卡”(阻塞).这里我们讨论一下WPF的多线程模型,以便利用它使我们的UI线程得到解脱. 1,UI线程 传说WPF应用程序都至少有两个线程,一个用于UI绘制,其隐藏

最优化WPF 3D性能(基于“Tier-2”硬件)

原文:最优化WPF 3D性能(基于"Tier-2"硬件) 原文地址:Maximizing WPF 3D Performance on Tier-2 Hardware 开发人员在应用程序中使用Windows Presentation Foundation来构建大量的3D控件.包含3D场景时,常常会遇到如何优化其性能的问题.WPF 3D组的几个成员提供了一个影响应用程序性能的3D类和属性的列表.当我们使用她们来优化应用程序性能时应该遵从这些建议. 本随笔假定你深刻的理解了WPF 3D AP

WPF 3D 常用类(1)

原文:WPF 3D 常用类(1) 几何数据相关类 Geometry3D 抽象类, 用于定义物体的几何数据, 可用于计算HitTest和BoundingBox MeshGeometry3D Geometry3D的子类, 定义网格的顶点, 三角形顶点, 法线, Texture(纹理)的座标 常用属性: Positions, TriangleIndices, Noramls, TextureCoordinates 模型相关类 (模型=几何数据+变形(位置,旋转,尺寸)+材质) Model3D 抽象类,

Unity3d 换装 之 模型动画分离

在手游中换装成了越来越不可缺的一个功能,毫无疑问各式各样的时装为游戏增添了不同的色彩. 对于2D手游,或许是更换对应的序列帧,也或许是如同3D手游一般,更换模型动画. 对于游戏中的人物,一般分为头.上身.下身.武器四大部分就可以了.所以在游戏中,我们把这四部分单独做四个模型动画,然后动态拼接为一个整体,达到换装的效果. 然后根据动画制作人员的喜好 又有两种方式来拼接: 1.每个身体部位自带动画数据 2.每个身体部位不带动画数据,动画数据单独提取出来 我们这里介绍第二种. 对于我们这种每一个动作的

WPF 3D:使用变换中的TranslateTransform3D

原文:WPF 3D:使用变换中的TranslateTransform3D 程序效果: WPF 3D中的TranslateTransform3D应该是所有3D变换中最简单的变换,使用起来非常简单,先定义好3D对象,接着在适当的位置加入变换就可以了. 当然WPF 3D中变换(Transform3D类型)可以应用在如下属性中: 照相机:Camera类型 3D模型定义:Model3D类型 容纳3D模型的Visual3D:ModelVisual3D类型 对于2D的TranslateTransform,只有

WPF 3D 小小小小引擎 - &#183;WPF 3D变换应用

原文:WPF 3D 小小小小引擎 - ·WPF 3D变换应用 WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开发效率高,而且也容易上手. 下面给大家演示的是使用在WPF 3D上实现视角变换,通过鼠标拖动来变换观察视角,通过滚轮来放缩视距. 有关3D的基础知识可以参考MSDN文档:三维图形概述 首先创建一个3D立方体,立方体是由六个面构成(F1, F2 ....F6)其XAML代码如下: <Viewport3