原文: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. pstack.sh 查看进程堆栈

    #!/bin/bash if (( $# < 1 )) then     echo "usage: `basename $0` pid" 1>&2     ex ...

  2. stl变易算法(一)

    C++ STL的变易算法是一组可以改动容器元素数据的模板函数,可进行序列容器的复制.交换.替换.填充.移除.旋转等.这些算法对迭代器有较高的要求.详细的迭代器类型随各个算法而定,或向前迭代器.或双向迭 ...

  3. [Angular2 Router] Get activated router url

    getActivatedRoutePath(r: ActivatedRoute) { return r.url .subscribe(p => this.curtPath = p[0].path ...

  4. Struts(22)标签库具体解释

    要使用Struts2的标签,仅仅须要在JSP页面加入例如以下一行定义就可以: <%@ taglib prefix="s" uri="/struts-tags&quo ...

  5. mac nginx php-fpm

    再一次被困在一个傻问题.由于我居然怀疑是不是mac本身就和centos的安装不一样.在一次次地排错后,最终发现.原来是我的nginx.conf的一行配置少写了一个字母.最后多亏用ls检查来定位到这个错 ...

  6. ios开发之多线程---GCD

    一:基本概念 1:进程:正在运行的程序为进程. 2:线程:每个进程要想执行任务必须得有线程,进程中任务的执行都是在线程中. 3:线程的串行:一条线程里任务的执行都是串行的,假如有一个进程开辟了一条线程 ...

  7. Navigation Pane不能设置显示标题

    https://msdn.microsoft.com/VBA/Word-VBA/articles/view-showheading-method-word https://social.msdn.mi ...

  8. 【t077】宝物筛选

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物--这下小FF可发财了.但是这里的宝物实在是太多 ...

  9. 通过一次SpringBoot打成war包部署到tomcat启动总结一般jar包冲突的解决方法

    启动时,报错信息如下: 28-Sep-2018 16:55:41.567 严重 [localhost-startStop-1] org.apache.catalina.core.StandardCon ...

  10. 在线算法交互、可视化与演示及应用(caffe 网络配置文件 .prototxt 的可视化)

    0. 全集 Explained Visually 1. 图像与视觉 Image Kernels 2. 数学操作 Convolution arithmetic:卷积: 3. 神经网络与深度学习 A Ne ...