WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化
原文:WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化
在制造业领域,对于cad模型和加工零件,有理论值和实测值的区别。理论值是设计人员设计cad模型中的数值,而实测值是加工好零件后检测出的数值,一般上理论值和实测值是有误差的,这个误差就叫偏差(Deviation)。
根据偏差的范围,一般软件都有颜色设置,比如哪个范围内显示绿色,哪个范围是蓝色,超差是红色等等。在cad模型中,对于每个加工点或者测量点,根据其偏差值可以显示一个颜色,但这样显示的颜色比较离散,而且看不出一个整体加工工艺的变化。
因此,为了实现将颜色显示连续和渐变,作者搜索一些网上资料和个人测试,实现了这个功能,特在此详细解释。
2、需要用到的网上的方法和代码
文中用到的思想和类、方法来自下面这个博文,其中有源代码,可以下载并学习。

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实现颜色渐变显示偏差值的变化的更多相关文章
- 如何让django模型中的字段和model名显示为中文
如何让django模型中的字段和model名显示为中文:在模型中加入class Meta即可 class People(models.Model): name = models.CharField(n ...
- 使用questionsModel.values()后不能获取模型中的属性对应的外键属性值的解决方式
class QuestionsModel(models.Model): author = models.ForeignKey(FrontUserModel,null=True) content = m ...
- laravel--为什么属性在模型中没有定义,却取出来了值,这些属性哪里来的
看laravel模型中的这段代码, public function getLimitUsersAttribute() { return $this->user_limit - $this-> ...
- vue中父组件如何监听子组件值的变化
vue中我们会遇到很多父子组件通信的需求, 下面简单列一下,父子组件通信的几种情况 1:父组件向子组件传值:使用prop向子组件传值: 2:子组件实时监听父组件传来的值的变化:使用watch去监听父组 ...
- 关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案
在win7,win10,vs2015,vs2017之间折腾了两天,死活就是调不出来Mysql数据源.真是活见鬼了. 直接说方案吧. 一,卸载你所安装过的mysql-connector-net.mysq ...
- QTreeView/QTableView中利用QStandardItem实现复选框三种形态变化
https://www.techieliang.com/2017/12/729/ 原文地址 using_checkbox_item.h /** * @file using_checkbox_item. ...
- Sql Server中利用ISNULL方法判断数字并预设值
1.ISNULL方法有两个参数,ISNULL(a,b),表达式含义为如果a为NULL,则设置该字段内容为b. 例如 table tab id sum 1 1 2 null select t.id,is ...
- Django模型中的admin后台管理无法显示字段
在执行django后台管理时,登陆到http://127.0.0.1:8000/admin/,进入页面后没有对应的字段显示.请解决? 代码: models.py from django.db impo ...
- vuejs2.0与1.x版本中怎样使用js实时访问input的值的变化
vuejs 2.0中js实时监听input 在2.0的版本中,vuejs把v-el 和 v-ref 合并为一个 ref 属性了,可以在组件实例中通过 $refs 来调用.这意味着 v-el:my-el ...
随机推荐
- UE4制作插件的插件神器pluginCreator
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/45644007 作者:car ...
- 使用Apache FtpServer搭建FTP服务器 [FlashFXP]
<server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w ...
- C#中使用split分割字符串的几种方法小结
1.用字符串分隔: using System.Text.RegularExpressions;string str="aaajsbbbjsccc";string[] sArray= ...
- [Compose] 13. Lift into a Pointed Functor with of
We examine the of function we've seen on a few types and discover it's the Pointed interface. Instea ...
- Guava中TreeRangeMap基本使用
RangeMap跟一般的Map一样.存储键值对,依照键来取值.不同于Map的是键的类型必须是Range,也既是一个区间.RangeMap在Guava中的定义是一个接口: public interfac ...
- .NETCore 实现容器化Docker与私有镜像仓库管理
原文:.NETCore 实现容器化Docker与私有镜像仓库管理 一.Docker介绍 Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技 ...
- hdu 4059 The Boss on Mars
The Boss on Mars Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- WPF动画结束后的行为方式
原文:WPF动画结束后的行为方式 在WPF中可以使用Animation来完成动画功能,如移动,旋转等,最近写的一个程序需要实现控件的移动,包括自动移动和手动控制.原理很简单,就是改变控件的Margin ...
- DYNAMIC CONTEXT SWITCHING BETWEEN ARCHITECTURALLY DISTINCT GRAPHICS PROCESSORS
FIELD OF INVENTION This invention relates to computer graphics processing, and more specifically to ...
- svn: is already a working copy for a different url 解决办法
svnX svn: E155000: '/Users/mac/Desktop/SHiosProject/SVNmangerfiles/wuye' is already a working c ...