OSG 单视图与相机:宽屏变形示例

OSG图形环境、视图与相机、FBO和视景器——Part1(官方教程后补) osg学习 阅读详情
osgViewer::Viewer的继承图:

  • osg::View : 主要用来管理所有相机视图。它包含一个主相机和N个从属相机,如果View仅有一个主相机,则该主相机用来负责控制在和渲染视图场景。如果包含从属相机,则主相机用来负责控制管理视图,从属相机用于渲染场景。
  • osgViewer::View : 可以挂节事件,处理事件,并负责创建相机和创建图形环境窗口。
  • osgViewer::ViewerBase : 具有管理渲染的线程,负责设置线程模式,启动相关线程等功能。
  • osgGA::GUIActionAdapter : GUI动作适配器,用来向系统发送一些请求,以实现一些特定的操作。

在osgViewer::Viewer中, 只允许单视图,单视图可以同时包含多个相机渲染,也可以在多窗口中渲染。为了能够进行正常的渲染,还需要创建一个图形环境。


创建图形环境的主要步骤如下:

1、通过WindowingSystemInterface类得到系统窗口接口,该系统接口主要是为了关联窗口系统与图形环境。

2、下面是OSG中图形环境的主要特性:


3、通过图形环境特性创建图形环境。通过调用一个静态成员函数创建图形环境:
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext( traits.get()); 


4、通过图形环境创建窗口(句柄hwnd)

  
#include <osgViewer/Viewer>  
  
#include <osg/Node>  
#include <osg/Geode>  
#include <osg/Group>  
#include <osg/Camera>  
  
#include <osgDB/ReadFile>  
#include <osgDB/WriteFile>  
  
#include <osgUtil/Optimizer>  
  
#include <iostream>  
  
int main()  
{  
    //创建Viewer对象, 场景浏览器  
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();  
  
    //创建场景节点  
    osg::ref_ptr<osg::Group> root = new osg::Group();  
  
    //读取模型  
    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");  
  
    root->addChild(node.get());  
  
  
    //设置图形环境特性  
    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits();  
    traits->x = 0;  
    traits->y = 0;  
    traits->width = 1000;  
    traits->height = 800;  
    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, 0.6f, 1.0f));  
        gc->setClearMask(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);  
    }  
    else  
    {  
        osg::notify(osg::NOTICE)<< "GraphicsWindow has not been created successfully."<< std::endl;  
    }  
  
    //根据分辨率确定合适的投影来保证显示的图形不变形  
    double fovy, aspectRatio, zNear, zFar;  
    viewer->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);  
    double newAspectRatio = double(traits->width) / double(traits->height);  
    double aspectRatioChange = newAspectRatio / aspectRatio;  
    if (aspectRatioChange != 1.0)  
    {  
        //设置投影矩阵  
        viewer->getCamera()->getProjectionMatrix() *= osg::Matrix::scale(1.0 / aspectRatioChange, 1.0, 1.0);  
    }  
  
    //设置视口  
    viewer->getCamera()->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));  
    //设置图形环境  
    viewer->getCamera()->setGraphicsContext(gc.get());  
  
    //优化场景  
    osgUtil::Optimizer optimizer;  
    optimizer.optimize(root.get());  
  
    viewer->setSceneData(root.get());  
    viewer->realize();  
    viewer->run();  
    return 0;  
}  


OSG三维渲染引擎编程学习之七十三:“第七章:OSG场景图形交互” 之 “7.4 单视图” OSG三维渲染引擎编程学习;第七章:OSG场景图形交互;7.4 单视图 阅读详情

相关推荐

OSG三维渲染引擎编程学习之七十四:“第七章:OSG场景图形交互” 之 “7.5 单视图多相机”

OSG三维渲染引擎编程学习;第七章:OSG场景图形交互;7.5 单视图多相机

LuckyHanMo的博客 645

osg::Viewport解析

osg::Viewport视口类继承自osg::StateAttribute状态属性类 首先,条件编译value_type为int活double 四个保护型属性_x,_y,_width,, _height分别表示视口的左上点x,y坐标,视口的宽高 方法: //设置视口(inline内联(像宏一样展开),没有了调用的开销,效率更高) inline void setViewport(valu

TimothyFly的专栏 3842

OSG编程指南<二十二>:基于OSG+Qt制作三维可视化软件客户端

OSG编程指南<二十二>:基于OSG+Qt制作三维可视化软件,支持动态场景添加数据,高亮定位显示模型等,作为OSG入门练习项目学习。

