以下内容来自:
1、《OpenSceneGraph三维渲染引擎编程指南》肖鹏 刘更代 徐明亮 清华大学出版社
2、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社
3、自己的总结
下载完整工程OSG_17_SingleWindowMultipleCameras
创建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/ViewerEventHandlers> //事件监听
//.cpp
*单窗口多相机渲染
*创建图形环境的步骤:
*通过WindowingSystemInterface类得到系统窗口接口,该系统接口主要是为了管理窗口系统与图形环境
*根据需要设置图形环境特性的参数
*通过图形环境特性创建图形环境
*通过图形环境创建窗口
*建立视口的关键步骤:
*创建图形环境(创建一个设备上下文对象)
*将该对象和一个相机关联
*设置视口位置
*添加相机到窗口中
void singleWindowMultipleCameras(osg::ref_ptr<osgViewer::Viewer> viewer)
//创建窗口系统接口(调用底层API得到绘图设备、窗口特性)
osg::ref_ptr<osg::GraphicsContext::WindowingSystemInterface> wsi = osg::GraphicsContext::getWindowingSystemInterface();
if (!wsi)
osg::notify(osg::NOTICE) << "Error, no WindowSystemInterface available, cannot create windows." << std::endl;
return;
//得到当前窗口分辨率
unsigned int width, height;
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
//设置图形环境特性(设置要创建的图形设备上下文)
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits();
//设置图形设备的尺寸
traits->x = 0;
traits->y = 0;
traits->width = width;
traits->height = height;
//显示标题栏
traits->windowDecoration = true;
traits->doubleBuffer = true;
traits->sharedContext = 0;
//创建图形环境(创建图形设备上下文)
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
if (gc->valid())
osg::notify(osg::INFO) << "GraphicsWindow has been created successfully." << std::endl;
gc->setClearColor(osg::Vec4f(0.2f, 0.2f, 1.6f, 1.0f));
gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
osg::notify(osg::NOTICE) << "GraphicsWindow has not been created successfully." << std::endl;
//设置第一个视口(创建cameraMaster主相机)
osg::ref_ptr<osg::Camera> cameraMaster = viewer->getCamera();
//设置图形环境
cameraMaster->setGraphicsContext(gc.get());
//根据分辨率确定合适的投影来保证显示的图形不变形
double fovy, aspectRatio, zNear, zFar;
cameraMaster->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);
double newAspectRatio = double(traits->width) / double(traits->height);
double aspectRatioChange = newAspectRatio / aspectRatio;
if (aspectRatioChange != 1.0)
cameraMaster->getProjectionMatrix() *= osg::Matrix::scale(1.0 / aspectRatioChange, 1.0, 1.0);
//设置视口位置
cameraMaster->setViewport(new osg::Viewport(0, 0, width, height));
//根据是否使用双缓存,确定绘制哪个缓存,如果使用双缓存,先绘制前缓存
GLenum bufferMaster = traits->doubleBuffer ? GL_BACK : GL_FRONT;
//设置缓冲区(设置每帧开始绘制时,绘制哪个缓存)
cameraMaster->setDrawBuffer(bufferMaster);
cameraMaster->setReadBuffer(bufferMaster);
//设置第二个视口(创建从属相机)
osg::ref_ptr<osg::Camera> cameraClient = new osg::Camera();
//设置图形环境
cameraClient->setGraphicsContext(gc.get());
//设置视口位置,视口的坐标为左下角为坐标原点
cameraClient->setViewport(new osg::Viewport(0, 0, 400, 400));
//根据是否使用双缓存,确定绘制哪个缓存,如果使用双缓存,先绘制前缓存
GLenum bufferClient = traits->doubleBuffer ? GL_BACK : GL_FRONT;
//设置缓冲区(设置每帧开始绘制时,绘制哪个缓存)
cameraClient->setDrawBuffer(bufferClient);
cameraClient->setReadBuffer(bufferClient);
//添加从属相机
viewer->addSlave(cameraClient, osg::Matrix::scale(aspectRatio, 1.0, 1.0), osg::Matrix());
int main()
osg::ref_ptr<osg::Node> root = osgDB::readNodeFile("cow.osg");
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
//启用单视图多相机渲染
singleWindowMultipleCameras(viewer.get());
//优化场景数据
osgUtil::Optimizer optimizer;
optimizer.optimize(root.get());
viewer->setSceneData(root.get());
viewer->realize();
return viewer->run();
1、《OpenSceneGraph三维渲染引擎编程指南》肖鹏 刘更代 徐明亮 清华大学出版社;
2、《OpenSceneGraph3.0三维视景仿真技术开发详解》国防工业出版社
3、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社
4、自己的总结,包括图。
OSG采用包围体层次(Bounding Volume Hi...
NodeKits 扩展了Nodes,Drawables 和StateAttributes 的概念,也可以看作是OSG 内核中osg 库的一种扩展。NodeKits 的意义远大于对OSG 类的继承,事实上它还能够提供对.osg 的封装。
总之,NodeKit 由两部分组成:NodeKit 本身,以及针对.osg 的封装插件库。
本节的内容在网盘中:
请使用浏览器打开,平时遇到问题或加群也可以加我微信:13324598743:
链接:https://pan.baidu.com/s/13gwJLwo_LbRnN3Bl2NXXXw
提取码:xrf5
首先左下角不需要响应事件,我们直接用一个camera即可,其主要设置如下:
设置窗口在左下角
– came
1.traits设置的是窗口的特性。其中x,y表示的是所建立的窗口左上角,在屏幕上的位置.原点在屏幕的左上角,向右为x正方向,想下为y正方向。osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->x = 300;
traits->y = ...
#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容
// Windows 头文件
#include <windows.h>
// C 运行时头文件
#include <stdlib.h>
#include <mal...
看了王锐大大的书,我感觉OSG中对事件的处理主要是由以下几块组成的:
1、事件适配器 GUIEventAdapter
这个类是作为系统交互事件和OSG交互事件的适配接口。这一句话还不是很理解。
源码文档里对于这个类的定义是:事件类,存储键盘、鼠标和窗口事件。
公有类型包括:
(这些类型都是枚举类型,每个类型中有若干整形常量)
MouseButtonMask
EventType :
1、《OpenSceneGraph三维渲染引擎编程指南》肖鹏 刘更代 徐明亮 清华大学出版社
2、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社
3、自己的总结
下载完整工程OSG_18_MultipleViewCameras
创建C++项目后,首先需要配置OSG环境,具体步骤看OSG学习:WIN10系统下OSG+VS2017...
在学习OSG提供的例子osgCamera中,由于例子很长,涉及很多细节,考虑将其分解为几个小例子。本文介绍实现在一个窗口中添加多个相机的功能。
此函数接受一个Viewer引用类型参数,设置图形上下文的特征变量traits,并由它建立图形上下文。根据需要差创建的相机数量,循环创建相机变量,并将其添加到观察器变量中,作为从相机。每次创建相机,都需要获取当前图形上下文,并设置相机的起点(左下角...