博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化
阅读量:6092 次
发布时间:2019-06-20

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

原文:

注:最近在做3D机械模型重建方面的软件,需要根据光栅传感器采集的数据绘制3D图形,并显示出色差以及填充和线框图。
以下转载自:http://blog.csdn.net/wmjcom/article/details/6019460
1、本文的目的:

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

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

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

 

 

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

 

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

 

An article on WPF 3D performance enhancement techniques
WPF chart

Introduction

When using WPF for 3D graphics, many people have concerns over the performance. Following the guidelines from , 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: 

 

 

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能够找到相应的偏差值。

你可能感兴趣的文章
【IOS-COCOS2D游戏开发之十三】CCSPRITE利用BEZIER(贝塞尔)做抛物线动作并让CCSPRITE同时播放两个ACTION动作!...
查看>>
Android 文件存放路径【转】
查看>>
CPU GPU设计工作原理《转》
查看>>
[MySQL 5.6 ] Performance Schema学习:命名规范、状态变量及其他(2)
查看>>
mybatis性能优化二之多对多查询:用一次请求解决n次请求查询
查看>>
防止JavaScript自动插入分号
查看>>
Android--使用开源vitamio做万能视频播放器
查看>>
VS2008中使用NUnit
查看>>
SQL SERVER 的模糊查询 LIKE
查看>>
【Python】软件管理工具--pip
查看>>
插入排序之表插入排序
查看>>
Eclipse整合Tomcat开发Dynamic Web Project环境总结
查看>>
实战博客园访问流量计数器-三步操作简化教程
查看>>
JDBC与JAVA数据库编程
查看>>
Android开发之旅:环境搭建及HelloWorld
查看>>
Red Hat Enterprise Linux 各个版本以及发布日期
查看>>
J2EE全面介绍
查看>>
深入浅出Cocoa多线程编程之 block 与 dispatch quene
查看>>
UIWebView
查看>>
并发集合(三)使用阻塞线程安全的列表
查看>>