欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

OpenCASCADE Hidden Line Removal

系統(tǒng) 2050 0

OpenCASCADE Hidden Line Removal

eryar@163.com

Abstract. To provide the precision required in industrial design, drawings need to offer the possibility of removing lines, which are hidden in a given projection. OpenCASCADE provides two algorithms for this Hidden Line Removal component. The paper mainly translate the document of OpenCASCADE Modeling Algorithms, and give some applications in the plant design CAD software.

Key Words. OpenCASCADE, HLR, Hidden Line Removal

1. Introduction

用 計(jì)算機(jī)生成三維物體的真實(shí)圖形是計(jì)算機(jī)圖形學(xué)研究的重要內(nèi)容,在用顯示設(shè)備描述物體時(shí),必須把三維的信息經(jīng)過(guò)某種投影變換,在二維的顯示平面上繪制出來(lái)。 由于投影變換失去了深度信息,往往導(dǎo)致圖形的二義性。要消除這類二義性,就必須在繪制時(shí)消除被遮擋的不可見(jiàn)的線或面,習(xí)慣上稱之為消除隱藏線 (Hidden Line Removal)或消除隱藏面(Hidden Face Removal)。在工程應(yīng)用中,需要根據(jù)三維模型自動(dòng)生成二維的圖紙,用于指導(dǎo)生產(chǎn)。其中二維圖紙中主要包括三維模型的消隱圖、尺寸標(biāo)注及件號(hào)標(biāo)注等內(nèi) 容。如圖1.1所示為某CAD軟件中自動(dòng)根據(jù)三維模型生成二維圖紙的效果圖:

wps_clip_image-698

Figure 1.1 Drawing generated from 3D model by PDMS

上圖1.1所示為PDMS軟件中自動(dòng)生成的圖紙,圖紙中的圖形區(qū)的管道模型就是根據(jù)三維模型自動(dòng)投影及消隱后生成的。還生成尺寸標(biāo)注及管道名稱,以及右上角所件號(hào)標(biāo)示或材料表等相關(guān)信息。

盡管現(xiàn)在3D PDF格式很流行,但是二維的生產(chǎn)圖紙?jiān)谀壳皣?guó)內(nèi)的設(shè)計(jì)及施工單位中還是不可或缺的。當(dāng)模型量大時(shí),消隱速度快及自動(dòng)生成的標(biāo)注文字排列整齊(或滿足工程習(xí)慣)成了二維圖紙自動(dòng)生成的核心技術(shù),也是程序處理中的難點(diǎn)。

消隱算法的原理其實(shí)很簡(jiǎn)單,只要滿足兩個(gè)條件:

v 物體A在物體B的后面;

v 物體A與物體B在投影平面上有重疊部分;

前 一個(gè)條件實(shí)際上是廣義的,既可以是物體,也可以是面或線等。命題物體A在物體B后面成立,消隱計(jì)算就變成一個(gè)二維問(wèn)題:物體A與物體B在投影平面上的重疊 部分就是A被消除的部分。經(jīng)過(guò)投影變換后,物體在投影平面上所占據(jù)的區(qū)域稱為物體的落影區(qū),物體上任何一點(diǎn)的投影均落在此落影區(qū)內(nèi)。顯然,若空間有兩個(gè)物 體的落影區(qū)是重疊的,則位于后面的物體將被前面的物體遮擋,被遮擋的部分就是落影區(qū)重疊的部分。消隱過(guò)程就是求取兩者的公共部分,且由第三維深度坐標(biāo)來(lái)判 斷兩者的前后的過(guò)程。因?yàn)槭蔷€輸出,這個(gè)過(guò)程就是一條條線與每一物體(面)的比較過(guò)程,最后可見(jiàn)部分的交集即為此線的最終可見(jiàn)部分。

