OpenNURBS 3DM Viewer

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软件的开源开发库openNURBS中用于三维模型数据交换的一种格式,被许多软件开发团队及应用程序用来进行三维模型的数据交换。因为openNURBS开源的原因,3DM格式也是一种开放的文件格式了。

3DM文件中用于三维模型的信息完整,包括几何、拓朴信息,光照等等,利用这些数据可以渲染出效果逼真的三维模型。

但是搜索了一下,能查看3DM模型的软件除了Rhinoceros以外,再就是Android版本或iOS程序,没有电脑Windows/Linux上运行的简单的查看3DM模型的简单浏览程序,所以决定应用OpenSceneGraph开发一个简单的浏览程序,来实现3DM文件的模型查看功能。另外也可学习一下,如何对Brep表示的模型进行可视化。

本文主要说明如何实现以线框模式Wire-Frame、渲染模式Shaded显示三维模型。

2.Display Model in Wire-Frame

3DM中的三维模型是基于边界表示法的Brep,所以要显示线框模式的模型可以将边界表示的模型的所有的边Edge离散成点后进行显示即可。显示边的一种最简单的方法就是对边的几何数据——曲线——进行均匀取点,然后连成线即可。但是这并不是高效的方式,会造成如下图所示的问题:

Figure 2.1 Uniform sampling on a curve

如上图所示,均匀取点的方式会在曲线比较平直的区域采样到比实际需要更多的点,而在曲率较大的区域采样到比实际需要更少的点。为了提高显示速度,应该用尽可能少的点来显示更逼真的曲线,这就需要一种细分算法:Adaptive Subdivision算法。为了简单起见,在3DM Viewer中采用了均匀采样的方式,显然这种方式不是很高效,但是可以用来简单验证Brep中边的数据。对边均匀采样取点的代码示例如下:

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结构中的边,并将其均匀采样取点,取可得到曲线的大概轮廓了。显示效果如下图所示:

Figure 2.2 Display Basketball Goal Model Edges

Figure 2.3 Display Bookshelf Model Edges

由图可知,显示效果还不错。这也是常见的三维显示中的线框模式实现的方式。不过在采样点的算法上还有优化空间。

3.Next...

下一步准备以渲染模式Shaded来显示3DM模型,就需要对Face进行网格剖分。网格剖分的速度及质量直接影响面的渲染。网格剖分统一在NURBS曲面的参数空间,且需要注意曲面的外边界及内边界(即面的开孔的处理)。如下图所示,先将面均匀采样显示效果如下图所示:

Figure 3.1 Display Basketball Goal Model Faces

Figure 3.2 Display Bookshelf Model Faces

为了显示渲染模式的曲面,还需要在此基础上对曲面的参数空间进行剖分。为了曲面光照效果,需要正确计算出曲面上点的法向,这是下一步的工作了。

4.Get Involved

在网上没有搜到合适的3DM Viewer,只有自己来做了,做的过程也是个学习的过程。而且在Windows/Linux上一个轻量级的3DM Viewer还是有些需求的,所以在Github上创建了一个项目,感兴趣的读者也可以参与进来,或者贡献代码,或者给些意见。项目地址如下:

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

关于3DM格式的更多模型可以从网上获取,本文中的两个模型来自如下网站:

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

5. Conclusion

通过使用OpenNURBS库来读取3dm文件中的模型数据,并对其进行可视化。并对显示中常见有模式:线框、渲染模式的实现方法进行介绍。通过实现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

时间: 2024-12-10 02:53:39

OpenNURBS 3DM Viewer的相关文章

OpenNURBS to OpenCASCADE

OpenNURBS to OpenCASCADE eryar@163.com Abstract. The OpenNURBS initiative provides CAD/CAM/CAE and computer graphics software developers the tools to accurately transfer 3D geometry between applications. The OpenNURBS C++ source code is clean and fai

使用Internals Viewer插件查看SQL SERVER内部数据页面

