WPF中使用TranslateTransform3D修改CAD的3D旋转中心

原文:WPF中使用TranslateTransform3D修改CAD的3D旋转中心

?????? 前面一篇文章讲述了2D旋转功能的实现,文章提到了修改3D旋转中心,这一节主要总结一下具体的修改3D旋转中心的实现方法。(这个功能的实现有一段时间了,需要通过代码好好总结一下)

????? TranslateTransform3D以相对容器的偏移移动对象,通过OffsetX、OffsetY、OffsetZ属性来指定偏移量。

?

(1)定义对象

??????? private TranslateTransform3D _translateTransform3D = new TranslateTransform3D();

?

(2)点击左键进行设置旋转中心

????????private void OnMouseLeftButtonUp(object sender, MouseEventArgs e)
??????? {

??????????? Point mouseposition = e.GetPosition(ViewPort);
??????????? PointHitTestParameters pointparams = new PointHitTestParameters(mouseposition);
??????????? Point mousePosBorderPos = e.GetPosition(ViewPort);

??????????? if (Keyboard.Modifiers == ModifierKeys.Alt)
??????????? {
??????????????? VisualTreeHelper.HitTest(ViewPort, null, HTResultCenter, pointparams);
??????????? }
??????? }

??????? 其中ViewPort和CadGrid可以参考文章:WPF中CAD control的XAML实现

?

(3)HitTest去设置旋转中心

??????? private HitTestResultBehavior HTResultCenter(System.Windows.Media.HitTestResult rawresult)
??????? {
??????????? RayHitTestResult rayResult = rawresult as RayHitTestResult;

??????????? if (rayResult != null)
??????????? {
??????????????? _rotCenter3D = rayResult.PointHit;
??????????????? _translateTransform3D.OffsetX = rayResult.PointHit.X;
??????????????? _translateTransform3D.OffsetY = rayResult.PointHit.Y;
??????????????? _translateTransform3D.OffsetZ = rayResult.PointHit.Z;
??????????? }
??????????? return HitTestResultBehavior.Stop;
??????? }

?

?????? 通过这两个方法就实现了3D旋转中心的更改,再次旋转3D的话你就会发现旋转中心就是你设置的那个点了。

?????? 在修改旋转中心的时候,我们还做了一个小小的功能,就是设置好点后,让旋转中心移到CadGrid的中心,这样便于观察旋转结果。

??????? private void MoveCenter(Point mouseposition)
??????? {
??????????????? //convert previous 3D rotation center to 2D.
??????????????? bool bRet = false;
??????????????? Point previousRotCenter2D = Convert3DPointTo2D(_previousRotCenter3D, out bRet);

?

??????????????? //Translate previous 2D rotation center to center of cad window.
??????????????? Point centerWnd = new Point(ViewPort.Width / 2.0, ViewPort.Height / 2.0);
??????????????? Translate(centerWnd, previousRotCenter2D);

?

???????????????? _translateTransform3D.OffsetX = _rotCenter3D.X;
??????????????? _translateTransform3D.OffsetY = _rotCenter3D.Y;
??????????????? _translateTransform3D.OffsetZ = _rotCenter3D.Z;

??????????????? _previousRotCenter3D = _rotCenter3D;
??????? }

原文地址:https://www.cnblogs.com/lonelyxmas/p/9844544.html

时间: 2024-10-10 20:43:13

WPF中使用TranslateTransform3D修改CAD的3D旋转中心的相关文章

WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能

原文:WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能 ????? 对于CAD图形来说,3D旋转比较常用,具体实现方法在上篇文章<WPF中3D旋转的实现 >中做了讲解,可以参考Daniel. ????? 今天说一下CAD的2D旋转,2D旋转虽然不如3D那么常用,但也是CAD操作的基本功能需要实现.刚开始的做法是觉得用AxisAngleRotation3D没法实现2D旋转,所以用RotateTransform去实现.但是用它遇到的问题是旋转的transform没有考虑在

WPF 3D:使用变换中的TranslateTransform3D

原文:WPF 3D:使用变换中的TranslateTransform3D 程序效果: WPF 3D中的TranslateTransform3D应该是所有3D变换中最简单的变换,使用起来非常简单,先定义好3D对象,接着在适当的位置加入变换就可以了. 当然WPF 3D中变换(Transform3D类型)可以应用在如下属性中: 照相机:Camera类型 3D模型定义:Model3D类型 容纳3D模型的Visual3D:ModelVisual3D类型 对于2D的TranslateTransform,只有

