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 问题

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

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

相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript