OSG中嵌入一个opengl代码(且opengl图形能动态更新)

本文档展示了如何在OpenSceneGraph(OSG)中嵌入OpenGL代码并实现图形的动态更新。通过继承osg::Drawable::DrawCallback并在drawImplementation()函数中添加OpenGL指令,创建了一个动态颜色变化的三角形。关键步骤包括禁用Drawable的显示列表和设置DrawCallback。最终,通过Viewer不断帧更新,实现了OpenGL图形的实时变化效果。

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

 OSG中嵌入一个opengl代码(且opengl图形能动态更新)

(1)继承osg::Drawable::DrawCallback,在

drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable)函数里添加opengl代码。

(2)Drawable设置绘制回调函数,并注意要把显示列表设置为false:

geometry->setUseDisplayList(false);

geometry->setDrawCallback(new DrawCallback);

 

――――――――――――

参考代码如下(改编自OSG的例子程序osgSpaceWarp):

#include "stdafx.h"

 

#include <osgViewer/Viewer>

#include <osg/Group>

#include <osg/Geometry>

 

#pragma comment( lib, "osgd.lib"); //.在Debug版本下的库名都加d,如"osgd.lib"

#pragma comment( lib, "osgDBd.lib")

#pragma comment( lib, "osgViewerd.lib");

#pragma comment( lib, "osg

要将osg嵌入OpenGLWidget控件,需要以下几个步骤: 1. 在Qt中创建一个OpenGLWidget控件,并将其加入到主窗口中。 2. 使用osgViewer::GraphicsWindowEmbedded类创建一个osg的窗口,通过OpenGLWidget控件的id来指定osg窗口的大小和位置。 3. 将osgViewer::GraphicsWindowEmbedded对象传递给osgViewer::Viewer对象的setThreadingModel()方法。 4. 将osgViewer::Viewer对象的setSceneData()方法设置为您的osg场景图。 5. 将osgViewer::Viewer对象的run()方法放入Qt的事件循环中。 以下是将osg嵌入OpenGLWidget控件的示例代码: ```cpp #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtWidgets/QOpenGLWidget> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgGA/TrackballManipulator> #include <osgDB/ReadFile> #include <osg/GraphicsContext> #include <osgQt/GraphicsWindowQt> int main(int argc, char** argv) { QApplication app(argc, argv); QMainWindow mainWindow; QOpenGLWidget* openGLWidget = new QOpenGLWidget(&mainWindow); // 设置OpenGLWidget控件的大小 openGLWidget->setFixedSize(800, 600); // 创建osg的窗口 osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits(); traits->windowName = "osgQt"; traits->x = 0; traits->y = 0; traits->width = 800; traits->height = 600; traits->windowDecoration = false; traits->doubleBuffer = true; traits->sharedContext = 0; osgQt::GraphicsWindowQt* graphicsWindowQt = new osgQt::GraphicsWindowQt(traits.get(), openGLWidget); // 创建osgViewer::Viewer对象 osgViewer::Viewer viewer; viewer.setThreadingModel(osgViewer::ViewerBase::SingleThreaded); viewer.addEventHandler(new osgViewer::StatsHandler); viewer.setCameraManipulator(new osgGA::TrackballManipulator); // 设置osgViewer::Viewer对象的场景图 osg::Node* root = osgDB::readNodeFile("cow.osgt"); viewer.setSceneData(root); // 将osgViewer::Viewer对象与osg的窗口关联起来 osg::Camera* camera = viewer.getCamera(); camera->setGraphicsContext(graphicsWindowQt); camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height)); // 将osgViewer::Viewer对象的run()方法放入Qt的事件循环中 QWidget* widget = QWidget::createWindowContainer(openGLWidget, &mainWindow); mainWindow.setCentralWidget(widget); mainWindow.show(); QTimer::singleShot(0, [&viewer](){viewer.run();}); return app.exec(); } ``` 这个示例代码中,我们创建了一个大小为800x600的OpenGLWidget控件,并使用osgQt::GraphicsWindowQt类创建了一个osg的窗口。然后,我们设置了osgViewer::Viewer对象的场景图,并将osgViewer::Viewer对象与osg的窗口关联起来。最后,我们将osgViewer::Viewer对象的run()方法放入Qt的事件循环中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值