青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

Mesh Algorithm in OpenCascade

Posted on 2014-04-06 14:56 eryar 閱讀(7888) 評論(6)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

Mesh Algorithm in OpenCascade

eryar@163.com

Abstract. Rendering a generic surface is a two steps process: first, computing the points that will form the mesh of the surface and then, send this mesh to 3D API. Use the Triangle to triangulate the parametric space and then lifting map to the model 3D space. This is the main method to visualize the generic shaded surface. This paper show the OpenCascade triangulation of the parametric space and  the map result: mesh in 3D model space. Use the method can visualize a generic surface.

Key words. Delaunay Triangulation, Tessellation, Mesh, OpenCascade, Shaded Surface

1. Introduction

與曲線的可視化算法相比,曲面的可視化要稍微復雜點??偟乃悸愤€是很好理解的,那就是把參數空間三角剖分,再將剖分結果映射到三維空間,就得到曲面的網格數據了。

因為B樣條曲面的強凸包性,所以可以對其參數空間進行三角剖分,再映射到三維空間。這樣可以實現曲面的可視化,但是還有些問題需要處理,如曲面上開孔、曲面離散精度控制等。

因為OpenCascade使用了邊界表示法(BRep),所以通過Face,Wire,Edge可以得到曲面的參數范圍,若曲面上有開孔,也可通過Edge的PCurve得到開孔在曲面上的參數表示。將得到的參數空間進行三角剖分,再映射到三維空間中,即可對邊界表示的形狀進行可視化。

用三角網格來逼近實際的形狀的精度可以通過增加或減少參數空間中的點來實現。當把參數空間剖分得密,映射到三維空間中的曲面更逼近真實的曲面;當把參數空間剖分得疏,映射到三維空間中的曲面就比較粗糙了。

本文主要將OpenCascade中曲面的參數空間的三角剖分結果顯示出來,來分析和理解上述算法。

2. OpenCascade BRep Shape

在OpenCascade中實體的邊界表示法(BRep)為:

u COMPSOLID由面共享的SOLID組成;

u SOLID(Cylinder, Cone, Sphere, Torus, etc.)由SHELLS分隔出來的體(Volume);

u SHELL由邊Edges相連的FACES組成;

u FACE是一個映射(MAP),從矩形的參數UV空間映射到3D空間。(Cylinder: [0, 2*PI] x[0, H] -> R3,Cone, Sphere, Torus, Bezier Surface, NURBS Surface, etc.)

u FACE的邊界由WIRE組成;

u WIRE由相連的EDGES組成;

u EDGE也是一個映射,從一維參數空間U映射到3D空間。(Bezier’s Curve: [0,1] -> R3, NURBS Curve, etc.)

u VERTEX是用來限制EDGE的;

邊界表示法(BRep)形成了不同SHAPES(CompSolid, Solid, Shell, Face, Wire, Edge, Vertex)之間的一個圖結構(a structure of GRAPH),如下圖所示:

wps_clip_image-14350

Figure 2.1 Shape BRep in OpenCascade

表示上圖的的邊界表示法形成的樹形結構如下圖所示。由圖可知,有些結構被共享幾次。在OpenCascade中使用類TopoDS_Shape來保存這個結構。

wps_clip_image-17820

Figure 2.2 Graph structure of the BRep Shape

3. How the Mesh is Generated

OpenCascade中可以遍歷COMPSOLID不同的子形狀。首先,將EDGE離散化,實現的偽代碼如下所示:

 

for (TopExp_Explorer edgeExp(theCompSolid, TopAbs_EDGE); 
    edgeExp.More(); 
    edgeExp.Next())
{
    
// The U-interval of the EDGE is subdivided into
    
// segments with respect to the edge length and 
    
// deflection in 3D-space. By the map, the segments
    
// of the U-interval give the segments in 3D-Space.
    const TopoDS_Edge& theEdge = TopoDS::Edge(edgeExp.Current());
    BRepAdaptor_Curve BAC(theEdge);
    
    GCPnts_TangentialDeflection thePointsOnCurve;
    thePointsOnCurve.Initialize(BAC, aDeflection, cDeflection);
    Standard_Real u 
= 0.0;
    gp_Pnt aPoint;
    
for (Standard_Integer i = 1; i <= thePointsOnCurve.NbPoints(); ++i)
    {
        u 
= thePointsOnCurve.Parameter(i);
        aPoint 
= thePointsOnCurve.Value(i);
    }
}

