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

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) 評(píng)論(6)  編輯 收藏 引用 所屬分類(lèi): 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

與曲線(xiàn)的可視化算法相比,曲面的可視化要稍微復(fù)雜點(diǎn)。總的思路還是很好理解的,那就是把參數(shù)空間三角剖分,再將剖分結(jié)果映射到三維空間,就得到曲面的網(wǎng)格數(shù)據(jù)了。

因?yàn)锽樣條曲面的強(qiáng)凸包性,所以可以對(duì)其參數(shù)空間進(jìn)行三角剖分,再映射到三維空間。這樣可以實(shí)現(xiàn)曲面的可視化,但是還有些問(wèn)題需要處理,如曲面上開(kāi)孔、曲面離散精度控制等。

因?yàn)镺penCascade使用了邊界表示法(BRep),所以通過(guò)Face,Wire,Edge可以得到曲面的參數(shù)范圍,若曲面上有開(kāi)孔,也可通過(guò)Edge的PCurve得到開(kāi)孔在曲面上的參數(shù)表示。將得到的參數(shù)空間進(jìn)行三角剖分,再映射到三維空間中,即可對(duì)邊界表示的形狀進(jìn)行可視化。

用三角網(wǎng)格來(lái)逼近實(shí)際的形狀的精度可以通過(guò)增加或減少參數(shù)空間中的點(diǎn)來(lái)實(shí)現(xiàn)。當(dāng)把參數(shù)空間剖分得密,映射到三維空間中的曲面更逼近真實(shí)的曲面;當(dāng)把參數(shù)空間剖分得疏,映射到三維空間中的曲面就比較粗糙了。

本文主要將OpenCascade中曲面的參數(shù)空間的三角剖分結(jié)果顯示出來(lái),來(lái)分析和理解上述算法。

2. OpenCascade BRep Shape

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

u COMPSOLID由面共享的SOLID組成;

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

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

u FACE是一個(gè)映射(MAP),從矩形的參數(shù)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也是一個(gè)映射,從一維參數(shù)空間U映射到3D空間。(Bezier’s Curve: [0,1] -> R3, NURBS Curve, etc.)

u VERTEX是用來(lái)限制EDGE的;

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

wps_clip_image-14350

Figure 2.1 Shape BRep in OpenCascade

表示上圖的的邊界表示法形成的樹(shù)形結(jié)構(gòu)如下圖所示。由圖可知,有些結(jié)構(gòu)被共享幾次。在OpenCascade中使用類(lèi)TopoDS_Shape來(lái)保存這個(gè)結(jié)構(gòu)。

wps_clip_image-17820

Figure 2.2 Graph structure of the BRep Shape

3. How the Mesh is Generated

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

 

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

當(dāng)曲面上有開(kāi)孔時(shí),開(kāi)孔的信息可以通過(guò)WIRE來(lái)獲得。對(duì)于組成開(kāi)孔的WIRE的每條EDGE,可以通過(guò)曲面上的曲線(xiàn)PCurve來(lái)將開(kāi)孔的參數(shù)統(tǒng)一到曲面的UV參數(shù)空間。實(shí)現(xiàn)的偽代碼如下所示:

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限制的曲面的參數(shù)空間UV進(jìn)行三角剖分,若其中有開(kāi)孔的信息,則將形成孔的WIRE內(nèi)部的三角形去掉。將參數(shù)空間的三角剖分映射到三維空間,即可得到曲面的三角剖分網(wǎng)格。如下圖所示:

wps_clip_image-1352

Figure 3.3 Hole in Surface

對(duì)組成COMPSOLID的每個(gè)FACE進(jìn)行剖分,最后就得到COMPSOLID的網(wǎng)格。實(shí)現(xiàn)的偽代碼如下所示:

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

