• <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>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            OpenNURBS 3DM Viewer

            Posted on 2014-11-04 21:34 eryar 閱讀(5047) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

            OpenNURBS 3DM Viewer

            eryar@163.com

            Abstract. The openNURBS Toolkit consists of C++ source code for a library that will read and write a openNURBS 3D model file(.3dm). More than 400 software development teams and applications including Rhinoceros, exchange 3-D models using the openNURBS (.3dm) file format. But there is no a simple viwer for 3dm on PC except Rhinoceros. So I want to develop a 3DM viewer based on OpenSceneGraph to visualize the 3DM file.

            Key Words. OpenNURBS, 3DM Viewer, OpenSceneGraph

            1. Introduction

            3DM 文件格式是Rhinoceros軟件的開源開發(fā)庫openNURBS中用于三維模型數(shù)據(jù)交換的一種格式,被許多軟件開發(fā)團隊及應用程序用來進行三維模型的數(shù)據(jù)交換。因為openNURBS開源的原因,3DM格式也是一種開放的文件格式了。

            3DM文件中用于三維模型的信息完整,包括幾何、拓樸信息,光照等等,利用這些數(shù)據(jù)可以渲染出效果逼真的三維模型。

            但是搜索了一下,能查看3DM模型的軟件除了Rhinoceros以外,再就是Android版本或iOS程序,沒有電腦Windows/Linux上運行的簡單的查看3DM模型的簡單瀏覽程序,所以決定應用OpenSceneGraph開發(fā)一個簡單的瀏覽程序,來實現(xiàn)3DM文件的模型查看功能。另外也可學習一下,如何對Brep表示的模型進行可視化。

            本文主要說明如何實現(xiàn)以線框模式Wire-Frame、渲染模式Shaded顯示三維模型。

            2.Display Model in Wire-Frame

            3DM中的三維模型是基于邊界表示法的Brep,所以要顯示線框模式的模型可以將邊界表示的模型的所有的邊Edge離散成點后進行顯示即可。顯示邊的一種最簡單的方法就是對邊的幾何數(shù)據(jù)——曲線——進行均勻取點,然后連成線即可。但是這并不是高效的方式,會造成如下圖所示的問題:

            wps_clip_image-7442

            Figure 2.1 Uniform sampling on a curve

            如上圖所示,均勻取點的方式會在曲線比較平直的區(qū)域采樣到比實際需要更多的點,而在曲率較大的區(qū)域采樣到比實際需要更少的點。為了提高顯示速度,應該用盡可能少的點來顯示更逼真的曲線,這就需要一種細分算法:Adaptive Subdivision算法。為了簡單起見,在3DM Viewer中采用了均勻采樣的方式,顯然這種方式不是很高效,但是可以用來簡單驗證Brep中邊的數(shù)據(jù)。對邊均勻采樣取點的代碼示例如下:

            osg::Node* RhinoReader::BuildEdge(const ON_Brep* theBrep)
            {
                osg::ref_ptr
            <osg::Geode> aGeode = new osg::Geode();

                
            for (int i = 0; i < theBrep->m_E.Count(); ++i)
                {
                    osg::ref_ptr
            <osg::Geometry> aGeometry = new osg::Geometry();
                    osg::ref_ptr
            <osg::Vec3Array> aVertices = new osg::Vec3Array();

                    ON_BrepEdge
            * anEdge = theBrep->Edge(i);

                    
            double t0 = 0.0;
                    
            double t1 = 0.0;
                    
            double d = 0.0;

                    anEdge
            ->GetDomain(&t0, &t1);

                    d 
            = (t1 - t0) / 5.0;

                    
            for (double t = t0; (t - t1) < TOLERANCE_EDGE; t += d)
                    {
                        ON_3dPoint aPoint 
            = anEdge->PointAt(t);

                        aVertices
            ->push_back(osg::Vec3(aPoint.x, aPoint.y, aPoint.z));
                    }

                    aGeometry
            ->setVertexArray(aVertices);
                    aGeometry
            ->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP, 0, aVertices->size()));

                    aGeode
            ->addDrawable(aGeometry);
                }

                
            return aGeode.release();
            }

            由上述代碼可知,通過遍歷Brep結構中的邊,并將其均勻采樣取點,取可得到曲線的大概輪廓了。顯示效果如下圖所示:

            wps_clip_image-815

            Figure 2.2 Display Basketball Goal Model Edges

            wps_clip_image-4971

            Figure 2.3 Display Bookshelf Model Edges

            由圖可知,顯示效果還不錯。這也是常見的三維顯示中的線框模式實現(xiàn)的方式。不過在采樣點的算法上還有優(yōu)化空間。

            3.Next...

            下一步準備以渲染模式Shaded來顯示3DM模型,就需要對Face進行網(wǎng)格剖分。網(wǎng)格剖分的速度及質量直接影響面的渲染。網(wǎng)格剖分統(tǒng)一在NURBS曲面的參數(shù)空間,且需要注意曲面的外邊界及內邊界(即面的開孔的處理)。如下圖所示,先將面均勻采樣顯示效果如下圖所示:

            wps_clip_image-20656

            Figure 3.1 Display Basketball Goal Model Faces

            wps_clip_image-28130

            Figure 3.2 Display Bookshelf Model Faces

            為了顯示渲染模式的曲面,還需要在此基礎上對曲面的參數(shù)空間進行剖分。為了曲面光照效果,需要正確計算出曲面上點的法向,這是下一步的工作了。

            4.Get Involved

            在網(wǎng)上沒有搜到合適的3DM Viewer,只有自己來做了,做的過程也是個學習的過程。而且在Windows/Linux上一個輕量級的3DM Viewer還是有些需求的,所以在Github上創(chuàng)建了一個項目,感興趣的讀者也可以參與進來,或者貢獻代碼,或者給些意見。項目地址如下:

            https://github.com/eryar/3DMViewer

            關于3DM格式的更多模型可以從網(wǎng)上獲取,本文中的兩個模型來自如下網(wǎng)站:

            http://ad-3d.com/free-rhino-3d-nurbs-models/

            5. Conclusion

            通過使用OpenNURBS庫來讀取3dm文件中的模型數(shù)據(jù),并對其進行可視化。并對顯示中常見有模式:線框、渲染模式的實現(xiàn)方法進行介紹。通過實現(xiàn)3DM Viewer也是為了進一步學習如何將Brep表示的模型可視化。

            6. References

            1. Free 3DM models: http://www.ad-3d.com/Free Rhino3D models/

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

            国产成人精品久久二区二区| 无码人妻久久一区二区三区免费丨| 久久精品国产亚洲一区二区| 91精品国产色综合久久| 久久久久亚洲AV无码专区网站| 久久久久久伊人高潮影院| 久久精品aⅴ无码中文字字幕重口| 亚洲乱亚洲乱淫久久| 欧美一区二区久久精品| 狠狠色丁香久久综合婷婷| 狠狠色丁香婷婷久久综合| 久久夜色精品国产亚洲| 亚洲国产精品无码久久| 久久久久97国产精华液好用吗| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 天天躁日日躁狠狠久久| 国产精品99久久久久久董美香| 久久精品国产99国产精品导航 | 色狠狠久久AV五月综合| 国产成人精品久久亚洲高清不卡| 国产aⅴ激情无码久久| 国产高清美女一级a毛片久久w | 一本一本久久A久久综合精品| 色成年激情久久综合| 久久99国产乱子伦精品免费| 精品久久久久久久国产潘金莲| 久久精品国产欧美日韩| 久久精品国产91久久麻豆自制 | 狠狠色丁香久久婷婷综合五月| 久久精品成人一区二区三区| 美女写真久久影院| 国产成人久久精品麻豆一区 | 久久精品国产99国产精品亚洲| 免费一级欧美大片久久网| 久久国产热这里只有精品| 99久久国产综合精品五月天喷水| 国产精品久久久久久久久鸭 | 国内精品综合久久久40p| 国产激情久久久久久熟女老人| 久久精品国产亚洲AV久| 人妻精品久久久久中文字幕一冢本 |