首页 >> 大全

Windows下osg+Qt搭建三维开发环境

2023-11-25 大全 26 作者:考证青年

本博文讲述利用 2019、Osg、Qt搭建三维开发环境。本次Qt版本为5.14.1,为 10。osg可以去osg下载,截至2022年8月21日,osg最新版本已经到3.6.5版本,考虑到最新版本的往往有些许的bug,故本文采用的是3.4.1版本,其下载地址为:-3.4.1

1.osg编译安装

osg在下的 编译安装参见《平台下用CMake编译osg》。

注意:在利用CMake生成.sln时,该解决方案的OSG Core文件夹下有的电脑会有osgQt工程 ,有的则没有,如:我公司电脑有osgQt工程,而我自己笔记本则没有,环境都一样,原因至今不知道。编译完成后,我的目录结构如下:

2.利用Qt创建osg工程

在 2019下创建一个osg的Qt工程,cpp代码代码如下:

#include "QtWidgetsApplication2.h"
#include
QtWidgetsApplication2::QtWidgetsApplication2(QWidget *parent): QWidget(parent)
{ui.setupUi(this);initOsg();
}QtWidgetsApplication2::~QtWidgetsApplication2()
{}
void QtWidgetsApplication2::initOsg()
{// 步骤一:初始化qt窗口系统osgQt::initQtWindowingSystem();// 步骤二:创建视口m_pViewer = new osgViewer::Viewer;// 步骤三:视口设为单线程(Qt5必须)m_pViewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);// 步骤四:对视图的操作,必须,否则无法显示黑屏m_pViewer->setCameraManipulator(new osgGA::TrackballManipulator);// 步骤五:视口操作// 步骤六:设置osgQt视口(一个应用程序用opgQt同一时刻只能设置一个视口)osgQt::setViewer(m_pViewer.get());// 步骤七:创建窗口(2个都要,只创建osgQt::GLWidget会挂掉)m_pGLWidget = new osgQt::GLWidget(this);m_pGraphicsWindowQt = new osgQt::GraphicsWindowQt(m_pGLWidget);// 步骤八:设置视口m_pViewport = new osg::Viewport(0, 0, m_pGLWidget->width(), m_pGLWidget->height());//m_pViewport = new osg::Viewport();// 步骤九:设置摄像机视口范围,未设置不会显示,即窗口一片黑(刷新窗口但没有内容显示)m_pViewer->getCamera()->setViewport(m_pViewport);m_pViewer->getCamera()->setClearColor(osg::Vec4f(0.0235, 0.45, 0.67, 1.0));// 步骤十:设置刷新显示内容,未设置不会显示,即一片白(不会刷新窗口)m_pViewer->getCamera()->setGraphicsContext(m_pGraphicsWindowQt);auto spCowNode = osgDB::readNodeFile("cow.osg");m_pViewer->setSceneData(spCowNode );}void QtWidgetsApplication2::resizeEvent(QResizeEvent* event)
{m_pGLWidget->move(0, 0);m_pGLWidget->resize(event->size());
}

.h代码如下:

#pragma once#include 
#include "ui_QtWidgetsApplication2.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
#include
class QtWidgetsApplication2 : public QWidget
{Q_OBJECTpublic:QtWidgetsApplication2(QWidget *parent = nullptr);~QtWidgetsApplication2();void initOsg();void resizeEvent(QResizeEvent* event) override;
private:Ui::QtWidgetsApplication2Class ui;// osg aboutosg::ref_ptr m_pViewer{ nullptr };osg::ref_ptr m_pViewport{ nullptr };osgQt::GLWidget* m_pGLWidget{ nullptr };osg::ref_ptr < osgQt::GraphicsWindowQt> m_pGraphicsWindowQt{ nullptr };
};

生成目录、包含目录、库目录、链接库设置如下:

图1:生成目录

图2:包含目录、库目录

图3:链接库设置

为了保证链接设置完全,我们把osg的核心库都加入,如下:

OpenThreadsd.lib
osgd.lib
osgDBd.lib
osgGAd.lib
osgManipulatord.lib
osgTextd.lib
osgUId.lib
osgUtild.lib
osgViewerd.lib
osgWidgetd.lib
osgQtd.lib

注意:这是debug版的lib,版的去掉文件名的最后一个d即可。

3.遇到的问题解决

当编译2节的工程时,会出现很多问题。

搭建系统开发环境__搭建开发环境步骤

问题1:报如下找不到头文件的错误:

解决方法:将E:\osg\build\下子目录下的文件拷贝

E:\osg\-3.4.1\目录下与其子目录名相同的目录中。

无法打开包括文件: “osgQt/Version”: No such file or directory

找到E:\osg\-3.4.1\src\osgQt目录下的.in文件拷贝到E:\osg\-3.4.1\\osgQt并重命名为,用记事本打开该文件并将下面删除:

#if (QT_VERSION < QT_VERSION_CHECK(OSGQT_QT_VERSION,0,0))
#error "Qt version mismatch detected! Make sure to compile applications using osgQt with the same major Qt version that osgQt has been compiled against."
#endif

否则会报:error C2018: 未知字符“0x40”。

问题2:osgQt工程问题

解决方案的OSG Core文件夹下有osgQt工程,则直接链接osgQt,2工程启动,但立马崩溃,崩溃于:osg\State.cpp的第229行,如下:

   _glExtensions->glGetQueryiv(GL_TIMESTAMP, GL_QUERY_COUNTER_BITS_ARB, &bits);

发现的函数指针没初始化,是随机值。解决方案的OSG Core文件夹下没有osgQt工程,则不会生成.lib,则会报找不到.lib。

4.自己创建osgQt工程

从3节遇到的问题我们知道,osg自带的osgQt工程会导致主程序崩溃;没有osgQt工程,则会报找不到.lib。那么我们手动创建osgQt工程,以生成.lib。

打开 2019,选择创建Qt Class ,工程名为osgQt,工程保存目录为:

E:\osg\build\src ,从工程中移除osgQt.h、osgQt.cpp。将E:\osg\-3.4.1\src\osgQt目录下的所有cpp文件和E:\osg\-3.4.1\\osgQt目录下的所有文件拷贝到刚新建的E:\osg\build\src\osgQt目录下,并在中将这些文件添加到工程中(、可以不添加)。之后将.cpp头部的

# 改为# ""。同理,只要是本工程中的文件,都将头文件的包含改为:

# 改为# "XXXX",其中XXXX为本目录的文件,如:。

。 按2节描述的那样为该工程添加包含目录、库目录、链接库(注意:.lib就不要添加了)。设置Qt的模块如下:

图4

设置生成的debug版本的文件名带一个d且设置输出目录,如下:

_搭建开发环境步骤_搭建系统开发环境

图5

编译osgQt,报如下错误:

即“”: 不允许 函数 的定义。找到文件,在文件顶部加入如下宏定义:# ,如下:

,如果还不行,将该的所有行都注释,加入:

#define OSGQT_EXPORT __declspec(dllexport)

再次编译,报如下链接错误:

产生这些错误的原因是类没生成元对象有关的cpp文件,也就是如下红色方框的属性节点在编译时消失导致不能生成moc文件,原因费解。

打开cmd或power shell,cd到当前目录,执行如下命令:

即:

C:\Qt\Qt5.14.1\5.14.1\msvc2017_64\bin\moc.exe QGraphicsViewAdapter -o moc_GraphicsViewAdapter.cpp

其中C:\Qt\Qt5.14.1\5.14.1是你Qt在本机的安装目录,此时会在当期目录下生成ter.cpp,将该文件添加到osgQt工程,再次编译就成功了,此时在E:\osg\build\bin目录下就有.dll、.lib。将.lib复制到E:\osg\build\lib目录。将从Osg官网下载的cow.osg、.rgb文件拷贝到2工程,并启动该工程,效果如下:

注意:.rgb也要拷贝,否则牛是白色的,不会是彩色的。

至此,下的osg和Qt开发环境配置完成。

5.后记

现在osg使用QT做窗口系统的工程剥离出去了,在 我们可以下载到osg使用QT窗口的工程,其中osgQt///.cpp中对使用Qt创建窗口使用OSG进行绘制有详细的示例。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了