原文:WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化

注:最近在做3D机械模型重建方面的软件,需要根据光栅传感器采集的数据绘制3D图形,并显示出色差以及填充和线框图。

以下转载自:http://blog.csdn.net/wmjcom/article/details/6019460

1、本文的目的:

      在制造业领域,对于cad模型和加工零件,有理论值和实测值的区别。理论值是设计人员设计cad模型中的数值,而实测值是加工好零件后检测出的数值,一般上理论值和实测值是有误差的,这个误差就叫偏差(Deviation)。

      根据偏差的范围,一般软件都有颜色设置,比如哪个范围内显示绿色,哪个范围是蓝色,超差是红色等等。在cad模型中,对于每个加工点或者测量点,根据其偏差值可以显示一个颜色,但这样显示的颜色比较离散,而且看不出一个整体加工工艺的变化。

      因此,为了实现将颜色显示连续和渐变,作者搜索一些网上资料和个人测试,实现了这个功能,特在此详细解释。

 

 

2、需要用到的网上的方法和代码

 

     文中用到的思想和类、方法来自下面这个博文,其中有源代码,可以下载并学习。

 

An article on WPF 3D performance enhancement techniques

Introduction

When using WPF for 3D graphics, many people have concerns over the performance. Following the guidelines from Microsoft
online help
, I built a 3D surface chart, as shown in the picture above. The surface chart has more than 40,000 vertices and more than 80,000 triangles. The performance is still fine. The project also includes 3D scatter
plot which has a large number of data points. You can build the project, feel the performance of WPF 3D and decide whether WPF 3D is suitable for your 3D data visualization.

 

Link in: http://www.codeproject.com/KB/WPF/WPFChart3D.aspx

 

 

3、实现方法:

(1)利用SetRGBMaping()方法生成一张RGB的映射表,并将其作为材质应用在cad模型上;

(2)遍历cad模型每一个Point3D,读取或者计算每一个点对应的偏差值;

(3)根据偏差值计算出相应的color;

(4)根据color计算出其在RGB映射表中的位置;

(5)将这个位置添加到TextureCoordinates。

 

 

4、具体实现代码:

        private TextureMapping m_mapping = new TextureMapping();

        private void SetModelTextureCoordinates()

        {

            Model3DGroup M3dGroup = (Model3DGroup)_cadModel;

            if (null == M3dGroup)

                return;

 

            foreach (GeometryModel3D gm3d in M3dGroup.Children)

            {

                gm3d.Material = m_mapping.m_material;

                if (gm3d.Geometry is MeshGeometry3D)

                {

                    MeshGeometry3D mg3d = (MeshGeometry3D)gm3d.Geometry;

                    mg3d.TextureCoordinates.Clear();

                    foreach (Point3D p3d in mg3d.Positions)

                    {

                        Double dev = GetDeviation(p3d);

                        Color color = TextureMapping.PseudoColor(dev);

                        Point mapPt = m_mapping.GetMappingPosition(color);

                        mg3d.TextureCoordinates.Add(new Point(mapPt.X, mapPt.Y));

                    }

                }

            }

        }

 

5、其他说明

      作者使用网上源代码中的相关类,实现了TextureCoordinates的应用过程,唯一要说明的是偏差如何计算,这个源代码中是没有的,网上的博文只是做了一个模拟,具体的实际偏差需要用户个人定义。

      我的实现方法是通过另一个工具,生成一个包含所有偏差的文件,偏差的格式和个数与cad模型xaml文件中的Positions一致,这样通过遍历Positions能够找到相应的偏差值。

WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化的更多相关文章

  1. 如何让django模型中的字段和model名显示为中文

    如何让django模型中的字段和model名显示为中文:在模型中加入class Meta即可 class People(models.Model): name = models.CharField(n ...

  2. 使用questionsModel.values()后不能获取模型中的属性对应的外键属性值的解决方式

    class QuestionsModel(models.Model): author = models.ForeignKey(FrontUserModel,null=True) content = m ...

  3. laravel--为什么属性在模型中没有定义,却取出来了值,这些属性哪里来的

    看laravel模型中的这段代码, public function getLimitUsersAttribute() { return $this->user_limit - $this-> ...

  4. vue中父组件如何监听子组件值的变化

    vue中我们会遇到很多父子组件通信的需求, 下面简单列一下,父子组件通信的几种情况 1:父组件向子组件传值:使用prop向子组件传值: 2:子组件实时监听父组件传来的值的变化:使用watch去监听父组 ...

  5. 关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案

    在win7,win10,vs2015,vs2017之间折腾了两天,死活就是调不出来Mysql数据源.真是活见鬼了. 直接说方案吧. 一,卸载你所安装过的mysql-connector-net.mysq ...

  6. QTreeView/QTableView中利用QStandardItem实现复选框三种形态变化

    https://www.techieliang.com/2017/12/729/ 原文地址 using_checkbox_item.h /** * @file using_checkbox_item. ...

  7. Sql Server中利用ISNULL方法判断数字并预设值

    1.ISNULL方法有两个参数,ISNULL(a,b),表达式含义为如果a为NULL,则设置该字段内容为b. 例如 table tab id sum 1 1 2 null select t.id,is ...

  8. Django模型中的admin后台管理无法显示字段

    在执行django后台管理时,登陆到http://127.0.0.1:8000/admin/,进入页面后没有对应的字段显示.请解决? 代码: models.py from django.db impo ...

  9. vuejs2.0与1.x版本中怎样使用js实时访问input的值的变化

    vuejs 2.0中js实时监听input 在2.0的版本中,vuejs把v-el 和 v-ref 合并为一个 ref 属性了,可以在组件实例中通过 $refs 来调用.这意味着 v-el:my-el ...

随机推荐

  1. gdb 调试多线程 神贴

    gdb 调试多线程如果目标进程已经core dump了,那么 gdb -c core xxx   xxx是对应的程序文件.如果目标进程还在运行,通常此时用于调试线程死锁的情况.有两种方法一是 gdb ...

  2. 记录一下phper的学习方向

    我是一个懒惰的人,吃了多年技术老本儿,对新技术缺乏学习动力,仗着逻辑思维的优势处理问题 http://www.topthink.com/topic/26730.html

  3. ArcEngine 数据导入经验(转载)

    转自原文ArcEngine 数据导入经验(转载) (一) GIS系统数据是基础,想必大家在做ArcEngine二次开发的过程中都会遇到向MDB和SDE写入数据的工作,我们将会通过几个篇幅,从大数据量导 ...

  4. [Ramda] Curry, Compose and Pipe examples

    const curry = R.curry((fns, ary) => R.ap(fns, ary)); ), R.add()]); ,,]); console.log(res); //[2, ...

  5. Android UI:看看Google官方自定义带旋转动画的ImageView-----RotateImageView怎么写(附 图片淡入淡...)

    众所周知,想要让ImageView旋转的话,可以用setRotation()让其围绕中心点旋转,但这个旋转是不带动画的,也就是旋转屏幕时图片噌的一下就转过去了,看不到旋转的过程,此UI体验不大好,为此 ...

  6. "Swift"编程语言

    来自英文文档.百度翻译以及自己没过4级的渣渣英语功底,为了自己以后看起来方便 About Swift 关于"海燕" IMPORTANT 重要 This is a prelimina ...

  7. HelloWorld RabbitMQ

    RabbitMQ入门-从HelloWorld开始 从读者的反馈谈RabbitMQ 昨天发完<RabbitMQ入门-初识RabbitMQ>,我陆陆续续收到一些反馈.鉴于部分读者希望结合实例来 ...

  8. linux使用.rpm包安装mysql

    一:下载mysql的.rpm安装包 点击链接查看下载教程:点击打开链接 二:创建目录,上传文件 创建mysql目录:# mkdir mysql 进入目录:# cd mysql 将下载好的MySQL-s ...

  9. iOS Animation具体解释

    iOS Animation具体解释 本篇仅仅要解说iOS中动画的使用. Animtion主要分为两类:UIView动画和CoreAnimation动画. UIView动画有UIView属性动画,UIV ...

  10. html常用样式margin、border怎么使用

    html常用样式margin.border怎么使用 一.总结 一句话总结:1.margin:auto配合width才能居中:2.border的三个属性依次是边框宽度,边框样式,边框颜色 1.html中 ...