亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Representation Data in OpenCascade BRep

系統 2275 0

Representation Data in OpenCascade BRep

eryar@163.com

摘要Abstract:現在的顯示器大多數是光柵顯示器,即可以看做一個像素的矩陣。在光柵顯示器上顯示的任何圖形,實際上都是一些具有一種或多種顏色的集合。數學上精確表示的圖形在顯示器中只能用逼近的方式顯示出來。本文主要對OpenCascade的BRep文件中用來顯示曲線和曲面的離散數據結構進行說明。?

關鍵字:OpenCascade, BRep, Polygon, Triangulation, Subdivision Curves,?

一、引言 Introduction

光柵圖形顯示器可以看做一個像素矩陣。在光柵顯示器上顯示的任何一種圖形,實際上都是一些具有一種或多種顏色的像素的集合。在數學上,理想的曲線是沒有寬度的,它是由無數個點構成的集合,而當要顯示曲線時,就不能用無數個點在顯示器中顯示,必須對其進行離散化,即細分處理。考慮性能要求,需要用盡可能少的點來顯示曲線。對于曲面也是一樣,雖然已經有曲面的數學解析表示,但是需要在顯示器中顯示時,必須對其離散化,即三角剖分得到的逼近曲面的三角網格。?

在OpenCascade中已經有曲線和曲面的精確的數學解析表達形式的類,如下圖所示:?

wps_clip_image-26135

Figure 1.1 Parametric geometry curves?

wps_clip_image-30917

Figure 1.2 Parametric geometry surfaces?

在OpenGL中顯示這些曲線和曲面時,不能直接顯示出由參數方程精確表示的曲線和曲面,必須對曲線和曲面進行細分,即離散化,得到OpenGL顯示用的點和三角網格。?

在OpenCascade中使用類Poly_Polygon3D/Poly_Polygon2D來保存多段線的數據,即可以用來保存逼近顯示由參數方程精確表示的曲線的離散點數據。?

在OpenCascade中使用類Poly_Triangulation來保存網格數據,即用三角網格來逼近表示的曲面,或更通用的一個形狀。?

形狀的離散化由函數BRepMesh::Mesh()來統一處理,處理后就可以得到形狀用來顯示的多段線和三角網格數據。有了這些離散數據,不管是將形狀交給顯示模塊進行顯示,還是將形狀在其他顯示引擎中顯示,就很方便了。?

在OpenCascade的BRep中也保存了形狀的用來顯示用的離散數據,即多段線和三角網格。只有經過BRepMesh::Mesh()離散化之后,形狀才具有這些數據。?

二、細分曲線 Subdivision of Curves

在前面的一篇文章《 在OpenSceneGraph中繪制OpenCascade的曲線 》中對曲線的顯示使用了統一細分處理(uniform subdivision),即將曲線在整個參數區域內均分后得到一些線段來顯示。沒有考慮這樣的問題:在曲線很平的區域內,就會存在冗余的點;在曲線曲度很大的區域內,可能點的數量還不足以顯示出光滑的曲線。自適應細分(Adaptive Subdivision)的方法就是將點放在最需要的地方,其主要目的是可視化曲線時更高效的渲染。通常這種方法主要用于游戲,因為其顯示更高效,性能更好。?

wps_clip_image-27356

Figure 2.1 Uniform sampling on a curve?

如上圖所示,統一采樣來繪制曲線時,通常會在直線段區域生成很多多余的點,而在曲線區域的點太少,不能表示出光滑的曲線。自適應細分曲線有很多種方法,每種方法都會考慮速度、效率和精度,即如何用最少的點精確地表示出曲線。當你理解這個基本概念后,也可以對其他方法進行研究。?

在OpenCascade中對曲線的細分使用的類是GCPnts_TangentialDeflection,其算法描述如下,感興趣的讀者可以結合源程序對其算法實現進行研究:?

wps_clip_image-9058

其中各個點的橫坐標對應的參數分別為:?

wps_clip_image-26078

從上述公式結合向量的數量積公式可以看出,約束條件是兩個向量夾角的余弦值分別小于角度偏差和曲率偏差。算法將產生滿足約束條件的曲線上的最少數量的點。?

wps_clip_image-20720

細分曲線后的點保存在類Poly_Polygon3D中。在BRep中也保存有多段線數據,如下所示:?

示例:?

wps_clip_image-21527

BNF定義:?

wps_clip_image-10682

詳細說明:?

<3D polygon record>定義了空間多段線(3D polyline)L,用來逼近空間參數曲線C。多段線的數據包含節點數m>=2,參數顯示標志位p,逼近偏差(deflection)d>=0,節點Ni(1=<i<=m),參數ui(1=<i<=m)。當參數顯示標志位p=1時,參數u才會顯示。多段線L通過這些節點,多段線L逼近曲線C的逼近偏差定義如下所示:?

wps_clip_image-18171

參數ui(1=<i<=m)是曲線C上通過節點Ni的參數值:?

wps_clip_image-8816

示例數據表示的多段線為:m=2,參數顯示標志位p=1,逼近偏差d=0.1,節點N1=(1,0,0),N2=(2,0,0),參數u1=0,u2=1。?

三、細分曲面 Subdivision of surfaces

我們知道使用參數方程可以精確表示出三維曲線和曲面,但是參數方程表示的曲線曲面并不能直接交給OpenGL直接顯示出來。為此,圖形學中廣泛使用三角網格來表達三維模型,即用三角形組成的面片列表來近似逼近表示三維模型。?

wps_clip_image-3413

Figure 3.1 Triangulation of Chinese Dragon?

用三角網格表示的曲面需要解決幾個問題:三角網格的產生、描述、遍歷、簡化和壓縮等。在OpenCascade中三角網格的產生使用算法Delaunay三角剖分算法生成網格數據,網格的描述使用類Poly_Triangulation。BRep文件中也保存三角網格的數據,如下所示:?

示例:?

wps_clip_image-20489

BNF定義:?

wps_clip_image-19514

詳細說明:?

<triangulation record>定義了逼近曲面S的三角剖分T(triangulation)。三角剖分的數據包含節點數m>=3,三角形數k>=1,參數顯示標志位p,逼近偏差d>=0,節點Ni(1<=i<=m),參數對ui,vi(1<=i<=m),三角形nj,1,nj,2,nj,3。參數只有當參數顯示標志位p=1時才顯示。三角剖分逼近曲面的偏差d定義如下所示:?

wps_clip_image-24429

參數對ui,vi描述了曲面S上過節點Ni的參數:?

wps_clip_image-20588

三角形nj,1, nj,2, nj,3用來取得三角形的三個頂點值Nnj,1,Nnj,2,Nnj,3,節點遍歷的順序就是Nnj,1,Nnj,2,Nnj,3。從三角剖分T的任意一側遍歷,所有三角形都有相同的方向:順時針或逆時針。?

三角剖分中的三角形數據:?

wps_clip_image-30677

表示的三角剖分為:m=4個節點,k=2個三角形,參數顯示標志位p=1,逼近偏差d=0,節點N1(0,0,0),N2(0,0,3),N3(0,2,3),N4(0,2,0),參數值(u1,v1)=(0,0),(u2,v2)=(3,0),(u3,v3)=(3,-2),(u4,v4)=(0,-2)。從點(1,0,0)((-1,0,0)),三角形是順時針(逆時針)的。?

四、程序示例 Code Example

通過創建多段線和三角網格數據并將其輸出,可以理解BRep文件中用來顯示的離散的數據結構。程序示例如下所示:

      
        /*
      
      
        

*    Copyright (c) 2013 eryar All Rights Reserved.

*

*        File    : Main.cpp

*        Author  : eryar@163.com

*        Date    : 2013-12-12 21:46

*        Version : 1.0v

*

*    Description : There are two kind of data for shape representation 

*                  of the BRep file of OpenCascade. One is Polyline to

*                  approximates a 3D curve; the other is triangulations

*                  to approximates a surface.

*

*       KeyWords : OpenCascade, BRep File, Polygon, Triangulation

*                  


      
      
        */
      
      
        #define
      
       WNT
      
        

#include 
      
      <TColStd_Array1OfReal.hxx>
      
        

#include 
      
      <TColgp_Array1OfPnt.hxx>
      
        

#include 
      
      <TColgp_Array1OfPnt2d.hxx>
      
        



#include 
      
      <Poly.hxx>
      
        

#include 
      
      <Poly_Polygon3D.hxx>
      
        

