用OpenInventor实现的NeHe OpenGL教程-第二课

用OpenInventor实现的NeHe OpenGL教程-第二课

 

       这节课将在第一课的基础上添加一个三角形和一个四边形。本节新增加一个函数BuildScene,这个函数将在场景中创建一个三角形和一个四边形。

 

       在函数BuildScene中,首先创建一个SoTranslation节点对象,这个节点的作用是平移当前坐标系。OpenInventor和OpenGL采用相同的右手坐标系,X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。屏幕中心为坐标原点。我们对这个新的平移节点设置上平移值(-1.5f,0.0f,-6.0f)。表示当前坐标系将沿着X轴左移1.5个单位,Y轴不动(0.0f),最后移入屏幕6.0f个单位。这些平移数据和NeHe教程中的数据是一样的。最后将平移节点增加到场景根节点中。

 

void BuildScene(void)

{

     SoTranslation *TriangleTrans = new SoTranslation;

     TriangleTrans->translation.setValue(-1.5f,0.0f,-6.0f);

     g_pOivSceneRoot->addChild(TriangleTrans);

 

       设置好坐标系后,我们就可以开始向场景增加图形了。首先定义好三角形三个顶点的数据。TriangleVertices数组是2维数组,定义了3个顶点,每个顶点有x,y,z三个浮点数据。然后创建一个SoCoordinate3节点,这个节点的作用是保存物体的顶点数据。将TriangleVertices数组设置到SoCoordinate3节点中,最后将SoCoordinate3节点增加到场景根节点中。不像OpenGL那样,只要指定了顶点数据后就可以绘制出物体。OpenInventor还需要指定一种图形集后,才能根据前面的顶点数据显示出相应的物体。因为我们希望显示一个三角形,所以我们要创建一个SoFaceSet节点。将SoFaceSet节点增加到场景根节点中后,OpenInventor就可以在适当的时候显示出三角形物体了。

 

     float TriangleVertices[][3] = { {0.0f, 1.0f, 0.0f}, {-1.0f,-1.0f, 0.0f}, { 1.0f,-1.0f, 0.0f} };

     SoCoordinate3 *TriangleCoords = new SoCoordinate3;

     TriangleCoords->point.setValues(0, 3, TriangleVertices);

     g_pOivSceneRoot->addChild(TriangleCoords);

 

     SoFaceSet *pFaceSet = new SoFaceSet;

     g_pOivSceneRoot->addChild(pFaceSet);

 

     接下来创建的四边形的代码基本上和创建三角形的类似。首先创建另外一个SoTranslation节点对象,注意新的平移节点将是以当前坐标系为基准进行平移。我们要在屏幕的右半部分画四边形,因为前面左移了1.5个单位,这次要先向右移回屏幕中心(1.5个单位),再向右移动1.5个单位。总共要向右移3.0个单位。还有一点值得注意的是,我们不需要在重新创建一个SoFaceSet节点了。这个节点可以使用前面我们已经创建完的那个,这在OpenInventor中叫做“节点共享”,好处是显而易见的,可以节约系统内存。

     SoTranslation *QuadTrans = new SoTranslation;

     QuadTrans->translation.setValue(3.0f,0.0f,0.0f);

     g_pOivSceneRoot->addChild(QuadTrans);

 

     float QuadVertices[][3] = { {-1.0f, 1.0f, 0.0f}, { -1.0f,-1.0f, 0.0f }, { 1.0f,-1.0f, 0.0f}, {1.0f,1.0f, 0.0f} };

     SoCoordinate3 *QuadCoords = new SoCoordinate3;

     QuadCoords->point.setValues(0, 4, QuadVertices);

     g_pOivSceneRoot->addChild(QuadCoords); 

     g_pOivSceneRoot->addChild(pFaceSet); 

 

       好了,剩下的代码基本上和上一节是一样的。现在编译运行我们程序,屏幕上左边会出现一个颜色为白色的三角形,右边出现一个颜色同样是白色的四边形。效果和NeHe第二课是相同的。读者也许会感觉到,OpenInventor会比OpenGL麻烦,同样绘制一个图像,OpenGL只需要几个简单的命令就可以完成了,而OpenInventor却要创建那么多的对象。应该说读者的抱怨是应该的。但请各位注意的是,OpenInventor存在的主要价值其实是为了简化复杂的场景的设计。对于像NeHe教程这样比较简单的场景来说,使用OpenInventor来做有些“不合适”。如果读者有机会使用OpenInventor来设计一个比较复杂的场景的话,您就应该可以感觉到OpenInventor对于代码理解,代码维护/扩展等方面,比OpenGL有着更大的优势。

 

本课的完整代码下载。(VC 2003 + Coin2.5)

 

 

  

后记

OpenInventor是一种基于OpenGL的面向对象的三维图形软件开发包。使用这个开发包,程序员可以快速、简洁地开发出各种类型的交互式三维图形软件。这里不对OpenInventor做详细的介绍,读者如果感兴趣,可以阅读我的blog中的这篇文章《OpenInventor 简介》。

 

NeHe教程是目前针对初学者来说最好的OpenGL教程,它可以带领读者由浅入深,循序渐进地掌握OpenGL编程技巧。到目前为止(2007年11月),NeHe教程一共有48节。我的计划是使用OpenInventor来实现所有48节课程同样的效果。目的是复习和巩固OpenGL的知识,同时与各位读者交流OpenInventor的使用技巧。

 

       因为篇幅的限制,我不会介绍NeHe教程中OpenGL的实现过程,因为NeHe的教程已经讲解的很清楚了,目前网络中也有NeHe的中文版本。我将使用VC 2003作为主要的编译器。程序框架采用和NeHe一样的Win32程序框架,不使用MFC。程序也可以在VC Express,VC 2005/2008中编译。我采用的OpenInventor开发环境是Coin,这是一个免费开源的OpenInventor开发库。文章《OpenInventor-Coin3D开发环境》介绍了如何在VC中使用Coin。我使用的Coin版本是2.5。读者可以到www.coin3d.org中免费下载。

 

       读者可以在遵循GNU协议的条件下自由使用、修改本文的代码。水平的原因,代码可能不是最优化的,我随时期待读者的指正和交流。转载请注明。谢谢。

我的联系方式:

E-mail: < [email protected] > < [email protected] >

Blog: < http://blog.csdn.net/RobinHao >

Site: < http://www.openinventor.cn >

猜你喜欢

转载自blog.csdn.net/xirongxu_dlut/article/details/54379022