• Qt 集成OSG


    Qt 你好 | 专注于Qt的技术分享平台

    一,新建一个 QOsgWidget 类,继承自osgQOpenGLWidget

    #ifndef QOSGWIDGET_H
    #define QOSGWIDGET_H
    
    #include 
    #include 
    #include 
    class QOsgWidget: public osgQOpenGLWidget
    {
        public:
            explicit QOsgWidget(QWidget *parent = nullptr);
            QSize sizeHint() const;
    
            void InitQOsgWidget();
    
    };
    
    #endif // QOSGWIDGET_H
    
    #include "qosgwidget.h"
    #include 
    QOsgWidget::QOsgWidget(QWidget *parent):osgQOpenGLWidget(parent)
    {
        //多重采样
        QSurfaceFormat surfaceFormat;
        surfaceFormat.setSamples(6);
        setFormat(surfaceFormat);
    }
    
    QSize QOsgWidget::sizeHint() const
    {
        return QSize(this->width(),this->height());
    }
    

    二,UI中创建一个QWidget 并提升为QOsgWidget

    三,主窗初始化这个QOsgWidget。 这里以一个 网格 节点为例。

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include 
    #include 
    #include "qosgwidget.h"
    
    QT_BEGIN_NAMESPACE
    namespace Ui {
    class Widget;
    }
    QT_END_NAMESPACE
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private:
        Ui::Widget *ui;
    
        void InitQOsgWidget();
    
        osg::ref_ptr _Root = nullptr;
        osg::ref_ptr _Viewer = nullptr;
    };
    #endif // WIDGET_H
    
    #include "widget.h"
    #include "ui_widget.h"
    
    #include 
    #include 
    #include 
    #include 
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
        connect(ui->widget, &osgQOpenGLWidget::initialized, this, &Widget::InitQOsgWidget);
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::InitQOsgWidget()
    {
        _Root = new osg::Group();
        QSize size = ui->widget->size();
    
        osg::ref_ptr trackball = new osgGA::TrackballManipulator;
        trackball->setAllowThrow(false);
        trackball->setAutoComputeHomePosition(true);
        trackball->setThreadSafeRefUnref(true);
    
        osgUtil::Optimizer optimizer;
        optimizer.optimize(_Root.get());
        _Viewer = ui->widget->getOsgViewer();
    
        _Viewer->addEventHandler(new osgViewer::StatsHandler);
        _Viewer->getCamera()->setClearColor(osg::Vec4(0.2, 0.2, 0.2, 1));
        _Viewer->getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast(size.width())/static_cast(size.height()), 1.0f, 10000.0f );
        _Viewer->setCameraManipulator(trackball);
        _Viewer->setRunMaxFrameRate(60);
    
    
        osg::ref_ptr grid = new osg::Geode;
        osg::Geometry* geom = new osg::Geometry;
        grid->addChild(geom);
    
        osg::Vec3Array* vertex = new osg::Vec3Array;
        geom->setVertexArray(vertex);
        //沿xy平面画线,间隔500米,从-10000,画到100000
        for (int i = -10; i <= 10; i += 1)
        {
            vertex->push_back(osg::Vec3(i, -10, 0));
            vertex->push_back(osg::Vec3(i, 10, 0));
            vertex->push_back(osg::Vec3(-10, i, 0));
            vertex->push_back(osg::Vec3(10, i, 0));
        }
        geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, vertex->size()));
        osg::Vec4Array* color = new osg::Vec4Array();
        color->push_back(osg::Vec4(0.7, 0.7, 0.7, 1.0));
        geom->setColorArray(color, osg::Array::BIND_OVERALL);
        geom->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
        _Root->addChild(grid);
    
        _Viewer->setSceneData(_Root.get());
    }
    

    四,效果

    集成OSG | Qt 你好

  • 相关阅读:
    【C++】运算符重载的示例实现和应用
    基于Java+springboot+SSM的医疗报销系统的设计与实现
    VSCode搭建ESP32 ESP-IDF开发环境-Windows
    第九章 泛型编程
    计算机竞赛 深度学习YOLO抽烟行为检测 - python opencv
    Android串口调试ADB
    一张纸搞明白全概率和贝叶斯的关系
    pytorch代码实现之SAConv卷积
    庖丁解牛:NIO核心概念与机制详解 04 _ 分散和聚集
    人工智能5:构建基于iris 数据集的 SVM 分类模型,含有 iris.csv
  • 原文地址:https://blog.csdn.net/weixin_38416696/article/details/138077018