使用上述算法將每條EDGE離散化,如下圖所示:

wps_clip_image-636

Figure 3.1 Creation of U-Mesh and 3D-Mesh for each EDGE

當曲面上有開孔時,開孔的信息可以通過WIRE來獲得。對于組成開孔的WIRE的每條EDGE,可以通過曲面上的曲線PCurve來將開孔的參數統一到曲面的UV參數空間。實現的偽代碼如下所示:

for (TopExp_Explorer faceExp(theCompSolid, TopAbs_FACE);
    faceExp.More();
    faceExp.Next())
{
    
for (TopExp_Explorer wireExp(faceExp.Current(), TopAbs_WIRE); 
        wireExp.More();
        wireExp.Next())
    {
        
for (TopExp_Explorer edgeExp(wireExp.Current(), TopAbs_EDGE);
            edgeExp.More();
            edgeExp.Next())
        {
            
// The U-Mesh of the EDGE is assembled after scaling in the
            
// UV-domain to constitute the WIRE.
            Standard_Real theFirst = 0.0;
            Standard_Real theLast 
= 0.0;
            gp_Pnt2d theUV;
            
            Handle_Geom2d_Curve thePCurve 
= 
                BRep_Tool::CurveOnSurface(theEdge, theFace, theFirst, theLast);
                
            theUV 
= thePCurve.Value(theFirst);
        }
    }
}

wps_clip_image-3824

Figure 3.2 Hole in Parametric UV space

將WIRE限制的曲面的參數空間UV進行三角剖分,若其中有開孔的信息,則將形成孔的WIRE內部的三角形去掉。將參數空間的三角剖分映射到三維空間,即可得到曲面的三角剖分網格。如下圖所示:

wps_clip_image-1352

Figure 3.3 Hole in Surface

對組成COMPSOLID的每個FACE進行剖分,最后就得到COMPSOLID的網格。實現的偽代碼如下所示:

for (TopExp_Explorer faceExp(theCompSolid, TopAbs_FACE);
    faceExp.More();
    faceExp.Next())
{
    
// The 3d-mesh of the FACE is assembled to form the
    
// boundary of the SOLID.
}

 

wps_clip_image-24663

Figure 3.4 Mesh of the Shape

4. Deflection Control

形狀通過三角網格來逼近顯示,所以當離散精度越高時,顯示越逼真,但是產生的數據量大;離散精度越低時,顯示越失真,但是產生的數據量小。正如莎翁所說:To be or not to be: that is the question。面對選擇時,不走極端,中庸之道也是個不錯的解決方法。在顯示逼真程度與數據量的大小之間做個平衡,實體三角剖分的算法需要考慮的地方。

在OpenCascade中曲面的三角剖分的網格數據都保存在類Poly_Triangulation中,也包括曲面的參數空間的剖分,參數結點數據是UVNodes。如下代碼所示為將曲面的參數空間三角剖分結果可視化:

 

osg::Geode* BuildUVMesh(const Handle_Poly_Triangulation& theMesh)
{
    osg::ref_ptr
<osg::Geode> theGeode = new osg::Geode();
    osg::ref_ptr
<osg::Geometry> theTriangles = new osg::Geometry();
    osg::ref_ptr
<osg::Vec3Array> theVertices = new osg::Vec3Array();

    
for (Standard_Integer t = 1; t <= theMesh->NbTriangles(); ++t)
    {
        
const Poly_Triangle& theTriangle = theMesh->Triangles().Value(t);

        gp_Pnt2d theUV1 
= theMesh->UVNodes().Value(theTriangle(1));
        gp_Pnt2d theUV2 
= theMesh->UVNodes().Value(theTriangle(2));
        gp_Pnt2d theUV3 
= theMesh->UVNodes().Value(theTriangle(3));

        theVertices
->push_back(osg::Vec3(theUV1.X(), 0.0, theUV1.Y()));
        theVertices
->push_back(osg::Vec3(theUV2.X(), 0.0, theUV2.Y()));
        theVertices
->push_back(osg::Vec3(theUV3.X(), 0.0, theUV3.Y()));
    }

    theTriangles
->setVertexArray(theVertices.get());
  theTriangles
->addPrimitiveSet(
      
new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, 0, theVertices->size()));

    osgUtil::SmoothingVisitor smv;
    smv.smooth(
*theTriangles);

    theGeode
