博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF中使用TranslateTransform3D修改CAD的3D旋转中心
阅读量:5037 次
发布时间:2019-06-12

本文共 1858 字,大约阅读时间需要 6 分钟。

原文:

       前面一篇文章讲述了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可以参考文章: 。

 

(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;

        }

posted on
2018-10-24 17:05 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/9844544.html

你可能感兴趣的文章
关于js的设计模式(简单工厂模式,构造函数模式,原型模式,混合模式,动态模式)...
查看>>
KMPnext数组循环节理解 HDU1358
查看>>
android调试debug快捷键
查看>>
【读书笔记】《HTTP权威指南》:Web Hosting
查看>>
Inoodb 存储引擎
查看>>
数据结构之查找算法总结笔记
查看>>
Linux内核OOM机制的详细分析
查看>>
Android TextView加上阴影效果
查看>>
Requests库的基本使用
查看>>
C#:System.Array简单使用
查看>>
C#inSSIDer强大的wifi无线热点信号扫描器源码
查看>>
「Foundation」集合
查看>>
算法时间复杂度
查看>>
二叉树的遍历 - 数据结构和算法46
查看>>
类模板 - C++快速入门45
查看>>
[转载]JDK的动态代理深入解析(Proxy,InvocationHandler)
查看>>
centos7 搭建vsftp服务器
查看>>
RijndaelManaged 加密
查看>>
Android 音量调节
查看>>
HTML&CSS基础学习笔记1.28-给网页添加一个css样式
查看>>