原文: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;
        }

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

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

    原文:WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能       对于CAD图形来说,3D旋转比较常用,具体实现方法在上篇文章<WPF中3D旋转的实现 >中做了 ...

  2. WPF 3D:使用变换中的TranslateTransform3D

    原文:WPF 3D:使用变换中的TranslateTransform3D 程序效果: WPF 3D中的TranslateTransform3D应该是所有3D变换中最简单的变换,使用起来非常简单,先定义 ...

  3. 如何修改CAD字体颜色?试试这种方法

    CAD中编辑图纸的时候,使用的CAD制图软件来进行绘制,图纸中的CAD字体颜色都是默认的颜色,这样不方便进行查看.这个时候就需要修改CAD字体颜色了,那么如何修改CAD字体颜色呢?具体要怎么来进行操作 ...

  4. WPF中的3D特性和常见的几个类

    原文:WPF中的3D特性和常见的几个类 WPF 3D 常用的几个类及其关系 1.  Visual 类      所有二维可视化元素的基类,为 WPF 中的呈现提供支持,其中包括命中测试.坐标转换和边界 ...

  5. 在WPF中添加3D特性

    原文:在WPF中添加3D特性 35.4  在WPF中添加3D特性 本节介绍WPF中的3D特性,其中包含了开始使用该特性的信息. 提示: WPF中的3D特性在System.Windows.Media.M ...

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

    原文:在WPF中使用PlaneProjection模拟动态3D效果 虽然在WPF中也集成了3D呈现的功能,在简单的3D应用中,有时候并不需要真实光影的3D场景.毕竟使用3D引擎会消耗很多资源,有时候使 ...

  7. WPF中反转3D列表项

    原文:WPF中反转3D列表项 WPF中反转3D列表项                                                         周银辉记得在苹果电脑中有一个很酷的 ...

  8. WPF中的3D变换PlaneProjection

    在UWP中有一个比较好用的伪3D变换PlaneProjection,可以以一种轻量级和非常简单的方式实现3D的效果.这种效果在Silverlight中也有这种变换,但在WPF中确一直没有提供. 虽然W ...

  9. WPF中CAD control的XAML实现

    原文:WPF中CAD control的XAML实现     下面这个XAML文件是cad control里面最重要的一部分,使用Grid包含Viewport,Viewport中包括Camera和mod ...

随机推荐

  1. swift开发网络篇—利用NSURLSession 发送GET和POST请求

    说明:本文示例代码发送的请求均为http请求,需要对info.plist文件进行配置.如何配置,请参考https://github.com/HanGangAndHanMeimei/iOS9Adapta ...

  2. vue项目中一些文件的作用

    原文 简书原文:https://www.jianshu.com/p/38749e5bec3c 大纲 1.vue项目结构 2.主要的配置文件 2.1.package.json 2.2.dev-serve ...

  3. CAP理论/AP架构/CP架构

      原文地址:https://blog.csdn.net/u013058742/article/details/83541905  简书里的文章:Spring Cloud Eureka简介及与Zook ...

  4. 读Effective Objective-C [提高OC代码质量总结笔记第一篇:熟悉OC]

    一.OC特性 OC 为 C 语言添加了面向对象特性,是其超集; OC 使用动态绑定的消息结构,也就是,在运行时才会检查对象类型; 接收一条消息后,究竟应执行何种代码,由运行期环境来决定,而非 编译器; ...

  5. [Angular] Configurable NgModules

    You probably have seen 'foorRoot()' method a lot inside Angular application. Creating a configurable ...

  6. Oracle 12C R2 on Linux 7.X 单实例静默安装文档

    禁用防火墙systemctl stop firewalld.servicesystemctl disable firewalld.service 禁用SELinuxcat /etc/selinux/c ...

  7. php利用反射机制查找类和方法的所在位置

    //参数1是类名,参数2是方法名 $func = new ReflectionMethod('UnifiedOrder_pub', 'getPrepayId'); //从第几行开始 $start = ...

  8. Chrome源代码结构

    首先,开始接触Chrome的童鞋可能有一个疑惑,Chrome和Chromium是同一个东西吗?答案是,Chrome是Google官方的浏览器项目名称,Chromium是Google官方对Chrome开 ...

  9. golang快速入门(练习)

    1.打包和工具链 1.1 包 所有 Go 语言的程序都会组织成若干组文件,每组文件被称为一个包. ? 1 2 3 4 5 6 7 8 9 10 net/http/     cgi/     cooki ...

  10. matplotlib 可视化 —— cmap(colormap)

    color example code: colormaps_reference.py - Matplotlib 2.0.0 documentation 由其文档可知,在 colormap 类别上,有如 ...