->addDrawable(theTriangles);

    
return theGeode.release();
}

如下圖所示,將球面參數空間的三角剖分顯示出來。由球面的參數方程可知其參數空間的范圍,U從0到2PI,V從-PI/2到PI/2。

wps_clip_image-8530

從圖中還可以看出,對球面的參數空間進行剖分時,只在V方向加入了一些點,而在U方向沒有增加。

wps_clip_image-668

Figure 4.1 Triangulation of the Sphere parametric space

當增加離散精度后,顯示得更逼真,但產生了更多的網格數據,如下圖所示:

wps_clip_image-25084

Figure 4.2 Triangulation of the Sphere

從上圖可知,將參數空間剖分的越細密,顯示的效果越逼真。由上圖還可知,OpenCascade對球面的參數空間剖分也不是很均勻,有很密集的區域,也是相對稀疏的區域。如果將參數空間均勻剖分,映射到三維空間曲面上時,顯示效果也不是很均勻。如下圖所示為較理想的球面的剖分網格:

wps_clip_image-10834

Figure 4.3 Triangulation of the Sphere Generated by Netgen

wps_clip_image-3423

Figure 4.4 Triangulation of the Sphere

從圖中可以看出,將參數空間均勻剖分后,映射到三維空間后,在球面的兩個極點處,顯示出來有些密集,在軌道線附近,比較稀疏。

同一個曲面,當剖分得密集時,顯示得細膩,如下圖所示:

wps_clip_image-8630

Figure 4.5 Triangulation of a Shape by Netgen

在OpenCascade中得到的剖分結果如下圖所示:

wps_clip_image-5927

Figure 4.6 Triangulation of a Shape by OpenCascade

在OpenCascade中只是把邊的離散點組成了三角形,沒有優化,但是用于顯示也還不錯,且數據量也很小。當程序要處理的模型很多時,減少三角網格的數量,將會明顯提高顯示速度。所以在對實體進行網格剖分時,需要根據實際需要,選擇折中的,和諧的算法。即若對網格剖分質量要求較高(如用于有限元分析),模型量少,可以將實體剖分得精細;若模型量很大,又對顯示速度要求較高,在網格剖分算法中可以選擇產生數據量小的算法。

上述形狀的渲染模式如下圖所示。雖然剖分中也有很多細長的三角形,但當把網格的頂點法向設置正確后,用于顯示已經足夠。三角形的數量明顯要少很多。

wps_clip_image-7843

Figure 4.7 Shaded mode of the Shape

wps_clip_image-4917

Figure 4.8 Shaded Mode in OpenCascade

5. Conclusions

將形狀中曲面的參數空間三角剖分后,再映射到三維空間即可得到形狀的剖分網格。當形狀上有開孔時,通過邊界表示法,可以得到孔的數據。通過曲面上的曲線PCurve,可將孔與面統一到參數空間進行剖分。

網格的質量與離散精度的控制是個問題。根據需要來對形狀進行網格化。當把參數空間均勻剖分時,產生的曲面不一定均勻。所以,也應該存在與曲線離散化類似的算法,即在曲率較大的地方,剖分的密集;在很平的地方,剖分粗。這樣來對顯示與速度之間做個平衡。

6. References

1. Alain PERRONNET. NEF: A Mesher based on OpenCascade C.A.D software

https://www.ljll.math.upmc.fr/~perronnet/mit/mit.html

2. Kelly Dempski. Focus on Curves and Surfaces. Premier Press 2003

Feedback

# re: Mesh Algorithm in OpenCascade  回復  更多評論   

2014-05-04 10:47 by Mr Li
寫的很不錯。請問你的netgen編譯很容易么?我的錯誤很多

