在vs下的osg的qt窗口開發例子以及一些注意事項


1.運行結果圖:

2.注意事項

(1)qt插件的設定一定要選擇好

(2)包含目錄和庫目錄的設置(我的是release庫,不是debug庫,設置請注意)

(3)鏈接器的附加依賴項中的庫添加

我的庫有(release庫,非debug):

qtmain.lib
Qt5Core.lib
Qt5Gui.lib
Qt5Widgets.lib
OpenThreads.lib
osg.lib
osgDB.lib
osgUtil.lib
osgGA.lib
osgViewer.lib
osgText.lib
Qt5OpenGL.lib
opengl32.lib
glu32.lib
osgQt.lib

3.代碼及其注釋

  1 #include <QtCore/QtCore>
  2 #include <QtGui/QtGui>>
  3 #include <osgDB/ReadFile>
  4 #include <osgViewer/ViewerEventHandlers>
  5 #include <osgViewer/Viewer>
  6 #include <osgQt/GraphicsWindowQt>
  7 #include <QtCore/QTimer>  
  8 #include <QtWidgets/QApplication>  
  9 #include <QtWidgets/QVBoxLayout>  
 10 #include <QtWidgets/QWidget>  
 11 #include <osgViewer/CompositeViewer>  
 12 #include <osgViewer/ViewerEventHandlers>  
 13 #include <osgGA/TrackballManipulator>    
 14 #include <osgQt/GraphicsWindowQt>  
 15 #include <iostream>  
 16 #include <osg/Node>
 17 #include <osg/Geode>
 18 #include <osg/Geometry>
 19 #include <osg/ShapeDrawable>
 20 #include <osg/Shape>
 21 #include <osgGA/StateSetManipulator>
 22 #include <osgQt/GraphicsWindowQt> 
 23 #include <QGLWidget>
 24 #include <QtWidgets/QMainWindow>
 25 #include "ui_qttest.h"
 26 //創建球模型
 27 osg::ref_ptr<osg::Node> createShape()
 28 {
 29      //幾何組結點
 30          osg::ref_ptr<osg::Geode> geode = new osg::Geode;
 31      float radius = 0.08f;
 32      float height = 0.1f;
 33      osg::TessellationHints* hints = new osg::TessellationHints;
 34      hints->setDetailRatio(0.5f);
 35      geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f, 0.0f, 0.0f), radius), hints));
 36      return geode.get();
 37 }
 38 //創建渲染器的相機
 39 osg::Camera* createCamera(int x, int y, int w, int h)
 40 {
 41     osg::DisplaySettings* ds =
 42         osg::DisplaySettings::instance().get();
 43     osg::ref_ptr<osg::GraphicsContext::Traits> traits =
 44         new osg::GraphicsContext::Traits; //聲明一個嵌入窗口的變量,只要是有窗口必須使用此對象進行設置
 45     traits->windowDecoration = false;//是否顯示窗口的描述,默認為false不顯示 
 46     traits->x = x;//設置顯示的x坐標
 47     traits->y = y;//設置顯示的y坐標
 48     traits->width = w;//設置窗口的寬度
 49     traits->height = h;//設置窗口的高度
 50     traits->doubleBuffer = true;//創建新的圖形窗口是否使用雙緩沖特性 
 51     osg::ref_ptr<osg::Camera> camera = new osg::Camera;
 52     //任意圖形子系統的抽象層接口,它提供了統一的圖形設備操作函數,用來實現渲染結果和底層設備的交互
 53     camera->setGraphicsContext(
 54         new osgQt::GraphicsWindowQt(traits.get()));
 55     //設置渲染器清除色
 56     camera->setClearColor(osg::Vec4(0.2, 0.2, 0.6, 1.0));
 57     //圖形輸出設置當前視口
 58     camera->setViewport(new osg::Viewport(
 59         0, 0, traits->width, traits->height));
 60     //標識攝像機在世界坐標系下的位置
 61     camera->setProjectionMatrixAsPerspective(
 62         30.0f, static_cast<double>(traits->width) /
 63         static_cast<double>(traits->height), 1.0f, 10000.0f);
 64     return camera.release();
 65 }
 66 
 67 class ViewerWidget : public QWidget
 68 {
 69 public:
 70     ViewerWidget(osg::Camera* camera, osg::Group* scene)
 71         //: QWidget()
 72         {
 73             _viewer.setCamera(camera);   //將相機添加到渲染器中
 74             _viewer.setSceneData(scene); //將模型添加到渲染器中
 75             _viewer.addEventHandler(new osgViewer::StatsHandler);
 76             //以下是創建了渲染器的一些操作
 77             _viewer.setCameraManipulator(new osgGA::TrackballManipulator);
 78             _viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);//創建為單線程    
 79             _viewer.addEventHandler(new osgGA::StateSetManipulator(_viewer.getCamera()->getOrCreateStateSet()));
 80             //窗口大小變化事件
 81             _viewer.addEventHandler(new osgViewer::WindowSizeHandler);
 82             //添加一些常用狀態設置
 83             _viewer.addEventHandler(new osgViewer::StatsHandler);
 84             //其實說gw就是要顯示的窗口
 85             osgQt::GraphicsWindowQt* gw =
 86                     dynamic_cast<osgQt::GraphicsWindowQt*>(
 87                     camera->getGraphicsContext());
 88                 if (gw)
 89                 {
 90                     QVBoxLayout* layout = new QVBoxLayout;
 91                     layout->addWidget(gw->getGLWidget());
 92                     setLayout(layout);
 93                 }
 94             connect(&_timer, SIGNAL(timeout()), this, SLOT(update()));
 95             _timer.start(40);//關聯定時器計滿信號和響應的槽函數
 96         }
 97 
 98 protected:
 99     virtual void paintEvent(QPaintEvent* event)
100     {
101         _viewer.frame();//實時進行渲染
102     } 
103     osgViewer::Viewer _viewer;//創建一個渲染器
104     QTimer _timer;//創建一個定時器
105 };
106 int main(int argc, char **argv)
107 {
108     QApplication app(argc, argv);
109     osg::Camera* camera = createCamera(50, 50, 640, 480);
110     osg::Group * scene = new osg::Group();
111     scene->addChild(createShape().get());
112 
113     ViewerWidget* widget = new ViewerWidget(camera, scene);
114     widget->setGeometry(100, 100, 800, 600);
115     widget->show();
116     return app.exec();
117 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM