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

简介: 原文:WPF 3D 平移模型+动画(桥梁检测系统) 关于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(000);
doubleAnimationX.Duration = TimeSpan.FromMilliseconds(500);
doubleAnimationX.From = Transform3D.OffsetX;
doubleAnimationX.To = x - hitPoint.X;

DoubleAnimation doubleAnimationY = new DoubleAnimation();
doubleAnimationY.BeginTime = new TimeSpan(000);
doubleAnimationY.Duration = TimeSpan.FromMilliseconds(500);
doubleAnimationY.From = _Transform3D.OffsetY;
doubleAnimationY.To = y - hitPoint.Y;

DoubleAnimation doubleAnimationZ = new DoubleAnimation();
doubleAnimationZ.BeginTime = new TimeSpan(000);
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.平移后:

 

 

目录
相关文章
|
C#
WPF中的3D变换PlaneProjection
原文:WPF中的3D变换PlaneProjection 在UWP中有一个比较好用的伪3D变换PlaneProjection,可以以一种轻量级和非常简单的方式实现3D的效果。这种效果在Silverlight中也有这种变换,但在WPF中确一直没有提供。
816 0
|
C# 图形学
WPF程序加入3D模型
原文:WPF程序加入3D模型 版权声明:本文为博主原创文章,转载请附上链接地址。 https://blog.csdn.net/ld15102891672/article/details/80064749     随着计算机显示性能的提高,很多程序都加入了3D的元素使得程序具有更酷炫的成果。
1352 0
|
C# 图形学 数据格式
WPF中的3D Wireframe
原文:WPF中的3D Wireframe WPF不支持画三维线,但开发人员提供了ScreenSpaceLines3D 类用于实现这个功能。
1181 0
|
C# Windows
WPF 3D中多个模型如何设置某一个在最前?
原文:WPF 3D中多个模型如何设置某一个在最前? 问题:我们的模型包括导入的3D solid模型和axis坐标轴模型,当模型旋转的时候,3D会将axis挡住。
950 0
|
C#
WPF中3D旋转的实现
原文:WPF中3D旋转的实现 关于3D旋转的原理,请看Daniel Lehenbauer的文章 《Rotating the Camera with the Mouse》 http://viewport3d.com/trackball.htm   里面非常清楚的讲解了原理和方法,很受用。
988 0
|
C# 容器
WPF中使用TranslateTransform3D修改CAD的3D旋转中心
原文:WPF中使用TranslateTransform3D修改CAD的3D旋转中心        前面一篇文章讲述了2D旋转功能的实现,文章提到了修改3D旋转中心,这一节主要总结一下具体的修改3D旋转中心的实现方法。
997 0
|
C# 图形学 Windows
WPF 3D编程介绍
原文:WPF 3D编程介绍 上一篇文章简单的介绍了WPF编程的相关的内容,也推荐了本书。今天要来讲一下在WPF如何开展3D编程。 使用的xmal 和C#开发的时候:需要使用如下的关键要素: 1:摄像机,是用来模拟成像的,现在WPF支持正交(orthographical )和透视(perspective )摄像机。
2022 0
|
数据可视化 C# 前端开发
WPF中的3D特性和常见的几个类
原文:WPF中的3D特性和常见的几个类 WPF 3D 常用的几个类及其关系 1.  Visual 类      所有二维可视化元素的基类,为 WPF 中的呈现提供支持,其中包括命中测试、坐标转换和边界框计算。
992 0
|
C#
在WPF中添加3D特性
原文:在WPF中添加3D特性 35.4  在WPF中添加3D特性 本节介绍WPF中的3D特性,其中包含了开始使用该特性的信息。 提示: WPF中的3D特性在System.Windows.Media.Media3D命名空间中。
917 0
|
C# 容器 异构计算
去除WPF中3D图形的锯齿
原文:去除WPF中3D图形的锯齿       理论上讲PC在计算3D图形的时候是无法避免不出现锯齿的,因为3D图形都是又若干个三角形组成,如果3D图形想平滑就必须建立多个三角形,你可以想象一下正5边形和正100边形哪个更接近圆形的道理一样,这样会大量消耗显卡的存储空间或是从内存共享的存储空间,导致程序的整体性能降低,但如果三角形很少,显卡的解析度毕竟有限,就会出现锯齿。
1314 0