# re: Mesh Algorithm in OpenCascade  回復  更多評論   

2014-05-04 15:41 by eryar
編譯netgen還好,做些配置,編譯還是比較順利。
可以參考這個blog:
http://m.shnenglu.com/eryar/archive/2014/01/01/205102.html

@Mr Li

# re: Mesh Algorithm in OpenCascade  回復  更多評論   

2017-04-15 09:20 by Sirius
您好,我有一個小問題有點分不清。
是關于TopExp_Explorer這個TopoDS_Shape的遍歷器的使用方法。
目前我見到了兩種寫法。
一個是TopExp_Explorer AEXP(const TopoDS_Shape& S,const TopAbs_ShapeEnum ToFind)這種方法。
還有一種是先定義TopExp_Explorer EX,然后在for函數中for (EX.Init(ts, TopAbs_VERTEX); EX.More(); EX.Next())。
這兩種我不知道有什么區別,麻煩您有空的時候講解一下,不勝感激。

# re: Mesh Algorithm in OpenCascade  回復  更多評論   

2017-04-17 09:10 by eryar
@Sirius
建議你先看看Iterator模式,再看看TopExp_Explorer的頭文件,應該會理解了。

這篇文章最后有部分Iterator的介紹,可以看看:
https://wenku.baidu.com/view/92524de981c758f5f61f678f.html

# re: Mesh Algorithm in OpenCascade  回復  更多評論   

2017-04-17 17:04 by Sirius
@eryar
恩恩,我大致明白了。
但是還有一個小問題,就是使用這個TopExp_Explorer迭代器進行遍歷的時候,有什么遍歷的順序么?他所初始化的容器里儲存的順序是什么呀?

# re: Mesh Algorithm in OpenCascade  回復  更多評論   

2017-04-18 15:23 by eryar
@Sirius

