OpenSceneGraph实现的NeHe OpenGL教程 - 第十五课

  • 简介

NeHe这节课主要讨论OpenGL怎样给文字赋予纹理贴图。OpenGL使用glTexGen函数给文字自动生成纹理坐标。在OSG中,使用osg::TexGen这个继承自StateAttribute的类来实现相同的效果

  • 实现

首先将创建3D的字体,代码如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.     osg::Geode *fontGeode = new osg::Geode;  
  2.   
  3.     osg::Image *textureImage = osgDB::readImageFile("Data/Lights.bmp");  
  4.     osg::Texture2D *texture2D = new osg::Texture2D;  
  5.     texture2D->setImage(textureImage);  
  6.     texture2D->setFilter(osg::Texture::MIN_FILTER, osg::Texture::NEAREST);  
  7.     texture2D->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST);  
  8.   
  9.     osg::TexGen *texGen = new osg::TexGen;  
  10.     texGen->setMode(osg::TexGen::OBJECT_LINEAR);  
  11.   
  12.     osgText::Text3D *text = new osgText::Text3D;  
  13.     text->setCharacterSize(3.0f);  
  14.     text->setCharacterDepth(0.5f);  
  15.     text->setText("N");  
  16.     text->setFont("fonts/Wingding.ttf");  
  17.     text->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture2D);  
  18.     fontGeode->getOrCreateStateSet()->setTextureAttributeAndModes(0, texGen);  
  19.     fontGeode->addDrawable(text);  
设置字体为系统中的Wingding.tff字体,就可以实现骷髅头的效果。

可以看到我们按照NeHe教程中的实现方式,将texGen状态属性添加到字体Drawable之中,实现了纹理的自动计算

编译运行程序:



