用OpenInventor实现的NeHe OpenGL教程-第十二课
NeHe这节课主要讨论OpenGL的显示列表功能。OpenGL的显示列表是加速OpenGL性能的一种重要的手段。但在OpenInventor中,我们根本就不需要关心是否使用显示列表,因为OpenInventor内部有缓存功能,而这个缓存功能就是使用显示列表来实现的。所以我们只需要实现程序逻辑功能,至于程序性能方面的事情,由OpenInventor内部处理就可以了。
在程序开始的部分我们定义了一些变量。
SoRotation* g_pXRotation = NULL; //绕X轴旋转节点
SoRotation* g_pYRotation = NULL; //绕Y轴旋转节点
double g_dbXRot = M_PI / 4.0; //绕X轴旋转的角度
double g_dbYRot = M_PI / 4.0; //绕Y轴旋转的角度
编写一个新函数CreateCube,这个函数的作用是根据输入颜色,创建一个彩色立方体场景。
SoSeparator* CreateCube(float* BoxColor,float* TopColor)
{
//因为立方体中,第5个面和其他面的颜色不同,因此需要为6个面分别指定颜色
SoMaterial *pCubeMaterial = new SoMaterial;//创建材质节点
pCubeMaterial->diffuseColor.set1Value(0,BoxColor[0],BoxColor[1],BoxColor[2]);
pCubeMaterial->diffuseColor.set1Value(1,BoxColor[0],BoxColor[1],BoxColor[2]);
pCubeMaterial->diffuseColor.set1Value(2,BoxColor[0],BoxColor[1],BoxColor[2]);
pCubeMaterial->diffuseColor.set1Value(3,BoxColor[0],BoxColor[1],BoxColor[2]);
pCubeMaterial->diffuseColor.set1Value(4,TopColor[0],TopColor[1],TopColor[2]);
pCubeMaterial->diffuseColor.set1Value(5,BoxColor[0],BoxColor[1],BoxColor[2]);
SoSeparator *pCubeSep = new SoSeparator;//创建保存立方体的组节点
pCubeSep->addChild(pCubeMaterial);//增加材质节点
pCubeSep->addChild(new SoCube);//增加立方体节点
return pCubeSep;
}
在函数BuildScene中,我们编写如下的代码。
void BuildScene(void)
{
//定义光照模型为BASE_COLOR
SoLightModel *pSoLightModel = new SoLightModel;
pSoLightModel->model = SoLazyElement::BASE_COLOR;
g_pOivSceneRoot->addChild(pSoLightModel);
//设置纹理品质
SoComplexity *pTextureComplexity = new SoComplexity;
pTextureComplexity->textureQuality = 0.6;
g_pOivSceneRoot->addChild(pTextureComplexity);
//增加纹理数据
SoTexture2 *pTexture = new SoTexture2;
pTexture->filename.setValue("../Data/Cube.png");
g_pOivSceneRoot->addChild(pTexture);
//增加绕X,Y轴旋转的矩阵节点
g_pXRotation = new SoRotation;
g_pXRotation->rotation.setValue(SbVec3f(1,0,0),g_dbXRot);
g_pYRotation = new SoRotation;
g_pYRotation->rotation.setValue(SbVec3f(0,1,0),g_dbYRot);
//因为立方体中,第5个面和其他面的颜色不同,我们已经为6个面分别指定了颜色,下面的代码告诉
//OpenInventor,立方体节点是每个面使用一种颜色。关于材质绑定方面的内容,请参考
//《The Inventor Mentor》一书。
SoMaterialBinding *pMaterialBinding = new SoMaterialBinding;
pMaterialBinding->value = SoMaterialBindingElement::PER_PART;
g_pOivSceneRoot->addChild(pMaterialBinding);
//定义每行立方体的颜色,数据和NeHe教程中相同
static float boxcol[5][3] = { {1.0f,0.0f,0.0f},{1.0f,0.5f,0.0f},{1.0f,1.0f,0.0f},{0.0f,1.0f,0.0f},{0.0f,1.0f,1.0f} };
static float topcol[5][3] = { {.5f,0.0f,0.0f},{0.5f,0.25f,0.0f},{0.5f,0.5f,0.0f},{0.0f,0.5f,0.0f},{0.0f,0.5f,0.5f} };
//创建所有的立方体,立方体的位置数据的计算和NeHe教程相同,读者请查阅NeHe教程
for ( int yloop = 1; yloop < 6; yloop++)
{
for (int xloop = 0; xloop < yloop; xloop++)
{
SoSeparator *pOneCubeSep = new SoSeparator;
g_pOivSceneRoot->addChild(pOneCubeSep);
SoTranslation *pCubeTrans = new SoTranslation;
pCubeTrans->translation.setValue(1.4f + (float(xloop) * 2.8f) - (float(yloop) * 1.4f),((6.0f - float(yloop)) * 2.4f) - 7.0f,0.0f);
pOneCubeSep->addChild(pCubeTrans);
pOneCubeSep->addChild(g_pXRotation);
pOneCubeSep->addChild(g_pYRotation);
pOneCubeSep->addChild(CreateCube(boxcol[yloop - 1],topcol[yloop - 1]));
}
}
定义键盘回调节点,响应用户按键事件
SoEventCallback* pEventCallback = new SoEventCallback;
pEventCallback->addEventCallback(SoKeyboardEvent::getClassTypeId(),KeyboardEventCB,g_pOivSceneRoot);
g_pOivSceneRoot->addChild(pEventCallback);
}
下面是键盘响应函数,我们在这个函数中响应上下左右箭头按键。请注意,OpenInventor角度的单位为弧度
void KeyboardEventCB(void *userData, SoEventCallback *pEventCB)
{
if(SO_KEY_PRESS_EVENT(pEvent,LEFT_ARROW))
{ //绕X轴旋转
g_dbYRot -= 0.01;
g_pYRotation->rotation.setValue(SbVec3f(0,1,0),g_dbYRot);
}
else
if(SO_KEY_PRESS_EVENT(pEvent,RIGHT_ARROW))
{ //绕X轴旋转
g_dbYRot += 0.01;
g_pYRotation->rotation.setValue(SbVec3f(0,1,0),g_dbYRot);
}
else
if(SO_KEY_PRESS_EVENT(pEvent,UP_ARROW))
{ //绕Y轴旋转
g_dbXRot -= 0.01;
g_pXRotation->rotation.setValue(SbVec3f(1,0,0),g_dbXRot);
}
else
if(SO_KEY_PRESS_EVENT(pEvent,DOWN_ARROW))
{ //绕Y轴旋转
g_dbXRot += 0.01;
g_pXRotation->rotation.setValue(SbVec3f(1,0,0),g_dbXRot);
}
}
现在编译运行我们程序,屏幕上会显示15个不同颜色的立方体。读者可以按下前后左右箭头键来旋转这些立方体。显示的效果和NeHe第十二课是相同的。
后记
OpenInventor是一种基于OpenGL的面向对象的三维图形软件开发包。使用这个开发包,程序员可以快速、简洁地开发出各种类型的交互式三维图形软件。这里不对OpenInventor做详细的介绍,读者如果感兴趣,可以阅读我的blog中的这篇文章《
OpenInventor 简介》。
NeHe教程是目前针对初学者来说最好的OpenGL教程,它可以带领读者由浅入深,循序渐进地掌握OpenGL编程技巧。到目前为止(2007年11月),NeHe教程一共有48节。我的计划是使用OpenInventor来实现所有48节课程同样的效果。目的是复习和巩固OpenGL的知识,同时与各位读者交流OpenInventor的使用技巧。
读者可以在遵循GNU协议的条件下自由使用、修改本文的代码。水平的原因,代码可能不是最优化的,我随时期待读者的指正和交流。转载请注明。谢谢。
我的联系方式:
分享到:
相关推荐
OpenGL-Coin3 用Open Inventor实现NEHE的Open GL47教程经典学习例程
(VC++ 2003) Open Inventor Coin3D Nehe教程 代码
OpenGL Inventor 入门,提高必看. //**全系列相关Open Inventor请到我的空间下载**//
NEHE中文教程.OpenGL 入门,提高必看. //**全系列相关Open Inventor请到我的空间下载**//
许多软件厂商也纷纷以OpenGL为基础开发出自己的产品,其中比较著名的产品包括动画制作软件Soft Image和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软件ProEngineer、GIS软ARC/INFO等等。...
Open Inventor Open Inventor7
Open Inventor-Coin3D开发环境-中国网游开发中心- OGDEV.NET-学者园地
Appinventor2 游戏源码--仿像素鸟 (包含资源文件,如图片 音效等)
本程序是利用open inventor的核心组件库coin3d编写平台是vc实现选择功能
其不同时期编制的同一Open Inventor程序代码都可利用OpenGL的最新发展技术,并能最大限度地发挥所使用的计算机软硬件性能。另外,Open Inventor还能够完美支持VRML 97、三维音效、三维纹理和多处理器的并行渲染技术...
OpenInventor核心库coin3D,学习指导书《Mentor》
如何在MFC程序中使用Open Inventor, OpenGL Inventor 入门,提高必看. //**全系列相关Open Inventor请到我的空间下载**//
其不同时期编制的同一Open Inventor程序代码都可利用OpenGL的最新发展技术,并能最大限度地发挥所使用的计算机软硬件性能。另外,Open Inventor还能够完美支持VRML 97、三维音效、三维纹理和多处理器的并行渲染技术...
许多软件厂商也纷纷以OpenGL为基础开发出自己的产品,其中比较著名的产品包括动画制作软件Soft Image和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软件ProEngineer、GIS软ARC/INFO等等。...
阎锋欣等编写OpenInventor程序设计——从入门到精通的源代码,由于只能上传小于20M的文件,所以我将整个源...OpenInventor_code2.rar为第10章到15章的代码以及一些说明文档,解压后请查看文件:“光盘使用说明.doc”。
其不同时期编制的同一Open Inventor程序代码都可利用OpenGL的最新发展技术,并能最大限度地发挥所使用的计算机软硬件性能。另外,Open Inventor还能够完美支持VRML 97、三维音效、三维纹理和多处理器的并行渲染技术...
基于Open Inventor的虚拟场景实现
其不同时期编制的同一Open Inventor程序代码都可利用OpenGL的最新发展技术,并能最大限度地发挥所使用的计算机软硬件性能。另外,Open Inventor还能够完美支持VRML 97、三维音效、三维纹理和多处理器的并行渲染技术...
aia源码--Appinventor2 游戏--俄罗斯方块
The Inventor Mentor:Programming Object-Oriented 3D Graphics