根據TopoDS_Shape的數據結構定義可知,遍歷的順序可能是構造TopoDS_Shape的順序。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久国产精品人| 亚洲欧美日韩国产中文在线| 久久综合激情| 久久精品国语| 久久久精品日韩欧美| 久久免费国产| 欧美精品日韩www.p站| 欧美日本一道本| 国产精品高潮视频| 国产综合婷婷| 亚洲精品资源美女情侣酒店| 亚洲小说春色综合另类电影| 午夜精品久久久久久久99樱桃 | 99日韩精品| 亚洲一区二区三区中文字幕在线 | 亚洲午夜免费视频| 欧美一区二区三区在线视频| 久久久夜色精品亚洲| 亚洲国产精品999| 欧美成在线视频| 亚洲裸体在线观看| 性亚洲最疯狂xxxx高清| 久久一二三国产| 国产精品a久久久久久| 国产精品自拍小视频| 亚洲国产精品嫩草影院| 亚洲欧美日韩成人高清在线一区| 久久综合九色综合久99| 中文精品一区二区三区| 久久综合色88| 国产日韩在线一区| 在线一区观看| 亚洲欧美久久久| 亚洲一级免费视频| 欧美在线视频一区二区| 欧美精品一区在线播放| 国产欧美日韩在线视频| 日韩视频免费看| 老司机免费视频一区二区三区| 一本色道久久综合| 欧美高清视频www夜色资源网| 国产麻豆精品视频| 亚洲视频在线二区| 亚洲国产高清一区| 美女免费视频一区| 韩国三级在线一区| 欧美专区亚洲专区| 亚洲午夜精品一区二区| 欧美日韩国产影院| 亚洲免费观看| 亚洲国产精品悠悠久久琪琪 | 久久久久成人精品| 亚洲午夜羞羞片| 欧美日韩一区二区三区在线观看免 | 久久本道综合色狠狠五月| 欧美视频1区| 一区二区三区精品| 亚洲三级国产| 欧美精品91| 日韩午夜中文字幕| 亚洲国产午夜| 欧美成人官网二区| 亚洲黄色三级| 亚洲黄色在线观看| 欧美精品v日韩精品v国产精品| 日韩一级片网址| 亚洲另类一区二区| 欧美三级免费| 欧美一区二区精品在线| 性欧美超级视频| 激情综合色丁香一区二区| 久久在线免费观看视频| 久久久久久久久久码影片| 1000部国产精品成人观看| 亚洲电影毛片| 欧美午夜在线一二页| 小辣椒精品导航| 久久久久在线| 日韩视频在线观看国产| 这里只有精品丝袜| 国内精品嫩模av私拍在线观看 | 欧美成年人视频网站| 久久在线播放| aa级大片欧美三级| 亚洲在线1234| 在线观看一区二区视频| 欧美大胆成人| 国产午夜亚洲精品理论片色戒| 欧美亚洲综合另类| 欧美一级成年大片在线观看| 狠狠久久五月精品中文字幕| 欧美成年人视频| 欧美午夜电影网| 久久综合久久综合久久| 欧美极品欧美精品欧美视频| 性一交一乱一区二区洋洋av| 久久婷婷综合激情| 亚洲一区二区欧美| 久久久久国产一区二区| 一本色道久久加勒比精品| 欧美一区二区| 一区二区免费在线播放| 久久国产精品一区二区| 国产精品99久久久久久宅男| 久久精品99无色码中文字幕| 在线性视频日韩欧美| 久久久久**毛片大全| 亚洲一区二区在线看| 久久中文欧美| 久久国产一区| 国产精品第十页| 亚洲人成欧美中文字幕| 黄色资源网久久资源365| 在线亚洲免费| 9国产精品视频| 美女黄毛**国产精品啪啪 | 一区电影在线观看| 久久爱www.| 欧美一区二区三区免费观看视频 | 欧美v亚洲v综合ⅴ国产v| 欧美在线不卡视频| 欧美性猛交xxxx免费看久久久 | 亚洲欧洲精品一区二区三区 | 91久久在线视频| 在线观看中文字幕不卡| 午夜一区在线| 羞羞答答国产精品www一本 | 亚洲毛片在线看| 久久精品一二三| 久久久噜噜噜久久| 国产亚洲精品一区二区| 亚洲男女自偷自拍| 亚洲欧美久久久| 国产精品v欧美精品v日本精品动漫 | 欧美成人日韩| 亚洲高清不卡一区| 亚洲高清在线播放| 久久久久久自在自线| 国产一区二区成人| 欧美一级在线视频| 久久久精品一区| 影音先锋中文字幕一区| 久久蜜桃香蕉精品一区二区三区| 久久人人爽国产| 在线精品视频免费观看| 美女日韩欧美| 亚洲精品偷拍| 亚洲欧美日韩一区在线| 欧美日韩成人精品| 久久精品国产精品| 1024成人网色www| 欧美在线影院| 美女尤物久久精品| 亚洲国产你懂的| 欧美区高清在线| 亚洲理伦电影| 欧美电影免费观看大全| 麻豆精品网站| 欧美日韩一区二区三区高清| 免费成人小视频| **性色生活片久久毛片| 欧美成人精品1314www| 久久夜色精品一区| 亚洲欧洲一级| 欧美性jizz18性欧美| 亚洲视频播放| 久久一区二区三区四区| 亚洲精品日韩欧美| 国产精品久久久久久五月尺| 香蕉久久精品日日躁夜夜躁| 欧美 日韩 国产在线| 亚洲最新色图| 国产一区二区你懂的| 欧美国产专区| 亚洲摸下面视频| 亚洲国产日韩精品| 欧美亚洲在线| 日韩一区二区高清| 激情亚洲一区二区三区四区| 欧美日韩国产综合视频在线观看中文 | 国内精品久久久久久久97牛牛| 免费视频一区| 亚洲欧美在线网| 亚洲精品国产欧美| 久久久噜噜噜久久中文字免| 99精品视频免费全部在线| 国产一在线精品一区在线观看| 欧美精品一区二区蜜臀亚洲| 欧美中文字幕在线播放| 99精品国产福利在线观看免费| 老司机午夜精品视频| 午夜精品www| 一区二区日韩欧美| 亚洲国产另类久久精品| 国产午夜精品视频| 欧美三级中文字幕在线观看| 免费人成精品欧美精品| 欧美在线你懂的| 国产精品99久久久久久宅男| 亚洲高清一二三区|