欧特GO 4548

osg 创建窗口 traits 和 viewPort的关系

1.traits设置的是窗口的特性。其中x,y表示的是所建立的窗口左上角,在屏幕上的位置.原点在屏幕的左上角,向右为x正方向,想下为y正方向。osg::ref_ptr&lt;osg::GraphicsContext::Traits&gt; traits = new osg::GraphicsContext::Traits; traits-&gt;x = 300; traits-&gt;y = ...

u011230317的博客 2003

OSG编程指南<二十一>:OSG视图与相机视点更新设置及OSG宽屏变形

OSG编程指南<二十一>:OSG视图与相机视点更新设置及OSG宽屏变形

欧特GO 1531

第三章《OSG视图控制与摄像机操作》

在OSG中,**摄像机(Camera)**是一个特殊的节点,它决定了视图的设置和观察场景的方式。摄像机控制着“观察者”看到的场景内容。它的核心任务是将场景中的物体投影到二维屏幕空间上。

yumeiguo的博客 160

OSG集成QT Widget放入Layout显示变形解决方法

OSG集成QT Widget放入Layout显示变形解决方法 OSG集成QT osgQOpenGLWidget放入Layout显示变形问题 解决方法 OSG集成QT 看这篇文章,secen设置场景节点可以不用OSGEarth 用cmake编译osgQt + OSG3.6.4 放到OSG/Lib下面 osgQOpenGLWidget放入Layout显示变形问题 当Layout不是整个窗口或者 没有将osgQOpenGLWidget所在layout设置为centerWidget时,显示的模型宽高比不正

u014361059的博客 1309

osg获取和设置相机参数

OSG viewer.getCamera()可以获取默认相机;

bcbobo21cn的专栏 501

osg地球变形的解决方案

const osg::GraphicsContext::Traits* traits = _pGraphicsWindowQt->getTraits(); m_pCamera->setProjectionMatrixAsPerspective( 30.0f, static_cast<double>(traits->width) / static_cast<double>(traits->height), 1.0f, 10000.0f).

qq_40164094的博客 584

AT89C52单片机+LCD屏:手把手教你做一个能算小数和负数的计算器(附完整代码)

本文详细介绍了如何使用AT89C52单片机和LCD1602显示屏构建一个支持小数和负数运算的高精度计算器。从硬件选型、系统架构设计到核心算法实现,提供了完整的代码示例和优化技巧,特别适合51单片机初学者和课程设计参考。

weixin_30374009的博客 370

安卓无障碍服务保活实战:如何用AccessibilityService实现后台常驻(附完整代码)

本文深入解析如何利用Android无障碍服务(AccessibilityService)实现后台服务保活,涵盖多版本系统适配、前台服务集成、开机自启机制等关键技术。通过详细的Kotlin代码示例和合规性指导,帮助开发者构建稳定可靠的后台服务解决方案,同时避免因滥用无障碍服务导致的应用下架风险。

milk5的博客 1073

场景图形管理 - (2)

osg-视图与相机

liangfei868的博客 284

嵌入式设备电量显示实战:MCP3421 ADC采集从原理到代码全解析(附避坑指南)

本文详细解析了嵌入式设备中MCP3421 ADC芯片在电量显示应用中的硬件设计、寄存器配置、I2C通信调试及低功耗优化策略。通过实战代码和避坑指南,帮助开发者实现高精度电量监测,特别针对I2C时序和分压电路设计等常见问题提供解决方案,适用于物联网终端和移动设备开发。

weixin_42525632的博客 386

Func 2 :osg::Camera 实现单视图多窗口

【代码】Func 2 :osg::Camera 实现单视图多窗口。

HelloMyDude的博客 387

Prometheus-2.53.1安装

Prometheus+Grafana安装

qlj062127的博客 1788

Memory SystemsCache, DRAM, Disk翻译学习DRAM部分(二)

DRAM 的发展史

qq_33473931的博客 995

OSG学习:场景图形管理(二)——单窗口多相机渲染

以下内容来自: 1、《OpenSceneGraph三维渲染引擎编程指南》肖鹏 刘更代 徐明亮 清华大学出版社 2、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社 3、自己的总结 下载完整工程OSG_17_SingleWindowMultipleCameras 创建C++项目后,首先需要配置OSG环境,具体步骤看OSG学习:WIN10系统下OSG+...

