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 }