QT+OSG显示一个三维模型

2024-08-27 12:12

本文主要是介绍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  -losgGAINCLUDEPATH += $$PWD/osg370MSVC2019_64bit/OSG/include
DEPENDPATH += $$PWD/osg370MSVC2019_64bit/OSG/includewin32: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/ -losgQOpenGLINCLUDEPATH += $$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 viewerosgViewer::Viewer viewer;// 从文件中读取一个 OSG nodeosg::ref_ptr<osg::Node> root = osgDB::readNodeFile("Model/你的文件.ive");if (!root) {qDebug() << "no cow.osg file";return -1;}// 将 node 添加到 viewerviewer.setSceneData(root.get());// 启动 viewerreturn 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

#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_OBJECTpublic: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

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

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

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

这篇关于QT+OSG显示一个三维模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111632

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot