原文: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 = , , );

doubleAnimationX.Duration = TimeSpan.FromMilliseconds();

doubleAnimationX.From = Transform3D.OffsetX;

doubleAnimationX.To = x - hitPoint.X;

DoubleAnimation doubleAnimationY = new DoubleAnimation();

doubleAnimationY.BeginTime = , , );

doubleAnimationY.Duration = TimeSpan.FromMilliseconds();

doubleAnimationY.From = _Transform3D.OffsetY;

doubleAnimationY.To = y - hitPoint.Y;

DoubleAnimation doubleAnimationZ = new DoubleAnimation();

doubleAnimationZ.BeginTime = , , );

doubleAnimationZ.Duration = TimeSpan.FromMilliseconds();

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.平移后:

 

 

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

  1. WPF 3D 模型旋转

    原文:WPF 3D 模型旋转 WPF 是 Microsoft 在 Framework3.0 中支持的一种技术,它能作出很绚丽的界面,同时它也支持3D的操作.在3D操作主要包括平移(Translate) ...

  2. WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化

    原文:WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化 注:最近在做3D机械模型重建方面的软件,需要根据光栅传感器采集的数据绘制3D图形,并显示出色差以及 ...

  3. WPF 3D模型 3D场景

    1.首先得说明的是这并不是真正的3D,模型被导出为一系列的单个图片,例如一个3D户型图,以某个视角旋转360°,渲染出一系列连续的单个图片文件. 2.在Image.MouseMove事件中添加相应代码 ...

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

    原文:WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体 运行结果: 事实上很简单,定义好一个正方体,处理好纹理.关于MeshGeometry3D的正确定义和纹理这里就不多讲 ...

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

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

  6. WPF 3D模型的一个扩展方法

    原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...

  7. WPF 3D动态加载模型文件

    原文:WPF 3D动态加载模型文件 这篇文章需要读者对WPF 3D有一个基本了解,至少看过官方的MSDN例子. 一般来说关于WPF使用3D的例子,都是下面的流程: 1.美工用3DMAX做好模型,生成一 ...

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

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

  9. Qt Creator中的3D绘图及动画教程(参照NeHe)

    Qt Creator中的3D绘图及动画教程(参照NeHe) http://blog.csdn.net/cly116/article/details/47184729 刚刚学习了Qt Creator,发 ...

随机推荐

  1. 云应用开发之新浪SAE读写云端数据库MySQL

    本博文为前篇博文新浪云应用SAE日志查看的延续. 在读写云数据库MySQL之前,须要说明的是,在新浪云平台上使用数据库时.该平台默认会为每个应用单独新建一个数据库database实例.在该实例中再创建 ...

  2. POJ 1258 Agri-Net|| POJ 2485 Highways MST

    POJ 1258 Agri-Net http://poj.org/problem?id=1258 水题. 题目就是让你求MST,连矩阵都给你了. prim版 #include<cstdio> ...

  3. [Angular] Using InjectionToken

    Previously we have 'OpaqueToken', but it is DEPRECATED. The new one is called 'InjectionToken'. The ...

  4. iOS开发:父子控制器简介:

    #import "ViewController.h" #import "ScoietyViewController.h" #import "HotVi ...

  5. PatentTips - Method and system for browsing things of internet of things on ip using web platform

    BACKGROUND The following disclosure relates to a method and system for enabling a user to browse phy ...

  6. Home界面的启动

    继上篇文章Launcher进程的启动,我们继续分析Home界面的启动. public final class ActivityThread { ...... public static final v ...

  7. RabbitMQ 服务

    RabbitMQ 使用场景一   安装环境 1.下载安装 Erlang 运行时环境 2.下载安装 RabbitMQ Server 应用程序 3.启动 RabbitMQ 服务(默认启动) 4.安装管理平 ...

  8. [Angular] Scrolling the Message List To the Bottom Automatically Using OnChanges

    Let's say the message list can Input (messages) from parent component, and what we want to do is whe ...

  9. 基于 Android NDK 的学习之旅-----序言

    前些日子做了个Android项目, 引擎层 用C的, 准备写这个系类的文章,借此跟朋友来分享下我NDK开放的经验以及自己知识的总结和备忘.希望能给需要这方面资料的朋友提供一定的帮助. 主要涉及到:   ...

  10. 【42%】【hdu1166】排兵布阵(树状数组解法&&线段树解法)

    Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...