OpenCASCADE 提供了兩種消隱算法:HLRBRep_Algo和HLRBRep_PolyAlgo。這些算法都是基于相同的原理:比較形狀每條邊相對(duì)每個(gè)面的可見(jiàn)性,并 計(jì)算每條邊的可見(jiàn)部分與消隱部分。算法通過(guò)計(jì)算在指定投影方向上的物體顯示特性,去除或標(biāo)記被面遮擋的邊。這兩個(gè)算法也與一些提取功能配合使用,如重構(gòu)一 個(gè)簡(jiǎn)化的模型等,簡(jiǎn)化后新的模型由邊組成,就是在投影方向上的輪廓線。

HLRBRep_Algo是根據(jù)模型來(lái)計(jì)算的一種高精度的算法,而 HLRBRep_PolyAlgo是基于離散數(shù)據(jù)的算法。當(dāng)使用HLRBRep_Algo時(shí)可以得到精確結(jié)果,而使用HLRBRep_PolyAlgo可 以提高計(jì)算速度。他們兩個(gè)算法都可以處理任意類型的模型,如組合體、面或線,但也有些約束,如下情況就未被處理:

v 點(diǎn)未被處理;

v Z平面上沒(méi)有被裁剪;

v 無(wú)限面或線沒(méi)有處理;

如圖1.2所示為OpenCASCADE中的一些邊的定義:

wps_clip_image-21746

Figure 1.2 Sharp, smooth and sewn edges in a simple screw shape

圖1.3中的實(shí)線為同相形狀的外輪廓線,虛線部分為等分參數(shù)線。

wps_clip_image-12863

Figure 1.3 Outline edges and isoparameters in the same shape

wps_clip_image-8933

Figure 1.4 An extraction showing hidden sharp edges

如圖1.4可以看出,藍(lán)色虛線即為被遮擋的應(yīng)該被去除的線。

2.HLR Usage

OpenCASCADE隱藏線去除算法的使用涉及以下幾個(gè)步驟:

2.1 Loading Shapes

通過(guò)使用HLRBRep_Algo::Add()函數(shù)來(lái)將需要被消隱的形狀加入到消隱算法中去。對(duì)于HLRBRep_PolyAlgo對(duì)象,使用HLRBRep_PolyAlgo::Load()函數(shù)來(lái)添加一個(gè)或多個(gè)需要處理的形狀。

2.2 Setting View Parameters

通過(guò)函數(shù)HLRBRep_PolyAlgo::Projector()來(lái)設(shè)置投影方向,其參數(shù)為一個(gè)HLRAlgo_Projector對(duì)象。一般會(huì)根據(jù)三維視圖數(shù)據(jù)來(lái)得到這個(gè)投影數(shù)據(jù),進(jìn)而來(lái)設(shè)置需要消隱的投影參數(shù)。

2.3 Computing the Projections

通 過(guò)類HLRBRep_PolyAlgo中的函數(shù)HLRBRep_PolyAlgo::Update()來(lái)計(jì)算模型的外輪廓。當(dāng)用類 HLRBRep_Algo時(shí),使用HLRBRep_Algo::Update()這個(gè)算法時(shí),必須調(diào)用方法HLRBRep_Algo::Hide()來(lái)計(jì) 算模型可見(jiàn)與隱藏線。使用類HLRBRep_PolyAlgo時(shí),可見(jiàn)與隱藏線是通過(guò)HLRBRep_PolyHLRToShape來(lái)計(jì)算。

2.4 Extracting Edges

通過(guò)類HLRBRep_HLRToShape和HLRBRep_PolyHLRToShape來(lái)提取消隱后的模型數(shù)據(jù),提取數(shù)據(jù)來(lái)源分別對(duì)應(yīng)HLRBRep_Algo和HLRBRep_PolyAlgo對(duì)象。可提取的類型有:

v Visible/hidden sharp edges;

v Visible/hidden smooth edges;

v Visible/hidden sewn edges;

v Visible/hidden outline edges;

提取操作是由函數(shù)HLRBRep_PolyHLRToShape::Update來(lái)實(shí)現(xiàn)。

3.Examples

為了產(chǎn)生與AVEVA PDMS的Draft功能模塊類似的功能,就需要隱藏線消除算法來(lái)自動(dòng)根據(jù)模型生成二維圖紙。如下代碼為測(cè)試HLR算法的一個(gè)簡(jiǎn)單示例:

        osg::Node* TestPolyHlr(
        
          void
        
        
          )

