OSGQt编译安装

本文详细介绍如何从源码编译OSGQt,并提供在Windows环境下使用MSVC编译的具体步骤,包括配置环境变量、使用CMake及Visual Studio进行编译的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OSGQt编译安装🌈

更多精彩内容
👉个人内容分类汇总 👈

效果演示 🍓

在这里插入图片描述

1、准备工作📞

  • 最新版的osg中不附带osgQt源码,所以需要单独下载编译
  • 在编译osgQt前需要先编译osg源码,osg编译安装看这里
  • 编译osgQt的环境与之前编译osg源码一样

2、osgQt下载👍

  • github

  • 可使用git下载:git clone git@github.com:openscenegraph/osgQt.git

3、配置环境变量👌

  • osg:编译好后按OSG编译安装-MSVC中方式配置环境变量

  • **msvc2017_64:**由于这里使用msvc64编译,所以需要添加相应的环境变量

    • 打开环境变量窗口

    • 加入如下路径(需要修改为自己的Qt安装路径)

      D:\Qt\5.14.2\msvc2017_64\bin
      D:\Qt\5.14.2\msvc2017_64\lib
      

      在这里插入图片描述

  • 环境变量配置后重启电脑使环境变量生效

4、CMake编译🍎

  • 具体步骤和编译osg差不多
  • 将CMakelists.txt拖入CMake中,设置好编译后的路径build

在这里插入图片描述

  • 点击Configure,这里的选择必须与osg编译一样(如果没配置环境变量,则这一步会报错,显示找不到Qt5Config.cmake等文件)

在这里插入图片描述

  • 修改CMAKE_INSTALL_PREFIX

在这里插入图片描述

  • 点击Configure -> Generate -> Open Project

5、Visual Studio编译🕔

  • 后续步骤就和编译osg一样,编译好osgQt后,有如下4个文件夹,将文件夹中内容复制到osg安装路径下对应文件夹下即可(编译后会有两个lib)

在这里插入图片描述

在这里插入图片描述

6、Qt Demo🌲

  • pro文件添加
INCLUDEPATH += D:/OSG/install/include
DEPENDPATH += D:/OSG/install/include

win32:CONFIG(release, debug|release): LIBS += -LD:/OSG/install/lib/ -losgQOpenGL
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/OSG/install/lib/ -losgQOpenGLd

win32:CONFIG(release, debug|release): LIBS += -LD:/OSG/install/lib/ -losgViewer
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/OSG/install/lib/ -losgViewerd

win32:CONFIG(release, debug|release): LIBS += -LD:/OSG/install/lib/ -losgGA
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/OSG/install/lib/ -losgGAd


win32:CONFIG(release, debug|release): LIBS += -LD:/OSG/install/lib/ -losgDB
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/OSG/install/lib/ -losgDBd

win32:CONFIG(release, debug|release): LIBS += -LD:/OSG/install/lib/ -losg
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/OSG/install/lib/ -losgd
  • ui文件添加一个button,一个widget

在这里插入图片描述

  • widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <osgQOpenGL/osgQOpenGLWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

protected slots:
    void initOSG();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;

    osgQOpenGLWidget* osgWidget;
    QString m_fileName;
};
#endif // WIDGET_H

  • widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    osgWidget = new osgQOpenGLWidget(ui->widget);          // 指定osg窗口显示位置
    osgWidget->setGeometry(ui->widget->geometry());        // 指定osg窗口显示大小
    m_fileName = "D:/OSG/OpenSceneGraph-Data/avatar.osg";  // 显示模型路径

    connect(osgWidget, SIGNAL(initialized()), this, SLOT(initOSG()));
}

Widget::~Widget()
{
    delete ui;
    if(osgWidget != NULL)
    {
        delete osgWidget;
    }
}

void Widget::initOSG()
{
    osgViewer::Viewer* pViewer = osgWidget->getOsgViewer();
    pViewer->setCameraManipulator(new osgGA::TrackballManipulator);
    osg::Node* node = osgDB::readNodeFile(m_fileName.toStdString());
    pViewer->setSceneData(node);
}

void Widget::on_pushButton_clicked()
{
    m_fileName = "D:/OSG/OpenSceneGraph-Data/bignathan.osg";
    initOSG();
}

7、编译好的库🍉

链接:https://pan.baidu.com/s/1UfNbJ0fUAzKfe3XrWNVTDA
提取码:66tf

04-01
### OpenSceneGraph 与 Qt 集成教程及相关问题 OpenSceneGraph (OSG) 是一个开源的高性能图形库,用于创建交互式的三维应用程序。Qt 则是一个跨平台的应用程序框架,支持 GUI 开发和其他功能模块。两者结合可以实现强大的三维可视化应用。 以下是关于 OSGQt 的集成的一些关键点: #### 1. 基本概念 为了将 OSG 集成到 Qt 中,通常会使用 `QOpenGLWidget` 或者旧版本中的 `QGLWidget` 来作为渲染容器[^1]。通过这种方式,可以在 Qt 应用程序窗口中嵌入 OSG 渲染视图。 #### 2. 实现方法 一种常见的做法是在自定义的 `QOpenGLWidget` 子类中初始化并管理 OSG 的场景数据和相机设置。下面提供了一个简单的代码示例来展示如何完成这一过程: ```cpp #include <QOpenGLWidget> #include <osgViewer/CompositeViewer> class MyOsgWidget : public QOpenGLWidget { Q_OBJECT public: explicit MyOsgWidget(QWidget *parent = nullptr); protected: void initializeGL() override; void paintGL() override; private: osg::ref_ptr<osgViewer::CompositeViewer> viewer_; }; MyOsgWidget::MyOsgWidget(QWidget *parent) : QOpenGLWidget(parent), viewer_(new osgViewer::CompositeViewer()) {} void MyOsgWidget::initializeGL() { // 初始化 OSG 观察器 osgViewer::GraphicsHandle* handle = new osgViewer::GraphicsHandle(this->context()->nativeInterface()); osg::Camera* camera = viewer_->getCamera(); camera->setGraphicsContext(handle); // 设置投影矩阵等参数... } void MyOsgWidget::paintGL() { if (!viewer_) return; viewer_->frame(); // 执行一帧绘制操作 } ``` 上述代码片段展示了如何在继承自 `QOpenGLWidget` 的子类中初始化 OSG 并执行每帧更新逻辑[^2]。 #### 3. 可能遇到的问题及其解决方案 - **性能瓶颈**:如果发现渲染速度较慢,则可能是因为未优化场景结构或者启用了过多不必要的特性(如阴影计算)。可以通过简化几何体、减少动态变化节点数量等方式提升效率[^3]。 - **事件处理冲突**:当同时存在多个输入设备监听时可能会发生干扰现象。建议统一由顶层控件分派鼠标键盘消息给对应的组件实例处理[^4]。 - **多线程同步错误**:由于 OSG 默认运行在一个独立的工作线程里而 UI 更新往往发生在主线程上,因此需要注意保护共享资源访问的安全性[^5]。 #### 4. 进一步学习资料推荐 对于希望深入研究此主题的人士来说,《Mastering OpenSceneGraph》这本书籍提供了详尽的技术细节说明;另外也可以查阅官方文档以及社区论坛获取最新进展和技术讨论成果[^6]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mahuifa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值