韶光 3343

YOLOv11改进 | 注意力篇 | YOLOv11引入24年动态卷积块注意力(Dynamic-CBAM),并构建C2PSA_DynamicCBAM

1.Dynamic-CBAM介绍1.1 摘要:重度抑郁症是一种普遍而严重的心理健康状况,对您的情绪,思想,行动和对世界的整体感知产生负面影响。由于抑郁症的症状不明显,确定一个人是否抑郁是很复杂的。然而,他们的声音可能是我们可以识别抑郁症迹象的因素之一。抑郁的人会表现出不适、悲伤,他们可能说话缓慢、颤抖,声音中失去情感。在这项研究中,我们提出了动态卷积块注意力模块(DynamicCBAM),用于在注意力-GRU网络中通过分析人类的音频信号来分类情感。

tsg6698的博客 1002

解决OpenSceneGraph自带的osgViewerMFC示例在宽屏显示器上变形的问题

最近因工作需要,开始研究OSG。非常郁闷的是,OSG自带的一个示例:osgViewerMFC在我的宽屏显示器上显示的对象都是变形的,在OSG China论坛里也有人问相同的问题,但几位大牛都说是没有设置正确的窗口与视口比例造成的,只要通过调用camera->setProjectionMatrixAsPerspective()方法设置一下就可以了,可我搞了半天也没效果。后来,无意间看到OSG3 Be

开心果壳 2605

《AI Coding手册:Claude Code、OpenAI Codex、OpenClaw深度解析与实战指南》

AI编码技术经历了从简单规则匹配到深度神经网络,再到当前智能体(Agent)架构的范式转变。第一阶段:静态代码补全(2010-2018)早期工具如IntelliSense、Emmet基于语法分析和固定模板提供代码提示。这类系统依赖预定义规则,缺乏语义理解能力,仅能处理局部代码片段。第二阶段:统计语言模型(2018-2020)以GPT-2、TabNine为代表,引入基于大规模代码训练的神经语言模型。

AI天才研究院 1033

NVIDIA GR00T SONIC - 人形机器人强化学习全身控制入门教程(一)

SONIC 是一个类人行为基础模型,它为机器人提供了一套从大规模人类动作数据中学习而来的核心运动技能。与为每个动作单独构建控制器不同,SONIC 将动作追踪作为可扩展的训练任务,因此单一套统一策略即可产生自然的全身运动,并支持多种多样的行为。         🎯 主要特点: 🚶 自然的全身运动(行走、爬行、动态动作) 🎮 支持实时 VR 遥操作 🤖 高级规划与交互的基础 📦 即用型 C++ 推理栈

2506_90492529的博客 840

osg解析系列-[osg::osgAnimation]-路径运动动画/变形动画/骨骼动画/纹理动画 4

【代码】M23.11.W4[osg::osgAnimation]-路径运动动画/变形动画/骨骼动画/纹理动画 4。

qq_42531872的博客 541

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

OSG 视景器、漫游器、摄像机与场景的关系

视景器包括几个最主要的组件:漫游器_cameraManipulator,用于实现交互式的场景漫 游;事件处理器组_eventHandlers,负责处理视景器的事件队列_eventQueue,主要是键盘/ 鼠标等事件的处理;场景_scene,它包括视景器所对应的场景图形根节点,以及用于提高节 点和图像数据处理速度的两个分页数据库;摄像机_camera 和_slaves,前者为场景的主摄像 机

ZhangXL的专栏 3825

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

第32节 左下角实时显示当前视口朝哪

功能说明 左下角有个小窗口,显示一个坐标轴,当主视口发生变化时,坐标轴会根据主视口的变化转动,以实时反映当前主视口朝哪 小窗口不响应鼠标事件 小窗口背景全透明,只有个轴 本节的内容在网盘中: 请使用浏览器打开,平时遇到问题或加群也可以加我微信:13324598743: 链接:https://pan.baidu.com/s/13gwJLwo_LbRnN3Bl2NXXXw 提取码:xrf5 关键点 首先左下角不需要响应事件,我们直接用一个camera即可,其主要设置如下: 设置窗口在左下角 – came

一切皆可视 1619

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

osg第27讲(相机基础)

osg

qq970767225的博客 1174
上一篇: OSG例子程序简介osgearth各个例子功能
下一篇: activex64位控件在win10 x64 ie11中不能运行
HelloEarth_
博客等级 码龄9年 38粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值