OSG在QT的中显示之三

本文详细介绍了一种在QT环境中集成OSG(OpenSceneGraph)进行3D图形渲染的方法。通过自定义View3DWidget类,结合QOpenGLWidget和osgViewer::Viewer,实现了3D模型在QT界面的实时展示。文章提供了具体的代码实例,展示了如何设置OSG数据,包括加载3D模型、设置相机参数以及事件处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前的时候写过关于OSG在QT中显示的文章。
OSG在QT的中显示之一
OSG在QT的中显示之二
就是运用了比较简单的方式实现了,OSG在QT中的显示,显示使用QOpenGLWidget来实现。

#pragma once
#include <QOpenGLWidget>
#include <osgViewer/Viewer>

class QMouseEvent;

class View3DWidget :public QOpenGLWidget,public osgViewer::Viewer{
public:
	View3DWidget(QWidget * parent = nullptr);
	~View3DWidget();

	void setOSGData();
private:
	virtual void initializeGL()override;
	virtual void resizeGL(int w, int h)override;
	virtual void paintGL()override;
private:
	osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> _osgGraphicsWindow;
	osg::ref_ptr<osg::Group> _root;
};


#include <QMouseEvent>

#include "View3DWidget.h"
#include "osgViewer/ViewerEventHandlers"
#include "osgDB/ReadFile"
#include "osgGA/TrackballManipulator"
#include "osgGA/StateSetManipulator"


View3DWidget::View3DWidget(QWidget * parent) 
	:QOpenGLWidget(parent){
	_osgGraphicsWindow = new osgViewer::GraphicsWindowEmbedded(0, 0, width(), height());
	getCamera()->setGraphicsContext(_osgGraphicsWindow);

	getCamera()->setViewport(new osg::Viewport(0, 0, width(), height()));
	getCamera()->setClearColor(osg::Vec4(0.2, 0.2, 0.6, 1.0));
	getCamera()->setProjectionMatrixAsPerspective(30.0f,
		static_cast<double>(width()) / static_cast<double>(height()),
		1.0f,
		10000.0f);

	setCameraManipulator(new osgGA::TrackballManipulator);
	setThreadingModel(osgViewer::Viewer::SingleThreaded);//创建为单线程
	addEventHandler(new osgGA::StateSetManipulator(getCamera()->getOrCreateStateSet()));
	addEventHandler(new osgViewer::WindowSizeHandler);
	addEventHandler(new osgViewer::StatsHandler);
}

View3DWidget::~View3DWidget() {
}

void View3DWidget::initializeGL() {

}

void View3DWidget::resizeGL(int w, int h) {
	_osgGraphicsWindow->getEventQueue()->windowResize(0, 0, w, h);
	_osgGraphicsWindow->resized(0, 0, w, h);
}

void View3DWidget::paintGL() {
	frame();
}

void View3DWidget::setOSGData() {
	_root = new osg::Group;

	osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("F:\\cow.osg");
	_root->addChild(node);
	this->setSceneData(_root);
	update();
}


具体引用:

	_view3DWidget = new View3DWidget();
	_view3DWidget->setOSGData();

	ui.verticalLayoutOSG->addWidget(_view3DWidget);

实现效果:
在这里插入图片描述
aaa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值