热门标签 | 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 }

后台代码


效果

 



推荐阅读
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文深入探讨了如何通过调整InnoDB的关键配置参数来优化MySQL的随机IO性能,涵盖了缓存、日志文件、预读机制等多个方面,帮助读者全面提升数据库系统的性能。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细探讨了在Android 8.0设备上使用ChinaCock的TCCBarcodeScanner进行扫码时出现的应用闪退问题,并提供了解决方案。通过调整配置文件,可以有效避免这一问题。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
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社区 版权所有