形狀通過(guò)三角網(wǎng)格來(lái)逼近顯示,所以當(dāng)離散精度越高時(shí),顯示越逼真,但是產(chǎn)生的數(shù)據(jù)量大;離散精度越低時(shí),顯示越失真,但是產(chǎn)生的數(shù)據(jù)量小。正如莎翁所說(shuō):To be or not to be: that is the question。面對(duì)選擇時(shí),不走極端,中庸之道也是個(gè)不錯(cuò)的解決方法。在顯示逼真程度與數(shù)據(jù)量的大小之間做個(gè)平衡,實(shí)體三角剖分的算法需要考慮的地方。

在OpenCascade中曲面的三角剖分的網(wǎng)格數(shù)據(jù)都保存在類(lèi)Poly_Triangulation中,也包括曲面的參數(shù)空間的剖分,參數(shù)結(jié)點(diǎn)數(shù)據(jù)是UVNodes。如下代碼所示為將曲面的參數(shù)空間三角剖分結(jié)果可視化:

 

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();
}

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

wps_clip_image-8530

從圖中還可以看出,對(duì)球面的參數(shù)空間進(jìn)行剖分時(shí),只在V方向加入了一些點(diǎn),而在U方向沒(méi)有增加。

wps_clip_image-668

Figure 4.1 Triangulation of the Sphere parametric space

當(dāng)增加離散精度后,顯示得更逼真,但產(chǎn)生了更多的網(wǎng)格數(shù)據(jù),如下圖所示:

wps_clip_image-25084

Figure 4.2 Triangulation of the Sphere

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

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

從圖中可以看出,將參數(shù)空間均勻剖分后,映射到三維空間后,在球面的兩個(gè)極點(diǎn)處,顯示出來(lái)有些密集,在軌道線(xiàn)附近,比較稀疏。

同一個(gè)曲面,當(dāng)剖分得密集時(shí),顯示得細(xì)膩,如下圖所示:

wps_clip_image-8630

Figure 4.5 Triangulation of a Shape by Netgen

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

wps_clip_image-5927

Figure 4.6 Triangulation of a Shape by OpenCascade

在OpenCascade中只是把邊的離散點(diǎn)組成了三角形,沒(méi)有優(yōu)化,但是用于顯示也還不錯(cuò),且數(shù)據(jù)量也很小。當(dāng)程序要處理的模型很多時(shí),減少三角網(wǎng)格的數(shù)量,將會(huì)明顯提高顯示速度。所以在對(duì)實(shí)體進(jìn)行網(wǎng)格剖分時(shí),需要根據(jù)實(shí)際需要,選擇折中的,和諧的算法。即若對(duì)網(wǎng)格剖分質(zhì)量要求較高(如用于有限元分析),模型量少,可以將實(shí)體剖分得精細(xì);若模型量很大,又對(duì)顯示速度要求較高,在網(wǎng)格剖分算法中可以選擇產(chǎn)生數(shù)據(jù)量小的算法。

上述形狀的渲染模式如下圖所示。雖然剖分中也有很多細(xì)長(zhǎng)的三角形,但當(dāng)把網(wǎng)格的頂點(diǎn)法向設(shè)置正確后,用于顯示已經(jīng)足夠。三角形的數(shù)量明顯要少很多。

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

將形狀中曲面的參數(shù)空間三角剖分后,再映射到三維空間即可得到形狀的剖分網(wǎng)格。當(dāng)形狀上有開(kāi)孔時(shí),通過(guò)邊界表示法,可以得到孔的數(shù)據(jù)。通過(guò)曲面上的曲線(xiàn)PCurve,可將孔與面統(tǒng)一到參數(shù)空間進(jìn)行剖分。

網(wǎng)格的質(zhì)量與離散精度的控制是個(gè)問(wèn)題。根據(jù)需要來(lái)對(duì)形狀進(jìn)行網(wǎng)格化。當(dāng)把參數(shù)空間均勻剖分時(shí),產(chǎn)生的曲面不一定均勻。所以,也應(yīng)該存在與曲線(xiàn)離散化類(lèi)似的算法,即在曲率較大的地方,剖分的密集;在很平的地方,剖分粗。這樣來(lái)對(duì)顯示與速度之間做個(gè)平衡。

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  回復(fù)  更多評(píng)論   