感觉internals viewer这个名字起得很好,内部查看. 这个小工具是我之前看园子里的某大侠转载的文章是看到的 文章地址: SQL Server2008存储结构之堆表.行溢出 http://www.cnblogs.com/trams/archive/2010/09/11/1823727.html 这几天研究了一下这个小工具,发现挺好用的,对入想深入研究或者刚刚学SQLSERVER但是想对SQL有更深入了解的朋友们特别有用 先给出下载地址,这个是codeplex上的一个项目: http:/

Android可视化调试工具Hierarchy Viewer的使用

Android的SDK工具包中,有很多十分有用的工具,可以帮助程序员开发和测试Android应用程序,大大提高其工作效率.其中的一款叫Hierachy Viewer的可视化调试工具,可以很方便地帮助开发者分析,设计,调试和调整UI界面,提高开发效率.本文将以一个实际例子讲解如何使用该款工具运用在Android的开发过程中. 1 设计界面 在我们的这个例子中,有三个不同的界面,以方便我们演示使用Hierarchy Viewer.每一个界面都使用了LinearLayout和FrameLayout布局

从外部应用程序发送参数到基于JSR 286的Web Content Viewer portlet

本文涉及的信息只引用由外部系统生成的 URL.WebSphere Portal 架构内生成的 URL 是很简单的,应该使用 IBM Web Content Management 的 UrlCmpnt 标记. 新 Web Content Viewer portlet 的第一版于 2009 年 1 月在 IBM Lotus and WebSphere Portal Business Solutions Catalog 中提供.升级版在 2009 年底发布,其中包括 IBM WebSphere Por

什么是Word Viewer

微软的又一免费东东,下载无须正版验证. Word Viewer 2003 使您可以打开 Word 2003 文档,以及用 Microsoft Word for Windows 和 Microsoft Word for Macintosh 的所有早期版本创建的文档.    除 Word 文档文件 (.doc) 外,您还可以打开使用下列格式保存的文件: RTF 格式 (.rtf) 文本 (.txt) 网页格式 (.htm, .html, .mht, .mhtml) WordPerfect 5.x (

可查看、打印word文档工具:Word Viewer

      即使您没有安装 Word,您也可以查看.打印和复制 Word 文档.什么软件这么牛呢?今天就给大家介绍微软开发的免费的查看.打印word文档工具:Word Viewer.       Word Viewer最新的两个版本是Word Viewer 2003和Word Viewer 2007.   Microsoft Office Word Viewer 2003 介绍:      除 Word 文档文件 (.doc) 外,您还可以打开使用下列格式保存的文件: RTF 格式 (.rtf)

win8系统开机提示Dpp Viewer Modul错误怎么办

  win8系统开机提示Dpp Viewer Modul错误怎么办          出现"Dpp Viewer Modul停止工作"的原因分析 DPP,即Digital Photo Professional 的缩写,它是佳能官方推荐它处理EOS系列单反拍摄的"RAW"文件的软件.如果遇到"Dpp Viewer Modul停止工作"提示,很有可能是软件版本太低,或者是在Win8系统内不兼容造成的. 处理Win8电脑开机弹出Dpp Viewer M

不需word即可查看、打印word文档工具:Word Viewer

     即使您没有安装 Word,您也可以查看.打印和复制 Word 文档.什么软件这么牛呢?今天就给大家介绍微软开发的免费的查看.打印word文档工具:Word Viewer.       Word Viewer最新的两个版本是Word Viewer 2003和Word Viewer 2007. Microsoft Office Word Viewer 2003 介绍:      除 Word 文档文件 (.doc) 外,您还可以打开使用下列格式保存的文件: RTF 格式 (.rtf) 文本

Win7出现&quot;Dpp Viewer Module停止工作&quot;的解决方法

  很多用户在使用win7系统上网时出现""Dpp Viewer Module停止工作"的问题,一些用户对于出现的该问题不知所措,其实用户出现该问题是因为系统版本过低或系统兼容性问题造成的,故此我们只需要对相应的版本升级即可解决该错误,下面我们看下解决方法吧! Win7出现"Dpp Viewer Module停止工作"的解决方法 1.更新Digital Photo Professional ,把Digital Photo Professional 升级到最