以下内容来自:
1、《OpenSceneGraph三维渲染引擎编程指南》肖鹏 刘更代 徐明亮 清华大学出版社
2、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社
3、自己的总结
下载完整工程OSG_19_MultipleViewMultipleWindow
创建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();
}