{

    osg::ref_ptr
        
        <osg::Geode> aGeode = 
        
          new
        
        
           osg::Geode();

    osg::ref_ptr
        
        <osg::Geometry> aLineGeometry = 
        
          new
        
        
           osg::Geometry();

    osg::ref_ptr
        
        <osg::Vec3Array> aVertices = 
        
          new
        
        
           osg::Vec3Array();



    TopoDS_Shape aPipeModel;

    BRepTools::Read(aPipeModel, 
        
        
          "
        
        
          d:/PipeModels/2007.brep
        
        
          "
        
        
          , BRep_Builder());



    BRepMesh_IncrementalMesh aMesher(aPipeModel, 
        
        
          0.1
        
        
          );



    OSD_Timer aTimer;

    aTimer.Start();



    Handle_HLRBRep_PolyAlgo aHlrPolyAlgo 
        
        = 
        
          new
        
        
           HLRBRep_PolyAlgo();



    HLRAlgo_Projector aProjector;

    HLRBRep_PolyHLRToShape aHlr2Shape;



    aHlrPolyAlgo
        
        ->
        
          Load(aPipeModel);



    aHlrPolyAlgo
        
        ->
        
          Projector(aProjector);

    aHlrPolyAlgo
        
        ->
        
          Update();



    aHlr2Shape.Update(aHlrPolyAlgo);



    aTimer.Stop();

    aTimer.Show(std::cout);



    
        
        
          for
        
        
           (TopExp_Explorer e(aHlr2Shape.VCompound(), TopAbs_EDGE); e.More(); e.Next())

    {

        TopoDS_Edge anEdge 
        
        =
        
           TopoDS::Edge(e.Current());

        TopoDS_Vertex aFirstVertex 
        
        =
        
           TopExp::FirstVertex(anEdge);

        TopoDS_Vertex aLastVertex 
        
        =
        
           TopExp::LastVertex(anEdge);

        gp_Pnt aFirstPoint 
        
        =
        
           BRep_Tool::Pnt(aFirstVertex);

        gp_Pnt aLastPoint 
        
        =
        
           BRep_Tool::Pnt(aLastVertex);



        aVertices
        
        ->
        
          push_back(osg::Vec3(aFirstPoint.X(), aFirstPoint.Y(), aFirstPoint.Z()));

        aVertices
        
        ->
        
          push_back(osg::Vec3(aLastPoint.X(), aLastPoint.Y(), aLastPoint.Z()));

    }



    
        
        
          for
        
        
           (TopExp_Explorer e(aHlr2Shape.OutLineVCompound(), TopAbs_EDGE); e.More(); e.Next())

    {

        TopoDS_Edge anEdge 
        
        =
        
           TopoDS::Edge(e.Current());

        TopoDS_Vertex aFirstVertex 
        
        =
        
           TopExp::FirstVertex(anEdge);

        TopoDS_Vertex aLastVertex 
        
        =
        
           TopExp::LastVertex(anEdge);

        gp_Pnt aFirstPoint 
        
        =
        
           BRep_Tool::Pnt(aFirstVertex);

        gp_Pnt aLastPoint 
        
        =
        
           BRep_Tool::Pnt(aLastVertex);



        aVertices
        
        ->
        
          push_back(osg::Vec3(aFirstPoint.X(), aFirstPoint.Y(), aFirstPoint.Z()));

        aVertices
        
        ->
        
          push_back(osg::Vec3(aLastPoint.X(), aLastPoint.Y(), aLastPoint.Z()));

    }



    aLineGeometry
        
        ->
        
          setVertexArray(aVertices);

    aLineGeometry
        
        ->addPrimitiveSet(
        
          new
        
         osg::DrawArrays(osg::PrimitiveSet::LINES, 
        
          0
        
        , aVertices->
        
          size()));



    aGeode
        
        ->
        
          addDrawable(aLineGeometry);



    
        
        
          return
        
        
           aGeode.release();

}
        
      

