分析
先打开osg库的头文件目录
可以看到有个osgQOpenGL,也就是说osg集成了QOpenGLWidget相关类。
pro
创建一个QWidget工程,修改工程文件
1 2 3
| INCLUDEPATH += $$PWD/osg/include LIBS += -L$$PWD/osg/lib -losgd -losgViewerd -losgUtild -losgDBd -losgQOpenGLd \ -losgGAd
|
声明
在widget.h中添加声明和定义
1 2 3 4 5 6 7
| #include "osgQOpenGL/osgQOpenGLWidget"
protected slots: void initWindow();
protected: osgQOpenGLWidget *m_pOSGQOpenGLWidget;
|
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include<osgViewer/Viewer> #include<osg/Node> #include<osg/Group> #include<osgDB/ReadFile> #include<osgDB/WriteFile> #include<osgUtil/Optimizer> #include <osg/Node> #include <osgViewer/Viewer> #include <osg/Geode> #include <osg/Group> #include <osgDB/ReadFile> #include <osgDB/WriteFile> #include <osgUtil/Optimizer> #include <osgGA/TrackballManipulator> #include <osgViewer/ViewerEventHandlers> #include <osg/MatrixTransform> #include <osg/BoundingSphere> #include <osg/ShapeDrawable> #include <osg/LineWidth> #include <osg/BlendColor> #include <osg/BlendFunc>
Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this);
m_pOSGQOpenGLWidget = new osgQOpenGLWidget(this); m_pOSGQOpenGLWidget->setGeometry(geometry());
connect(m_pOSGQOpenGLWidget,&osgQOpenGLWidget::initialized,this,&Widget::initWindow); }
Widget::~Widget() { if(m_pOSGQOpenGLWidget){ m_pOSGQOpenGLWidget->deleteLater(); } delete ui; }
void Widget::initWindow() { osgViewer::Viewer* pViewer = m_pOSGQOpenGLWidget->getOsgViewer(); pViewer->setCameraManipulator(new osgGA::TrackballManipulator); osg::Node* node = osgDB::readNodeFile("cow.osg"); pViewer->setSceneData(node); }
|
模型部分和上一篇的代码类似。
还是一样的将dll和模型复制到程序目录。
运行效果
ObjectXXX OSG 库依赖Qt 6.x,我使用的是Qt6.4.3
尽量版本匹配,不要用Qt5创建工程链接Qt6的库,可能会出问题。可以使用基于Qt5.14.2版本的库