以下內容來自:
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();
}