OSG学习:场景图形管理(四)——多视图多窗口渲染

以下内容来自:

1、《OpenSceneGraph三维渲染引擎编程指南》肖鹏 刘更代 徐明亮 清华大学出版社

2、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社

3、自己的总结

下载完整工程OSG_19_MultipleViewMultipleWindow

创建C++项目后,首先需要配置OSG环境,具体步骤看OSG学习:WIN10系统下OSG+VS2017编译及运行第六步:新建OSG项目测试。

 

// stdafx.h

#include 
#include   
#include 
#include 

#include  //移动节点的矩阵类,最常用的移动节点的类。可随动、旋转控制节点
#include  //位置变换节点类,提供模型的位置变换、大小缩放、原点位置的设置、坐标系的变换
#include   //相机节点,管理OSG中的模型——视图矩阵,相机的管理主要是通过各种变换实现的

#include 
#include 

#include 
#include 
#include  //多视图的管理,负责多个视图的管理及同步工作
//.cpp

//视图窗口
osg::ref_ptr MultipleView(osg::ref_ptr node, int i)
{
	int xoffset = 50;
	int yoffset = 200;

	//设置图形环境特性
	osg::ref_ptr traits = new osg::GraphicsContext::Traits();
	//两个视图窗口的横坐标位置不同,否则会重叠
	if (i == 1)
	{
		traits->x = xoffset + 0;
	}
	else
	{
		traits->x = xoffset + 600;
	}
	traits->y = yoffset + 0;
	traits->width = 600;
	traits->height = 480;
	traits->windowDecoration = true;
	traits->doubleBuffer = true;
	traits->sharedContext = 0;
	
	//创建视图
	osg::ref_ptr viewer = new osgViewer::Viewer();
	//创建相机
	osg::ref_ptr camera = viewer->getCamera();

	//创建图形环境特性
	osg::ref_ptr gc = osg::GraphicsContext::createGraphicsContext(traits.get());	
	//设置图形环境
	camera->setGraphicsContext(gc.get());

	//设置视口
	camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
	
	//设置缓冲
	GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
	//设置缓冲区(设置每帧开始绘制时,绘制哪个缓存)
	camera->setDrawBuffer(buffer);
	camera->setReadBuffer(buffer);

	//设置场景数据
	viewer->setSceneData(node.get());

	return viewer.get();
}

int main()
{
	//读取模型,分别作为两个视图的节点
	osg::ref_ptr cow = osgDB::readNodeFile("cow.osg");
	osg::ref_ptr cessna = osgDB::readNodeFile("cessna.osg");

	//优化场景数据
	osgUtil::Optimizer optimizer;
	optimizer.optimize(cow.get());
	optimizer.optimize(cessna.get());

	//创建两个视图
	osg::ref_ptr viewer1 = MultipleView(cow, 1);
	osg::ref_ptr viewer2 = MultipleView(cessna, 2);

	//创建一个CompositeViewer对象
	osg::ref_ptr viewer = new osgViewer::CompositeViewer();
	//添加视图
	viewer->addView(viewer1.get());
	viewer->addView(viewer2.get());
	viewer->realize();

	return viewer->run();
}

 

你可能感兴趣的:(C/C++,OSG(Open,Scene,Graph),OSG,Camera,Viewer)