根據(jù)上述用法介紹一步一步來(lái),就可以生成只包含線段數(shù)據(jù)的消隱后的結(jié)果,然后再在OpenSceneGraph中顯示結(jié)果如下圖所示:

wps_clip_image-27133

Figure 3.1 HLR for pipe model

wps_clip_image-29066

Figure 3.2 HLR pipe model in OpenSceneGraph

wps_clip_image-3222

Figure 3.3 HLR time usage

由 圖3.2可知,一個(gè)簡(jiǎn)單的管道模型經(jīng)過(guò)HLRBRep_PolyAlgo消隱后,產(chǎn)生很多線段數(shù)據(jù),但是由圖3.3可知,HLR消隱速度還是比較快的。因 為HLRBRep_PolyAlgo是基于離散網(wǎng)格及可視化數(shù)據(jù)的,所以當(dāng)離散精度降低時(shí),會(huì)產(chǎn)生較少數(shù)據(jù)。如下圖為降低離散精度后,產(chǎn)生的線段數(shù)據(jù)明顯 減少。

wps_clip_image-3530

Figure 3.4 HLR pipe model in less tesslate precision

wps_clip_image-7385

Figure 3.5 HLR pipe model in less tesslate precision time usage

由圖3.4和圖3.5可知,當(dāng)降低模型的離散精度時(shí),在不影響消隱后二維圖形質(zhì)量的情況下,消隱后產(chǎn)生的線段數(shù)據(jù)明顯減少,且消隱算法的速度也明顯要快很多。所以離散精度也是HLR消隱算法的一個(gè)關(guān)鍵因素,使用消隱HLR算法時(shí)需要選擇合適的離散精度。

4.Conclusion

綜上可知,OpenCASCADE的隱藏線消除HLR算法使用起來(lái)還是比較簡(jiǎn)單的,不過(guò)徹底理解算法,還是需要靜下心來(lái),Debug進(jìn)代碼,在理解大概原理的基礎(chǔ)上,對(duì)其實(shí)現(xiàn)作進(jìn)一步的理解。

要使用OpenCASCADE的HLR算法,只要指定好投影參數(shù)及加載好待消隱的模型,即可得到消隱后的模型的二維數(shù)據(jù)了。若想加快算法速度事減少模型的二維輪廓數(shù)據(jù),則需要選擇合適的網(wǎng)格離散精度。

5. References

1. OpenCASCADE Modeling Algorithms User Guide6.8.0 2014

2. 何援軍. 計(jì)算機(jī)圖形學(xué). 機(jī)械工業(yè)出版社. 2010

3. 孫家廣. 計(jì)算機(jī)圖形學(xué). 清華大學(xué)出版社. 2000

OpenCASCADE Hidden Line Removal


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 情欲色香味 | 午夜视频在线免费观看 | 日韩亚洲一区二区 | 欧美激情精品久久久久久久 | 国产精品久久久久免费 | 国产乱码精品一区二区三区中文 | 国产乱人乱精一区二区视频密 | 午夜dj在线观看神马视频 | 狠狠色噜噜狠狠狠狠米奇7777 | 亚洲精品综合网 | 亚洲免费人成在线视频观看 | 天天爱天天操 | 夜夜视频 | 三级三级三级a三级三级 | 日本亚洲精品色婷婷在线影院 | 日本不卡不码高清免费 | 国产精品欧美日韩 | 日韩精品一区二区三区四区视频 | 久久久国产视频 | 91婷婷| 国产毛片片精品天天看视频 | 九九热视频这里只有精品 | 亚洲精品成人AA片在线播 | 9久久9久久精品 | 国产精品福利在线观看 | 久久制服丝袜 | 国产一卡二卡三卡 | 国产一级大片在线观看 | 精品久久九九 | 国产亚洲久 | 国产 福利 在线 | 91福利国产在线观看网站 | 成人在线免费看 | 久久亚洲精品中文字幕二区 | 国产精品无码人妻无码色情多人 | 免费看污成人午夜网站 | 日韩视频在线观看免费 | 日日摸夜夜添免费毛片小说 | 亚洲综合精品一区二区三区中文 | 久久久国产一区二区三区 | 日本黄色三级网站 |