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

OpenNURBS 3DM Viewer的更多相关文章

  1. OpenNURBS to OpenCASCADE

    OpenNURBS to OpenCASCADE eryar@163.com Abstract. The OpenNURBS initiative provides CAD/CAM/CAE and c ...

  2. cesium核心类Viewer简介

    1.简单描述Viewer Viewer类是cesium的核心类,是地图可视化展示的主窗口,cesium程序应用的切入口,扮演必不可少的核心角色. 官网的英文解析如下: A base widget fo ...

  3. View and Data API Tips: Constrain Viewer Within a div Container

    By Daniel Du When working with View and Data API, you probably want to contain viewer into a <div ...

  4. View and Data API Tips: Hide elements in viewer completely

    By Daniel Du With View and Data API, you can hide some elements in viewer by calling "viewer.hi ...

  5. OpenCASCADE BRep vs. OpenNURBS BRep

    OpenCASCADE BRep vs. OpenNURBS BRep eryar@163.com Abstract. BRep short for Boundary Representation. ...

  6. View and Data API Tips: how to make viewer full screen

    By Daniel Du If you have not heard of View and Data API, here is the idea, the View & Data API e ...

  7. 在 Windows 10 中启用 Windows Photo Viewer

    本文版权归cxun所有,如有转载请注明出处与本文链接,谢谢!原文地址:http://www.cnblogs.com/cxun/p/4727323.html 不知大家在使用了Win10之后有没有这样感受 ...

  8. ActiveReports中自定义Winforms的Viewer 工具栏

    ActiveReports中提供不同平台的报表浏览器来加载报表,而不同平台的报表浏览器功能也不一致,今天我们来学习如何定制Winforms Viewer控件. 预览效果: 核心代码: C# // C# ...

  9. Microsoft Help Viewer

    Microsoft Help Viewer 1.0 Microsoft Help Viewer 2.0 Help Library 管理器 -Microsoft Help 查看器 打开VS 2010   ...

随机推荐

  1. Android 学习笔记之三—— 音效的使用

    在开发手电筒应用的处理音效的过程中,看网上使用的是MediaPlayer,因为音效一般都比较短,所以这里使用的是SoundPool,如下: SoundPool soundPool=new SoundP ...

  2. IE11 上的3个bug

    1.IE 11在popstate上无法正常使用,所以,需要使用老方法hashchange.有一个叫History.js的library,是可以解决这个问题.但如果url在"#"后跟 ...

  3. mvc 返回值

    mvc返回值为Model类型 public ActionResult Index(T result) { return View(result); } view中的对象即为页面中的Model数据,之后 ...

  4. Linux下uniq命令的详解

           -c 在输出行前面加上每行在输入文件中出现的次数.  -d 仅显示重复行.       -u 仅显示不重复的行. 示例 1.去重,有多行一样的只显示一行cat 4.txt |sort - ...

  5. 许愿墙的搭建基于mysql

    首先需要两个服务器(也可以用一台,但不推荐) 1服务器用yum安装Apache+php+php-mysql 2服务器用yum安装mysql 1服务器 用yum安装Apache和php+php-mysq ...

  6. JVM垃圾收集器

    JVM中垃圾的回收由垃圾收集器进行,随着JDK的不断升级,垃圾收集器也开发出了各种版本,垃圾收集器不断优化的动力,就是为了实现更短的停顿. 下面是7种不同的分代收集器,如果两个收集器之间有连线,则表示 ...

  7. 实现滑动条与表单中的input中的value交互

    最近在写一个考试系统的项目,遇到一些比较有意思的小知识,在这里分享给大家 下面是一个滑动条与input中的value值的交互,即滑动条的颜色会跟随给定input的value值实时变化,虽然表单中的ra ...

  8. Android中数据存储(一)

    国庆没有给国家添堵,没有勾搭妹子,乖乖的写着自己的博客..... 本文将为大家介绍Android中数据存储的五种方式,数据存储可是非常重要的知识哦. 一,文件存储数据 ①在ROM存储数据 关于在ROM ...

  9. Unity之CharacterController 碰撞问题总结

    CharacterController 不会受到scene的重力影响,自带物理碰撞检测,在脱离导航网格的应用场景下(比如飞行),是很有优势的Unity原生工具组件.如果在复杂的应用场景里,会有多种CC ...

  10. Java_正则表达式

    1.简介 正则表达式是一串特定字符串,组成一个“规则字符串”,这个“规则字符串”是描述文本规则的工具.正则表达式就是记录文本规则的代码. 2.字符集合 [abc] a,b,c中任意一个字符 [^abc ...