在OSG中嵌入OpenGL代码

思路:在osg中创建结点, 比如Geometry对象, 然后给该对象添加DrawCallback, 在这个DrawCallback中使用opengl进行绘制。

(1)继承osg::Drawable::DrawCallback,在
drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable)函数里添加opengl代码。
(2)Drawable设置绘制回调函数,并注意要把显示列表设置为false:
geometry->setUseDisplayList(false);
geometry->setDrawCallback(new DrawCallback);

步骤:
1.新建CLR控制台程序
2.添加包含目录,库目录和链接器输入。

在这里插入图片描述
在这里插入图片描述
具体配置参考:windows10 下OSG+VS环境搭建

// osgdemo2.cpp: 主项目文件。

#include "stdafx.h"
#include <windows.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, "osgUtild.lib")

//opengl的头文件和库文件

#include <gl/gl.h>

#include <gl/glu.h>

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

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


///两种方法:1. 在osg中创建结点, 比如Geometry对象, 然后给该对象添加DrawCallback, 在这个DrawCallback中使用opengl进行绘制




class DrawCallback : public osg::Drawable::DrawCallback

{
	virtual void drawImplementation(osg::RenderInfo& renderInfo, const osg::Drawable* drawable) const

	{
		static double dColor = 0;//颜色

		glColor3f(dColor, 0, 0);

		glBegin(GL_TRIANGLES);//在OSG中画一个opengl三角形

		glVertex3f(0.0, 0.0, -2.0);

		glVertex3f(0.2, 0.0, -2.0);

		glVertex3f(0.0, 0.4, -2.0);

		glEnd();

		dColor += 0.01;//颜色渐变

		if (dColor > 1.0)

		{
			dColor = 0.0;

		}

	}

};

int main(int argc, char **argv)

{
	osgViewer::Viewer viewer;

	osg::Geometry* geometry = new osg::Geometry;

	//此处一定要把显示列表设置为false,

	//否则DrawCallback的drawImplementation()函数只会调用一次,而不是在画一帧时都动态更新opengl图形

	geometry->setUseDisplayList(false);

	geometry->setDrawCallback(new DrawCallback);//Drawable设置动态更新opengl图形

	osg::Geode* geode = new osg::Geode;

	geode->addDrawable(geometry);

	geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);

	osg::Group* group = new osg::Group;

	group->addChild(geode);

	viewer.setSceneData(group);

	//return viewer.run();

	osg::Matrix mt;

	mt.makeIdentity();

	while (!viewer.done())

	{
		viewer.getCamera()->setViewMatrix(mt);

		viewer.frame();

	}

}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的osgEarth嵌入Qt程序的示例代码: ```cpp #include <osgViewer/Viewer> #include <osgEarth/Map> #include <osgEarth/MapNode> #include <osgEarthUtil/EarthManipulator> #include <osgEarthQt/ViewerWidget> int main(int argc, char** argv) { QApplication app(argc, argv); // 创建一个 osgViewer::Viewer 对象 osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; // 创建一个 osgEarth::Map 对象 osg::ref_ptr<osgEarth::Map> map = new osgEarth::Map; // 创建一个 osgEarth::MapNode 对象 osg::ref_ptr<osgEarth::MapNode> mapNode = new osgEarth::MapNode(map); // 设置地球操作器 osg::ref_ptr<osgEarth::Util::EarthManipulator> manipulator = new osgEarth::Util::EarthManipulator; manipulator->setHomePosition(osgEarth::Util::Viewpoint(30.0, 120.0, 0.0, 0.0, -90.0, 0.0), 0.0, 0.0, true); viewer->setCameraManipulator(manipulator); // 将 osgEarth::MapNode 添加到 osgViewer::Viewer viewer->setSceneData(mapNode); // 创建一个 osgEarthQt::ViewerWidget 对象 osg::ref_ptr<osgEarthQt::ViewerWidget> widget = new osgEarthQt::ViewerWidget(viewer); // 设置 osgEarthQt::ViewerWidget 的窗口大小 widget->setMinimumSize(640, 480); widget->setMaximumSize(1024, 768); // 显示窗口 widget->show(); // 运行 Qt 应用程序 return app.exec(); } ``` 这个程序创建了一个 `osgViewer::Viewer` 对象,一个 `osgEarth::Map` 对象和一个 `osgEarth::MapNode` 对象。然后它设置了一个地球操作器,并将 `osgEarth::MapNode` 添加到 `osgViewer::Viewer` 。接下来,它创建了一个 `osgEarthQt::ViewerWidget` 对象,并将 `osgViewer::Viewer` 对象传递给它。最后,它显示了 `osgEarthQt::ViewerWidget` 窗口并运行 Qt 应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值