洞若观火(二)osgQt库—OSG扩展库
osgQOpenGL是OSG的一个扩展库,通常与OSG一起使用。
·
OSG扩展库osgQt
1. osgQt简介
osgQOpenGL是OSG的一个扩展库,通常与OSG一起使用。
1.1 osgQt下载
| 源 | 地址 | |
|---|---|---|
| 1 | OpenSceneGraph官网 | http://www.openscenegraph.org/ |
| 2 | GitHub 导航页 | https://github.com/openscenegraph |
| 3 | GitHub OpenSceneGraph | https://github.com/openscenegraph/OpenSceneGraph |
| 4 | GitHub osgQt | https://github.com/openscenegraph/osgQt |
| 5 | OpenSceneGraph官网测试数据 | OpenSceneGraph-Data-3.4.0.zip |
| 6 | osg的具体应用 | 深入浅出(三)Osg库—三维图形工具包 |
| 7 | osgChina官网 | http://www.osgchina.org/downloads-son.php?id=34 |
1.2 OSG与OSGQT区别
| 项目 | OpenSceneGraph (OSG) | OSGQt(或类似项目) |
|---|---|---|
| 作用 | 纯3D渲染框架(无GUI) | 让OSG嵌入Qt GUI界面 |
| 界面系统 | 无(独立窗口,自己处理OS窗口) | 依赖Qt(嵌入QWidget或QOpenGLWidget) |
| OpenGL上下文管理 | 自己管理 | Qt管理,OSG配合Qt共享 |
| 适用场景 | 专业3D可视化(模拟器、VR、GIS等) | 需要Qt界面的软件(3D设计工具、工程软件、科研软件等) |
| 事件处理 | OSG事件器(osgGA::GUIEventHandler) | Qt事件(鼠标/键盘/拖拽等)与OSG事件融合 |
个人建议:
不适用该库,因为版本比较老旧,只支持到Qt4 和QT5。如果开发大型的软件,建议使用VSG,因为OSG在2020年版本的3.6.5后基本停更了,主要开发人员转战VSG了,有兴趣可以去了解下。
2. osgQt编译和部署
- osgQt编译之前应先编译OpenSceneGraph,详情参考洞若观火(一)OSG库—三维图形工具包
3. C++示例
- 集成OSG和Qt的头文件:在Qt项目中,您需要包含OSG和Qt的头文件。在您的Qt源代码文件中添加以下行来包含必要的头文件:
#include <QApplication>
#include <QWidget>
#include <osgViewer/Viewer>
#include <osgQt/GraphicsWindowQt>
- 创建OSG渲染窗口的容器:在Qt中,您可以使用
QWidget作为OSG渲染窗口的容器。创建一个继承自QWidget的新类,用于承载OSG渲染窗口。例如,您可以创建一个名为OSGWidget的类。
class OSGWidget : public QWidget
{
Q_OBJECT
public:
OSGWidget(QWidget* parent = nullptr) : QWidget(parent) {}
protected:
virtual void paintEvent(QPaintEvent* event) override
{
// 在此处进行OSG渲染
}
};
- 在
OSGWidget类中创建OSG渲染窗口:在OSGWidget类的构造函数中,创建一个osgQt::GraphicsWindowQt实例,并将其设置为OSG的渲染窗口。
class OSGWidget : public QWidget
{
Q_OBJECT
public:
OSGWidget(QWidget* parent = nullptr) : QWidget(parent)
{
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->x = 0;
traits->y = 0;
traits->width = width();
traits->height = height();
traits->windowDecoration = false;
traits->doubleBuffer = true;
osgQt::GraphicsWindowQt* gw = new osgQt::GraphicsWindowQt(traits.get());
osgViewer::Viewer* viewer = new osgViewer::Viewer;
viewer->getCamera()->setGraphicsContext(gw);
viewer->getCamera()->setViewport(new osg::Viewport(0, 0, width(), height()));
viewer->setSceneData(/* 设置您的OSG场景数据 */);
viewer->realize();
}
protected:
virtual void paintEvent(QPaintEvent* event) override
{
// 在此处进行OSG渲染
}
};
- 在Qt主窗口中使用
OSGWidget:在您的Qt主窗口中,实例化OSGWidget类,并将其添加到布局或设置为主窗口的中心部件。
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QMainWindow mainWindow;
OSGWidget* osgWidget = new OSGWidget(&mainWindow);
mainWindow.setCentralWidget(osgWidget);
mainWindow.show();
return app.exec();
}
通过以上步骤,您可以将OSG渲染窗口嵌入到Qt应用程序中。请注意,您还需要根据您的具体需求进行其他配置和操作,例如设置OSG场景数据、处理用户输入等。
更多推荐


所有评论(0)