2014-05-04 10:47 by Mr Li
寫(xiě)的很不錯(cuò)。請(qǐng)問(wèn)你的netgen編譯很容易么?我的錯(cuò)誤很多

# re: Mesh Algorithm in OpenCascade  回復(fù)  更多評(píng)論   

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

@Mr Li

# re: Mesh Algorithm in OpenCascade  回復(fù)  更多評(píng)論   

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

# re: Mesh Algorithm in OpenCascade  回復(fù)  更多評(píng)論   

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

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

# re: Mesh Algorithm in OpenCascade  回復(fù)  更多評(píng)論   

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

# re: Mesh Algorithm in OpenCascade  回復(fù)  更多評(píng)論   

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

根據(jù)TopoDS_Shape的數(shù)據(jù)結(jié)構(gòu)定義可知,遍歷的順序可能是構(gòu)造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>
            亚洲成人在线网站| 亚洲一级影院| 国产精品免费一区二区三区观看 | 欧美.日韩.国产.一区.二区| 亚洲福利免费| 亚洲自拍偷拍麻豆| 欧美不卡激情三级在线观看| 在线日本欧美| 久久福利视频导航| 日韩一级在线| 欧美va亚洲va香蕉在线| 尤物九九久久国产精品的分类| 亚洲性感美女99在线| 亚洲高清视频中文字幕| 欧美国产一区二区在线观看 | 尤物九九久久国产精品的分类| 亚洲欧美国产精品va在线观看| 欧美在线免费观看视频| 亚洲欧美日韩国产中文| 欧美日韩在线精品一区二区三区| 在线欧美福利| 久久夜色精品国产亚洲aⅴ| 久久本道综合色狠狠五月| 国产精品你懂的在线| 亚洲午夜精品福利| 99pao成人国产永久免费视频| 欧美日本在线| 一区二区精品| 99精品福利视频| 欧美日韩一区视频| 久久精品国产第一区二区三区| 一本色道久久99精品综合| 欧美日韩国产成人高清视频| 亚洲精品一区二区三区福利| 亚洲欧美激情在线视频| 在线中文字幕不卡| 国产精品久久久久7777婷婷| 亚欧成人精品| 久久国产福利| 一本色道精品久久一区二区三区| 亚洲精品综合| 国产精品日韩欧美一区二区| 久久精品国产欧美激情| 一本久久综合| 国产精品社区| 99re6这里只有精品| 亚洲性视频网站| 久久三级视频| 亚洲精品视频中文字幕| 亚洲欧洲日本一区二区三区| 欧美人妖在线观看| 美女爽到呻吟久久久久| 免费毛片一区二区三区久久久| 亚洲成人在线| 国产精品久久久久一区二区三区| 美女视频一区免费观看| 国产精品99免费看 | 欧美激情第三页| 国产精品久久国产精品99gif| 国产精品一区二区在线| 亚洲黄色在线| 欧美日韩精品中文字幕| 亚洲欧洲日韩综合二区| 欧美高清不卡在线| 久久久久久久成人| 亚洲女ⅴideoshd黑人| 欧美日韩国产在线一区| 亚洲精品免费在线观看| 亚洲视频在线观看一区| 国产精品福利网| 国产日韩欧美日韩大片| 精品粉嫩aⅴ一区二区三区四区| 久久久久久久一区二区三区| 另类综合日韩欧美亚洲| 夜夜嗨av一区二区三区免费区| 亚洲丰满少妇videoshd| 一区二区不卡在线视频 午夜欧美不卡' | 在线午夜精品自拍| 欧美在线播放视频| 亚洲欧美日韩直播| 久久一区二区三区国产精品| 国产日韩av一区二区| 一区二区三区精品| 亚洲日韩欧美视频一区| 一区二区三区产品免费精品久久75| 永久91嫩草亚洲精品人人| 亚洲在线观看免费| 亚洲免费网站| 欧美日韩久久久久久| 91久久精品美女高潮| 国产伦精品一区| 9人人澡人人爽人人精品| 日韩西西人体444www| 欧美成人免费在线观看| 欧美激情按摩在线| 亚洲欧洲在线一区| 欧美国产成人精品| 亚洲卡通欧美制服中文| 日韩视频亚洲视频| 欧美日韩一区二区三区四区五区 | 久久免费的精品国产v∧| 国产精品一香蕉国产线看观看 | 激情欧美亚洲| 久久丁香综合五月国产三级网站| 欧美专区日韩专区| 国产亚洲精品自拍| 久久久久久久综合色一本| 久久久福利视频| 国产一区日韩一区| 乱中年女人伦av一区二区| 亚洲激情成人在线| 亚洲少妇在线| 国产精品高清在线观看| 亚洲免费婷婷| 农夫在线精品视频免费观看| 91久久精品国产91性色| 欧美伦理一区二区| 一本久久青青| 久久国产天堂福利天堂| 亚洲国产精品热久久| 免费看的黄色欧美网站| 99re6这里只有精品| 亚洲欧美精品一区| 久久精品一本| 男人插女人欧美| 亚洲国产高清高潮精品美女| 亚洲美女av网站| 国产精品久久久久99| 久久久噜噜噜久久| 亚洲精品一区二区网址| 欧美在线中文字幕| 亚洲级视频在线观看免费1级| 欧美视频成人| 久久嫩草精品久久久精品| 99国产精品久久久久久久久久 | 国产精品美腿一区在线看 | 久久亚洲精品一区| 亚洲经典自拍| 国产精品久久久久久亚洲调教| 久久精品99国产精品酒店日本| 亚洲成人在线网| 欧美亚洲免费在线| 亚洲国产日韩一区| 国产精品色在线| 欧美女人交a| 午夜亚洲精品| 亚洲精品免费观看| 麻豆精品视频在线观看| 亚洲一区二区三区在线看 | 亚洲日本欧美天堂| 国产精品久久久久久户外露出| 美国十次了思思久久精品导航| 亚洲视频导航| 亚洲国产日韩欧美综合久久 | 亚洲国产精品一区二区第四页av| 欧美日韩一区二区视频在线观看 | 久久久久久电影| 一本大道久久a久久综合婷婷| 狂野欧美性猛交xxxx巴西| 亚洲综合日韩在线| 999亚洲国产精| 亚洲成色最大综合在线| 国产精品人人做人人爽| 久久在线91| 香蕉亚洲视频| 亚洲在线中文字幕| 亚洲综合电影| 亚洲午夜成aⅴ人片| 男女激情久久| 久久午夜电影网| 久久久国产一区二区| 尤物精品在线| 亚洲第一网站| 亚洲第一成人在线| 在线视频国产日韩| 一区二区三区在线免费视频| 国产一区二区三区丝袜| 国产视频在线观看一区二区| 国产精品久久久久久av福利软件| 欧美三级视频| 欧美午夜电影网| 国产精品激情电影| 国产精品美女久久久久久久| 国产精品理论片在线观看| 国产精品久久久久久久久免费桃花| 欧美日韩亚洲激情| 国产精品xxxxx| 国产精品视频专区| 国产欧美在线观看| 国产精品成av人在线视午夜片| 欧美日韩一卡| 欧美视频在线观看| 国产精品色一区二区三区| 国产日韩亚洲欧美| 国产视频在线观看一区| 好吊妞**欧美| 亚洲人成久久| 亚洲视频狠狠| 欧美一级精品大片| 久久一二三区|