CAD编辑器中修改CAD文件文字大小的办法

CAD绘图是一个复杂的过程,我们需要考虑到方方面面,其中出现的问题也不少,当我们想要修改CAD文字大小的时候该怎么办呢? 迅捷CAD编辑器一款集CAD查看.编辑.转换于一体的CAD编辑工具,我们可以借助于该软件改变CAD文字大小,方法如下: 1.运行迅捷CAD编辑器http://cad.xjpdf.com,在软件界面中打开要编辑的CAD文件,在左上角点击文件,切换到文件列表,点击打开,然后在弹出的文件夹中找到要编辑的CAD文件打开即可. 2.如果只是因为看不清文字想要把相应的文字内容大方,那么在

在WPF中使用PlaneProjection模拟动态3D效果

原文:在WPF中使用PlaneProjection模拟动态3D效果 虽然在WPF中也集成了3D呈现的功能,在简单的3D应用中,有时候并不需要真实光影的3D场景.毕竟使用3D引擎会消耗很多资源,有时候使用各种变换和假的阴影贴图也能设计出既省资源,又有很好用户体验的“伪”3D界面. 在Silverlight中,因为性能问题,一般并不使用真3D引擎,微软为Silverlight提供了System.Windows.Media.PlaneProjection 类,用投影变换来模拟3D的效果. 下面让我们看

WPF中的3D Wireframe

原文:WPF中的3D Wireframe WPF不支持画三维线,但开发人员提供了ScreenSpaceLines3D 类用于实现这个功能.我已经在程序中实现并成功显示3D Wireframe,并能够进行3D Solid和3D Wireframe的切换. 我在熟悉这个类的基础上,自己定义了3D Wireframe xml文件的格式,用于保存3D Wireframe数据. 格式如下: <Wireframe>? <ScreenSpaceLines3D??? Form="Generic

WPF中3D旋转的实现

原文:WPF中3D旋转的实现 关于3D旋转的原理,请看Daniel Lehenbauer的文章 <Rotating the Camera with the Mouse> http://viewport3d.com/trackball.htm ? 里面非常清楚的讲解了原理和方法,很受用. ? 相关代码: ? 2.1 Finding the Point on the Sphere private Vector3D ProjectToTrackball(Double width, Double he

如何修改CAD中的线型

如何修改CAD中的线型?CAD行业中的同行们都知道,在绘制CAD图纸的过程中是借助第三方工具来进行绘制的,那就是专门用于绘制图纸的CAD编辑器,有的图纸中对绘制的线型非常的重要,如果编辑中不是你需要的那种线型的话,如何修改CAD中的线型?具体要怎么来进行操作?下面小编今天就使用迅捷CAD编辑器专业版来教大家修改CAD中线型的操作步骤,有兴趣的朋友可以一起来看看. 第一步:在电脑中任意的打开一个浏览器,然后在搜索框中搜索迅捷CAD编辑器,然后在搜索的结果中,点击官网进入,进入之后根据提示步骤来下载

WPF 中的 loaded 事件和 Initialized 事件

在 WPF 中, 控件有 Loaded 和 Initialized 两种事件. 初始化和加载控件几乎同时发生, 因此这两个事件也几乎同时触发. 但是他们之间有微妙且重要的区别. 这些区别很容易让人误解. 这里介绍我们设计这些事件的背景. (不仅适用于 Control 类, 同样在通用类如 FrameworkElement 和 FrameworkContentElement 类也适用.) 下面是个小故事: Initialized 事件只说: 这个元素已经被构建出来,并且它的属性值都被设置好了,所以

WPF 中动态改变控件模板

在某些项目中,可能需要动态的改变控件的模板,例如软件中可以选择不同的主题,在不同的主题下软件界面.控件的样式都会有所不同,这时即可通过改变控件模板的方式实现期望的功能. 基本方法是当用户点击切换主题按钮是加载新的资源字典,并使用新加载的资源字典替代当前的资源字典这时要用到ResourceManager. 假设现有两个不同的资源字典文件Dictionary1.xaml和Dictionary2.xaml存在于Themes文件夹内: 在MainPage中使用其中一个资源字典作为默认样式文件: <Win