开发者社区> 杰克.陈> 正文

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

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
WPF弹性模拟动画
原文:WPF弹性模拟动画 我们此次将要制作模拟物理中的弹性现象的交互动画,我们让一个小球向鼠标点击位置移动,这个移动的轨迹不是简单的位移,而是根据胡克定律计算得出的。 胡克定律:F=-kd F代表弹性力的大小d是拉伸的位移k为弹性系数在我们的动画中还将加入摩擦力,否则物体就如在真空中运动,永远不会停止。
781 0
一个跨平台的 C++ 内存泄漏检测器
基本使用 对于下面这样的一个简单程序test.cpp: int main() { int* p1 = new int; char* p2 = new char[10]; return 0; } 我们的基本需求当然是对于该程序报告存在两处内存泄漏。
712 0
携程实时智能检测平台建设实践
Prophet基本覆盖了携程所有业务线,监控指标的数量达到10K+,覆盖了携程所有订单、支付等重要的业务指标。
1387 0
WPF界面设计技巧(3)—实现不规则动画按钮
原文:WPF界面设计技巧(3)—实现不规则动画按钮    发布了定义WPF按钮的教程后,有朋友问能否实现不规则形状的按钮,今天我们就来讲一下不规则按钮的制作。   不规则按钮的做法实际上和先前我们做不规则窗体的方法差不多,只是为按钮弄个不是那么方方正正的背景而已。
1029 0
samhain:比较变态的入侵检测系统
[撰文/hmy] 主机完整性检查工具,说它变态是因为在编译的时候可以加入证书认证,配置文件也需要通过证书签名才能运行,检查结果也是证书签名的。
572 0
WPF异步载入图片,附带载入中动画
原文: WPF异步载入图片,附带载入中动画 WPF异步载入图片,附带载入中动画 最近,在做一个WPF项目。项目中有一个需求,就是以列表的方式显示出项目图片。
889 0
WPF技术触屏上的应用系列(六): 视觉冲击、超炫系统主界面、系统入口效果实现
原文: WPF技术触屏上的应用系列(六): 视觉冲击、超炫系统主界面、系统入口效果实现         去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用。
1091 0
系统分析师论文评分标准
系统分析师论文评分标准 论文满分是75分,论文评分可分为优良、及格与不及格分3个档次。 评分的分数可分为: (1)60分至75分优良(相当于百分制80分至100分)。 (2)45分至59分及格(相当于百分制60分至79分)。
673 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载