热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

利用helixtoolkit实现鼠标拖拽模型(不附加操作器)

思路&步骤大致思想就是利用viewport场景中,相机的方向与模型所在点确定模型的移动平面。再将鼠标在屏幕上的2d坐标转换成viewport中的3d坐标,确定模型新的位置。鼠标按下

思路&步骤

大致思想就是利用viewport场景中,相机的方向与模型所在点确定模型的移动平面。再将鼠标在屏幕上的2d坐标转换成viewport中的3d坐标,确定模型新的位置。



  1. 鼠标按下时,先拿到模型visual

  2. 鼠标移动时,将鼠标的二维坐标转换成viewport场景中的射线

  3. 得到射线与移动平面的交点,并以该交点作为模型的新位置

  4. 使用Transform更新模型位置


代码实现

前台:

1 <Window
2 x:Class="MouseDrag.MainWindow"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6 xmlns:helix="http://helix-toolkit.org/wpf"
7 xmlns:local="clr-namespace:MouseDrag"
8 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
9 Title="MainWindow"
10 800"
11 450"
12 mc:Ignorable="d">
13
14 <helix:HelixViewport3D
15 x:Name="view"
16 Background="LightGray"
17 Camera="{helix:PerspectiveCamera 43.11,
18 -74.67,
19 49.78}"
20 MouseDown="view_MouseDown"
21 MouseMove="view_MouseMove"
22 ShowCameraInfo="True"
23 ShowCoordinateSystem="True">
24
25
26 "cube" SideLength="10" />
27
28

29

前台

后台:

1 using HelixToolkit.Wpf;
2 using System.Windows;
3 using System.Windows.Input;
4 using System.Windows.Media.Media3D;
5
6 namespace MouseDrag
7 {
8 ///


9 /// MainWindow.xaml 的交互逻辑
10 ///

11 public partial class MainWindow : Window
12 {
13 CubeVisual3D selectCube = new CubeVisual3D();
14
15 public MainWindow()
16 {
17 InitializeComponent();
18 cube2.Transform = new TranslateTransform3D(20, 0, 0);
19 }
20
21 private void view_MouseDown(object sender, MouseButtonEventArgs e)
22 {
23 Visual3D visual = view.FindNearestVisual(e.GetPosition(view));
24 if(visual != null && visual is CubeVisual3D)
25 {
26 selectCube = visual as CubeVisual3D;//捕获按下的visual
27 }
28 }
29 private void view_MouseMove(object sender, MouseEventArgs e)
30 {
31 if (e.LeftButton == MouseButtonState.Pressed)
32 {
33 Matrix3D mat = cube.Transform.Value;//模型的变换矩阵
34 Vector3D lookdirction = view.Camera.LookDirection;//相机方向
35 Point3D dot = new Point3D(mat.OffsetX, mat.OffsetY, mat.OffsetZ);//模型位置
36
37 Ray3D ray = Viewport3DHelper.Point2DtoRay3D(view.Viewport, e.GetPosition(view));//射线类
38 var point = ray.PlaneIntersection(dot, lookdirction);//移动平面上的交点
39
40 mat.OffsetX = ((Point3D)point).X;
41 mat.OffsetY = ((Point3D)point).Y;
42 mat.OffsetZ = ((Point3D)point).Z;
43
44 Transform3D trans = new MatrixTransform3D(mat);
45 cube.Transform = trans;
46 }
47 }
48 }
49 }

后台代码


效果

 



推荐阅读
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了多因子选股模型在实际中的构建步骤,包括风险源分析、因子筛选和体系构建,并进行了模拟实证回测。在风险源分析中,从宏观、行业、公司和特殊因素四个角度分析了影响资产价格的因素。具体包括宏观经济运行和宏经济政策对证券市场的影响,以及行业类型、行业生命周期和行业政策对股票价格的影响。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
author-avatar
晓辉19890424俱乐部
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有