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

 

 

转载于:https://www.cnblogs.com/enjoyeclipse/archive/2012/09/20/2695796.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF(Windows Presentation Foundation)是微软公司推出的一种用于创建用户界面的技术。它提供了丰富的图形、多媒体和动画效果,以及一系列强大的控件和布局功能,可用于开发各种各样的应用程序。 机械臂运动是指机械臂的移动和操作过程。机械臂是一种由多个关节连接而成的机械结构,可以在三维空间内实现各种运动和操作,广泛应用于工业自动化、仓储物流、医疗器械等领域。 View3DWPF中用于展示三维模型和场景的控件。通过View3D,我们可以在WPF应用程序中创建一个具有逼真效果的三维环境,将机械臂的模型和运动实时展示给用户。 以CSDN为例,CSDN是一个IT技术社区,提供丰富的技术博文和资源。在CSDN上,我们可以找到很多关于WPF、机械臂运动和View3D的相关文章和教程,可以帮助我们更好地了解和学习这些技术。 如果我们想要在WPF应用程序中实现机械臂运动的三维展示,我们可以使用View3D控件来创建一个带有机械臂模型的三维环境,并结合WPF动画功能,实现机械臂在三维空间内的运动效果。我们可以利用CSDN上的教程和资源,学习和借鉴其他开发者的经验,快速上手这些技术。 总之,WPF、机械臂运动和View3D是三个不同领域的技术,但可以结合使用来实现机械臂运动的三维展示。在CSDN等技术社区上,我们可以找到关于这些技术的相关资源和教程,可以帮助我们更好地学习和应用它们。 ### 回答2: WPF(Windows Presentation Foundation)是微软推出的一种用于创建 Windows 桌面应用程序的技术。它通过使用 XAML(可扩展应用程序标记语言)来定义用户界面,同时结合了强大的图形处理能力,使开发者能够创建出富有交互性和视觉效果的应用程序。 机械臂是一种能够模拟人类手臂运动的机器设备,广泛应用于工业自动化领域。机械臂的运动涉及到多个维度和轴的控制,需要精确的位置和角度控制,以及对传感器数据的实时处理和反馈。 在 WPF 中使用 View3D 控件可以实现对三维模型的展示和操作。通过 View3D 控件,我们可以将机械臂的三维模型加载并呈现在应用程序的界面上,实时展示机械臂的位置、姿态和运动状态。 通过在 View3D 控件中添加适当的事件处理逻辑,我们可以实现对机械臂的交互操作,比如通过鼠标拖拽、旋转、缩放来操作机械臂的运动。同时,我们还可以通过编写代码来控制机械臂的运动逻辑,比如设置机械臂的目标位置和姿态,以及控制机械臂沿特定轨迹移动。 CSDN(CSDN.NET)是一个技术社区网站,提供了大量的技术文章、博客、论坛等资源,对于开发者来说是一个非常宝贵的学习和交流平台。在 CSND 上可以找到很多关于 WPF、机械臂运动、View3D 等方面的教程和案例,可以帮助开发者更好地理解和应用这些技术。同时,也可以在 CSND 上与其他开发者交流,共同探讨问题和解决方案,促进技术的进步和共享。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值