#include 
      
      <Poly_Array1OfTriangle.hxx>
      
        

#include 
      
      <Poly_Triangulation.hxx>




      
        #pragma
      
       comment(lib, "TKernel.lib")


      
        #pragma
      
       comment(lib, "TKMath.lib")




      
        int
      
       main(
      
        void
      
      
        )

{

    
      
      
        //
      
      
         3D Polygons:

    
      
      
        //
      
      
         Polygon3D 1

    
      
      
        //
      
      
         2 1

    
      
      
        //
      
      
         0.1

    
      
      
        //
      
      
         1 0 0 2 0 0

    
      
      
        //
      
      
         0 1
      
      

    TColStd_Array1OfReal parameters(
      
        1
      
      , 
      
        2
      
      
        );

    TColgp_Array1OfPnt nodes(
      
      
        1
      
      , 
      
        2
      
      
        );

    Handle_Poly_Polygon3D polyline;



    nodes.SetValue(
      
      
        1
      
      , gp_Pnt(
      
        1
      
      , 
      
        0
      
      , 
      
        0
      
      
        ));

    nodes.SetValue(
      
      
        2
      
      , gp_Pnt(
      
        2
      
      , 
      
        0
      
      , 
      
        0
      
      
        ));



    parameters.SetValue(
      
      
        1
      
      , 
      
        0.0
      
      
        );

    parameters.SetValue(
      
      
        2
      
      , 
      
        1.0
      
      
        );



    polyline 
      
      = 
      
        new
      
      
         Poly_Polygon3D(nodes, parameters);

    polyline
      
      ->Deflection(
      
        0.1
      
      
        );



    Poly::Write(polyline, std::cout);

    Poly::Write(polyline, std::cout, 
      
      
        false
      
      
        );



    
      
      
        //
      
      
         Triangulations.

    
      
      
        //
      
      
         4 2 1 0

    
      
      
        //
      
      
         0 0 0 0 0 3 0 2 3 0 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 
      
      

    Standard_Integer nodeCount = 
      
        4
      
      
        ;

    Standard_Integer triangleCount 
      
      = 
      
        2
      
      
        ;

    Standard_Real deflection 
      
      = 
      
        0.0
      
      
        ;

    Standard_Boolean hasUV 
      
      =
      
         Standard_True;



    TColgp_Array1OfPnt triNodes(
      
      
        1
      
      
        , nodeCount);

    TColgp_Array1OfPnt2d UVNodes(
      
      
        1
      
      
        , nodeCount);

    Poly_Array1OfTriangle triangles(
      
      
        1
      
      
        , triangleCount);

    Handle_Poly_Triangulation triangulation;



    triNodes(
      
      
        1
      
      ).SetCoord(
      
        0
      
      , 
      
        0
      
      , 
      
        0
      
      
        );

    triNodes(
      
      
        2
      
      ).SetCoord(
      
        0
      
      , 
      
        0
      
      , 
      
        3
      
      
        );

    triNodes(
      
      
        3
      
      ).SetCoord(
      
        0
      
      , 
      
        2
      
      , 
      
        3
      
      
        );

    triNodes(
      
      
        4
      
      ).SetCoord(
      
        0
      
      , 
      
        2
      
      , 
      
        0
      
      
        );



    UVNodes(
      
      
        1
      
      ).SetCoord(
      
        0.0
      
      , 
      
        0.0
      
      
        );

    UVNodes(
      
      
        2
      
      ).SetCoord(
      
        3.0
      
      , 
      
        0.0
      
      
        );

    UVNodes(
      
      
        3
      
      ).SetCoord(
      
        3.0
      
      , -
      
        2.0
      
      
        );

    UVNodes(
      
      
        4
      
      ).SetCoord(
      
        0.0
      
      , -
      
        2.0
      
      
        );



    triangles(
      
      
        1
      
      ).Set(
      
        2
      
      , 
      
        4
      
      , 
      
        3
      
      
        );

    triangles(
      
      
        2
      
      ).Set(
      
        2
      
      , 
      
        1
      
      , 
      
        4
      
      
        );



    triangulation 
      
      = 
      
        new
      
      
         Poly_Triangulation(triNodes, UVNodes, triangles);

    triangulation
      
      ->
      
        Deflection(deflection);



    Poly::Write(triangulation, std::cout);

    Poly::Write(triangulation, std::cout, 
      
      
        false
      
      
        );



    
      
      
        return
      
      
        0
      
      
        ;

}
      
    

