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

后台代码


效果

 



推荐阅读
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 使用REM和媒体查询实现响应式布局
    本文介绍如何利用REM单位和媒体查询(Media Queries)来创建适应不同屏幕尺寸的网页布局。通过具体示例,展示在不同屏幕宽度下如何调整页面元素的样式。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 本文详细探讨了select和epoll两种I/O多路复用技术的内部实现原理,分析了它们在处理大量文件描述符时的性能差异,并通过具体示例代码展示了select的工作流程。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 在使用 MySQL 6.0.x 及以上版本的 JDBC 驱动时,若未正确配置 `serverTimezone` 参数,可能会导致连接异常。本文探讨了这一问题的原因及解决方法。 ... [详细]
  • 面对众多的数据分析工具,如何选择最适合自己的那一个?对于初学者而言,了解并掌握几种核心工具是快速入门的关键。本文将从数据处理的不同阶段出发,推荐三种广泛使用的数据分析工具。 ... [详细]
  • 本文详细探讨了在Windows 98环境下安装Apache 1.3.9、JServ、GNUJSP 1.0、JDK 1.2.2及JSDK 2.0后遇到的中文显示问题,并提供了多种有效的解决方案。 ... [详细]
  • 本文探讨了如何在SQL Server Reporting Services (SSRS)中利用TOP N功能来筛选和展示数据集中的前N条记录。通过正确的配置图表属性中的筛选器设置,可以轻松实现这一目标。 ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 本文介绍了Tomcat的基本操作,包括启动、关闭及首次访问的方法,并详细讲解了如何在IDEA中创建Web项目,配置Servlet及其映射,以及如何将项目部署到Tomcat。 ... [详细]
  • 本文探讨了互联网服务提供商(ISP)如何可能篡改或插入用户请求的数据流,并提供了有效的技术手段来防止此类劫持行为,确保网络环境的安全与纯净。 ... [详细]
  • 数据输入验证与控件绑定方法
    本文提供了多种数据输入验证函数及控件绑定方法的实现代码,包括电话号码、数字、传真、邮政编码、电子邮件和网址的验证,以及报表绑定和自动编号等功能。 ... [详细]
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社区 版权所有