附:本课源码(源码中可能存在错误和不足,仅供参考)

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "../osgNeHe.h"  
  2.   
  3. #include <QtCore/QTimer>  
  4. #include <QtGui/QApplication>  
  5. #include <QtGui/QVBoxLayout>  
  6.   
  7. #include <osgViewer/Viewer>  
  8. #include <osgDB/ReadFile>  
  9. #include <osgQt/GraphicsWindowQt>  
  10.   
  11. #include <osg/MatrixTransform>  
  12.   
  13. #include <osgDB/ReadFile>  
  14. #include <osgText/Text>  
  15. #include <osgText/Text3D>  
  16.   
  17. #include <osg/AnimationPath>  
  18.   
  19. #include <iostream>  
  20. #include <sstream>  
  21.   
  22. #include <osg/TexGen>  
  23.   
  24. float rot = 0.0;  
  25.   
  26. class FontColorCallback : public osg::Drawable::UpdateCallback  
  27. {  
  28. public:  
  29.   
  30.     virtual void update(osg::NodeVisitor*, osg::Drawable* drawable)  
  31.     {  
  32.         if (dynamic_cast<osgText::Text3D*>(drawable))  
  33.         {  
  34.             osgText::Text3D *text = dynamic_cast<osgText::Text3D*>(drawable);  
  35.             text->setText("N");  
  36.             rot+=0.5f;  
  37.         }  
  38.     }  
  39. };  
  40.   
  41.   
  42.   
  43. class ViewerWidget : public QWidget, public osgViewer::Viewer  
  44. {  
  45. public:  
  46.     ViewerWidget(osg::Node *scene = NULL)  
  47.     {  
  48.         QWidget* renderWidget = getRenderWidget( createGraphicsWindow(0,0,100,100), scene);  
  49.   
  50.         QVBoxLayout* layout = new QVBoxLayout;  
  51.         layout->addWidget(renderWidget);  
  52.         layout->setContentsMargins(0, 0, 0, 1);  
  53.         setLayout( layout );  
  54.   
  55.         connect( &_timer, SIGNAL(timeout()), this, SLOT(update()) );  
  56.         _timer.start( 10 );  
  57.     }  
  58.   
  59.     QWidget* getRenderWidget( osgQt::GraphicsWindowQt* gw, osg::Node* scene )  
  60.     {  
  61.         osg::Camera* camera = this->getCamera();  
  62.         camera->setGraphicsContext( gw );  
  63.   
  64.         const osg::GraphicsContext::Traits* traits = gw->getTraits();  
  65.   
  66.         camera->setClearColor( osg::Vec4(0.0, 0.0, 0.0, 1.0) );  
  67.         camera->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) );  
  68.         camera->setProjectionMatrixAsPerspective(45.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 0.1f, 100.0f );  
  69.         camera->setViewMatrixAsLookAt(osg::Vec3d(0, 0, 1), osg::Vec3d(0, 0, 0), osg::Vec3d(0, 1, 0));  
  70.   
  71.         this->setSceneData( scene );  
  72.   
  73.         return gw->getGLWidget();  
  74.     }  
  75.   
  76.     osgQt::GraphicsWindowQt* createGraphicsWindow( int x, int y, int w, int h, const std::string& name=""bool windowDecoration=false )  
  77.     {  
  78.         osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();  
  79.         osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;  
  80.         traits->windowName = name;  
  81.         traits->windowDecoration = windowDecoration;  
  82.         traits->x = x;  
  83.         traits->y = y;  
  84.         traits->width = w;  
  85.         traits->height = h;  
  86.         traits->doubleBuffer = true;  
  87.         traits->alpha = ds->getMinimumNumAlphaBits();  
  88.         traits->stencil = ds->getMinimumNumStencilBits();  
  89.         traits->sampleBuffers = ds->getMultiSamples();  
  90.         traits->samples = ds->getNumMultiSamples();  
  91.   
  92.         return new osgQt::GraphicsWindowQt(traits.get());  
  93.     }  
  94.   
  95.     virtual void paintEvent( QPaintEvent* event )  
  96.     {   
  97.         frame();   
  98.     }  
  99.   
  100. protected:  
  101.   
  102.     QTimer _timer;  
  103. };  
  104.   
  105.   
  106.   
  107. osg::Node*  buildScene()  
  108. {  
  109.     osg::Group *root = new osg::Group;  
  110.   
  111.     osg::MatrixTransform *moveMT = new osg::MatrixTransform;  
  112.     moveMT->setMatrix(osg::Matrix::translate(0, 0, -10));  
  113.     root->addChild(moveMT);  
  114.   
  115.     osg::MatrixTransform *rotX = new osg::MatrixTransform;  
  116.     rotX->setUpdateCallback(new osg::AnimationPathCallback(osg::Vec3d(0, 0, 0), osg::X_AXIS, 0.5));  
  117.     osg::MatrixTransform *rotY = new osg::MatrixTransform;  
  118.     rotY->setUpdateCallback(new osg::AnimationPathCallback(osg::Vec3d(0, 0, 0), osg::Y_AXIS, 0.4));  
  119.     osg::MatrixTransform *rotZ = new osg::MatrixTransform;  
  120.     rotZ->setUpdateCallback(new osg::AnimationPathCallback(osg::Vec3d(0, 0, 0), osg::Z_AXIS, 0.3));  
  121.   
  122.     moveMT->addChild(rotX);  
  123.     rotX->addChild(rotY);  
  124.     rotY->addChild(rotZ);  
  125.   
  126.     osg::Geode *fontGeode = new osg::Geode;  
  127.   
  128.     osg::Image *textureImage = osgDB::readImageFile("Data/Lights.bmp");  
  129.     osg::Texture2D *texture2D = new osg::Texture2D;  
  130.     texture2D->setImage(textureImage);  
  131.     texture2D->setFilter(osg::Texture::MIN_FILTER, osg::Texture::NEAREST);  
  132.     texture2D->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST);  
  133.   
  134.     osg::TexGen *texGen = new osg::TexGen;  
  135.     texGen->setMode(osg::TexGen::OBJECT_LINEAR);  
  136.   
  137.     osgText::Text3D *text = new osgText::Text3D;  
  138.     text->setCharacterSize(3.0f);  
  139.     text->setCharacterDepth(0.5f);  
  140.     text->setText("N");  
  141.     text->setFont("fonts/Wingding.ttf");  
  142.     text->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture2D);  
  143.     fontGeode->getOrCreateStateSet()->setTextureAttributeAndModes(0, texGen);  
  144.     fontGeode->addDrawable(text);  
  145.   
  146.     rotZ->addChild(fontGeode);  
  147.   
  148.     return root;  
  149. }  
  150.   
  151.   
  152.   
  153. int main( int argc, char** argv )  
  154. {  
  155.     QApplication app(argc, argv);  
  156.     ViewerWidget* viewWidget = new ViewerWidget(buildScene());  
  157.     viewWidget->setGeometry( 100, 100, 640, 480 );  
  158.     viewWidget->show();  
  159.     return app.exec();  
  160. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值