天天看點

WPF在3D Cad模型中利用TextureCoordinates實作顔色漸變顯示偏內插補點的變化

原文: 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

WPF在3D Cad模型中利用TextureCoordinates實作顔色漸變顯示偏內插補點的變化

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能夠找到相應的偏內插補點。