輸出結果如下所示:?

?

      
        Poly_Polygon3D


      
      
        2
      
      
        1
      
      
        0.1
      
      
        1
      
      
        0
      
      
        0
      
      
        2
      
      
        0
      
      
        0
      
      
        0
      
      
        1
      
      
        

Poly_Polygon3D

       
      
      
        2
      
      
         Nodes

with parameters

Deflection : 
      
      
        0.1
      
      
        



Nodes :

         
      
      
        1
      
       :                 
      
        1
      
      
        0
      
      
        0
      
      
        2
      
       :                 
      
        2
      
      
        0
      
      
        0
      
      
        



Parameters :


      
      
        0
      
      
        1
      
      
        

Poly_Triangulation


      
      
        4
      
      
        2
      
      
        1
      
      
        0
      
      
        0
      
      
        0
      
      
        0
      
      
        0
      
      
        0
      
      
        3
      
      
        0
      
      
        2
      
      
        3
      
      
        0
      
      
        2
      
      
        0
      
      
        0
      
      
        0
      
      
        3
      
      
        0
      
      
        3
      
       -
      
        2
      
      
        0
      
       -
      
        2
      
      
        2
      
      
        4
      
      
        3
      
      
        2
      
      
        1
      
      
        4
      
      
        

Poly_Triangulation

       
      
      
        4
      
      
         Nodes

       
      
      
        2
      
      
         Triangles

with UV nodes

Deflection : 
      
      
        0
      
      
        



3D Nodes :

         
      
      
        1
      
       :                 
      
        0
      
      
        0
      
      
        0
      
      
        2
      
       :                 
      
        0
      
      
        0
      
      
        3
      
      
        3
      
       :                 
      
        0
      
      
        2
      
      
        3
      
      
        4
      
       :                 
      
        0
      
      
        2
      
      
        0
      
      
        



UV Nodes :

         
      
      
        1
      
       :                 
      
        0
      
      
        0
      
      
        2
      
       :                 
      
        3
      
      
        0
      
      
        3
      
       :                 
      
        3
      
                      -
      
        2
      
      
        4
      
       :                 
      
        0
      
                      -
      
        2
      
      
        



Triangles :

         
      
      
        1
      
       :          
      
        2
      
      
        4
      
      
        3
      
      
        2
      
       :          
      
        2
      
      
        1
      
      
        4
      
      
        

Press any key to 
      
      
        continue
      
       . . .
    

?

五、結論

通過對OpenCascade中BRep文件中的離散數據的學習,理解顯示用數據結構及其實現。另外發現在類Poly和類BRepTools_ShapeSet中都有對多段線和三角網格進行讀寫的函數,有重復代碼,可以合并簡化。?

?

Representation Data in OpenCascade BRep


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 一区二区三区中文字幕 | 99在线播放视频 | 一本大道久久a久久综合 | 奇米激情网 | 岛国大片免费在线观看 | 成人97在线观看免费高清 | 成年女人免费观看视频 | bt 另类 专区 欧美 制服 | 国产福利午夜自产拍视频在线 | 午夜视频网 | 成人亚州 | 精品日本一区二区 | 国产成人短视频 | 天天操夜夜操免费视频 | 欧美刺激午夜性久久久久久久 | 夜夜嗷 | 欧美日韩亚洲成人 | 亚洲一级毛片免费看 | 人人看97| 中文无码久久精品 | 久久亚洲精品中文字幕二区 | 不卡一区 | 四虎亚洲国产成人久久精品 | 四虎影视永久地址 | 国产在线毛片 | 国产精品亚洲二线在线播放 | 国产精品久久久久久永久牛牛 | 国产免费自拍视频 | 免费一级欧美大片久久网 | 欧美特黄a级高清免费大片 欧美特黄a级猛片a级 | 亚洲免费精品 | 久久精品久久精品久久 | 日韩精品成人 | 日本在线色 | 婷婷六月天激情 | 精品久久一区 | 日本99视频| 在线欧美不卡 | 99热欧美| 久久精品一区二区三区日韩 | 欧美一级毛片免费观看视频 |