OSG學習:場景圖形管理(四)——多視圖多窗口渲染

以下內容來自: 

1、《OpenSceneGraph三維渲染引擎編程指南》肖鵬 劉更代 徐明亮 清華大學出版社 
2、《OpenSceneGraph三維渲染引擎設計與實踐》王銳 錢學雷 清華大學出版社

3、自己的總結

創建C++項目後,首先需要配置OSG環境,具體步驟看OSG學習:WIN10系統下OSG+VS2017編譯及運行第六步:新建OSG項目測試。

 

// stdafx.h

#include <osg/Node>
#include <osg/Geode>  
#include <osg/Geometry>
#include <osg/Group>

#include <osg/MatrixTransform> //移動節點的矩陣類,最常用的移動節點的類。可隨動、旋轉控制節點
#include <osg/PositionAttitudeTransform> //位置變換節點類,提供模型的位置變換、大小縮放、原點位置的設置、座標系的變換
#include <osg/Camera>  //相機節點,管理OSG中的模型——視圖矩陣,相機的管理主要是通過各種變換實現的

#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

#include <osgUtil/Optimizer>
#include <osgViewer/Viewer>
#include <osgViewer/CompositeViewer> //多視圖的管理,負責多個視圖的管理及同步工作
//.cpp

//視圖窗口
osg::ref_ptr<osgViewer::Viewer> MultipleView(osg::ref_ptr<osg::Node> node, int i)
{
	int xoffset = 50;
	int yoffset = 200;

	//設置圖形環境特性
	osg::ref_ptr<osg::GraphicsContext::Traits> 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<osgViewer::Viewer> viewer = new osgViewer::Viewer();
	//創建相機
	osg::ref_ptr<osg::Camera> camera = viewer->getCamera();

	//創建圖形環境特性
	osg::ref_ptr<osg::GraphicsContext> 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<osg::Node> cow = osgDB::readNodeFile("cow.osg");
	osg::ref_ptr<osg::Node> cessna = osgDB::readNodeFile("cessna.osg");

	//優化場景數據
	osgUtil::Optimizer optimizer;
	optimizer.optimize(cow.get());
	optimizer.optimize(cessna.get());

	//創建兩個視圖
	osg::ref_ptr<osgViewer::Viewer> viewer1 = MultipleView(cow, 1);
	osg::ref_ptr<osgViewer::Viewer> viewer2 = MultipleView(cessna, 2);

	//創建一個CompositeViewer對象
	osg::ref_ptr<osgViewer::CompositeViewer> viewer = new osgViewer::CompositeViewer();
	//添加視圖
	viewer->addView(viewer1.get());
	viewer->addView(viewer2.get());
	viewer->realize();

	return viewer->run();
}

下載完整工程OSG_19_MultipleViewMultipleWindow

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章