QT+OSG显示一个三维模型

1、环境配置

系统:windows10系统

QT:版本5.15.2 编译器:MSVC2019_64bit 编辑器:QT Creator

OSG版本:3.7.0 64位 为MSVC环境下编译

osgQt:为第三方编译的库,OSG因为版本不同已经不提供osgQt的封装。

2、基本知识

osg是一个免费开源的c++第三方库,基于openGL开发的,主要作用是用于三维模型的显示和处理,其中osg-earth主要是用于地球三维模型的显示,主要用在C/S架构,就是客户端/服务器端,B/S架构的是cesium,也是osg团队开发的。

osg只是一个c++库,主要作用是显示三维模型,如果想要在qt的widget中显示一个三维模型,一种方式是自己写,第二种方式就是使用第三方的库,叫osgQt。

3、如何在widget中显示一个.osg模型

准备工作:

能力强的可以自己编译osg的库,osgQt,osg-earth,能力一般的像我这样的,就下载别人编译好的库。

目前我手上只有osg3.7.0配套的osg和osgQt.

在QT中导入这些库,

我改了一下名字,osgQt这个就是osgQt370的这个,这些都是封装好的,直接在qt creator中导入。

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/osg370MSVC2019_64bit/OSG/lib/ -losg  -losgDB -losgUtil  -losgViewer  -losgGA
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/osg370MSVC2019_64bit/OSG/lib/ -losgd  -losgDBd -losgUtild  -losgViewerd  -losgGAd
else:unix: LIBS += -L$$PWD/osg370MSVC2019_64bit/OSG/lib/ -losg  -losgDB -losgUtil  -losgViewer  -losgGA

INCLUDEPATH += $$PWD/osg370MSVC2019_64bit/OSG/include
DEPENDPATH += $$PWD/osg370MSVC2019_64bit/OSG/include



win32:CONFIG(release, debug|release): LIBS += -L$$PWD/osgQtVC2019_64bit/vs2019_x64_osgQt/osgQt/lib/ -losgQOpenGL
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/osgQtVC2019_64bit/vs2019_x64_osgQt/osgQt/lib/ -losgQOpenGLd
else:unix: LIBS += -L$$PWD/osgQtVC2019_64bit/vs2019_x64_osgQt/osgQt/lib/ -losgQOpenGL

INCLUDEPATH += $$PWD/osgQtVC2019_64bit/vs2019_x64_osgQt/osgQt/include
DEPENDPATH += $$PWD/osgQtVC2019_64bit/vs2019_x64_osgQt/osgQt/include

3.1 如何打开一个三维图形文件并显示

在main函数中添加

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 设置工作目录为可执行文件所在目录
    QDir::setCurrent(QCoreApplication::applicationDirPath());

    // 打印当前工作目录以确认
    qDebug() << "Current working directory:" << QDir::currentPath();

    // 创建一个 OSG viewer
    osgViewer::Viewer viewer;

    // 从文件中读取一个 OSG node
    osg::ref_ptr<osg::Node> root = osgDB::readNodeFile("Model/你的文件.ive");

    if (!root) {
        qDebug() << "no cow.osg file";
        return -1;
    }

    // 将 node 添加到 viewer
    viewer.setSceneData(root.get());

    // 启动 viewer
    return viewer.run();

}

这样就可以直接显示一个模型,我这里用的是从官网下载的ive的一个滑翔机模型。

3.2 osg可以打开哪些三维图像软件

在 OpenSceneGraph (OSG) 中,除了 .osg 文件格式外,还可以显示许多其他常见的三维文件格式。OSG 支持多种3D文件格式的加载和显示,包括但不限于以下几种:

  1. .osgt / .osgb - OSG 的原生格式,分别表示文本和二进制格式。

  2. .obj - Wavefront OBJ 文件,是一种通用的3D模型格式。

  3. .3ds - Autodesk 3D Studio 文件格式,较为老旧但仍然广泛使用。

  4. .stl - 立体光刻文件格式,通常用于3D打印。

  5. .ply - Polygon 文件格式,常用于存储三维扫描数据。

  6. .ive - OSG 专用的二进制格式,通常用于大规模场景。

  7. .dae - COLLADA 文件格式,用于交换数字资产。

  8. .fbx - Autodesk FBX 文件格式,广泛用于3D动画和游戏开发中。

  9. .osgx - OSG XML 文件格式,类似于 .osg,但以 XML 形式存储。

  10. .gltf / .glb - GL Transmission Format,广泛用于网络传输和渲染。

实践可知,试了两种osg和ive文件,都是可以正常读出来的。

3.3如何让模型在QT窗口类显示

两种方法:将osg嵌入Qt窗口中有两种方式,一种是使用继承自QOpenGLWidget方式实现,另一种是使用osgQOpenglWidget来实现,第二种需要自行编译osgQt来实现。

运行效果:

新建一个继承QWidget的类:

添加头文件:

#include <osgViewer/Viewer>
#include <osg/Node>
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <osgViewer/View>
#include <osgQOpenGL/osgQOpenGLWidget>

osgshowwidget.h

cpp 复制代码
#ifndef OSGSHOWWIDGET_H
#define OSGSHOWWIDGET_H

#include <QWidget>
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <osgViewer/View>
#include <osgQOpenGL/osgQOpenGLWidget>

namespace Ui {
class osgShowWidget;
}

class osgShowWidget : public QWidget
{
    Q_OBJECT

public:
    explicit osgShowWidget(QWidget *parent = nullptr);
    ~osgShowWidget();

   // void setFile(string sFilename);

protected slots:
    void initWindow();

protected:
    osgQOpenGLWidget* _pOsgQOpenGLWidget;
    //string _sFilename;

private:
    Ui::osgShowWidget *ui;
};

#endif // OSGSHOWWIDGET_H

osgshowwidget.cpp

cpp 复制代码
#include "osgshowwidget.h"
#include "ui_osgshowwidget.h"

osgShowWidget::osgShowWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::osgShowWidget)
{
    ui->setupUi(this);
   _pOsgQOpenGLWidget = new osgQOpenGLWidget(this);
    _pOsgQOpenGLWidget->setGeometry(this->geometry());

    connect(_pOsgQOpenGLWidget, SIGNAL(initialized()), this, SLOT(initWindow()));



}

osgShowWidget::~osgShowWidget()
{
    delete ui;
   if(_pOsgQOpenGLWidget != NULL)
        delete _pOsgQOpenGLWidget;
}


void osgShowWidget::initWindow()
{
    osgViewer::Viewer* pViewer = _pOsgQOpenGLWidget->getOsgViewer();
    pViewer->setCameraManipulator(new osgGA::TrackballManipulator);
//    //osg::Node* node = osgDB::readNodeFile("E:\osgpro\addproject\build-addosgproject-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug\debug\model\cow.osg");
   osg::Node* node = osgDB::readNodeFile("E:\\osgpro\\addproject\\build-addosgproject-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug\\debug\\model\\glider.osg");
    pViewer->setSceneData(node);
}

我用的绝对路径,你们可以改成自己的路径。

3.4 问题

目前虽然可以显示,但是程序一直有一个提示:

也没有想到什么好的解决办法。

相关推荐
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
----云烟----5 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024065 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it5 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神6 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
宅小海6 小时前
scala String
大数据·开发语言·scala
qq_327342736 小时前
Java实现离线身份证号码OCR识别
java·开发语言
锅包肉的九珍6 小时前
Scala的Array数组
开发语言·后端·scala