博客
关于我
OSG学习:场景图形管理(三)——多视图相机渲染
阅读量:801 次
发布时间:2023-02-26

本文共 3681 字,大约阅读时间需要 12 分钟。

以下内容来自:

  • 《OpenSceneGraph三维渲染引擎编程指南》由清华大学出版社出版
  • 《OpenSceneGraph三维渲染引擎设计与实践》由清华大学出版社出版
  • 以下是基于上述书籍的个人总结
  • 创建C++项目后,首先需要配置OSG环境,具体步骤如下:

    第六步:新建OSG项目测试

    配置OSG环境时,需要包含以下头文件:#include <osg/...>#include <osg/ggeode/...>#include <osg/geometry/...>#include <osg/group/...>#include <osg/transform/...>#include <osg/positionattitudetransform/...>#include <osg/camera/...>#include <osg/trackballmanipulator/...>#include <osg/readfile/...>#include <osg/writefile/...>#include <osg/util/optimizer/...>#include <osg/viewer/...>#include <osg/viewer/EventHandler/...>

    代码示例:

    // stdafx.h#include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    多视图渲染实现:在OSG中,多视图的管理通过osgViewer::CompositeViewer实现。具体步骤如下:

  • 设置图形环境特性
  • 创建图形环境特性
  • 创建视图
  • 设置视图场景数据
  • 根据分辨率确定合适的投影
  • 设置相机视口及图形环境
  • 设置操作器
  • 添加事件处理
  • 以下是具体实现代码:

    // 创建图形环境特性osg::ref_ptr
    traits = new osg::GraphicsContext::Traits();traits->x = 100;traits->y = 100;traits->width = 900;traits->height = 700;traits->windowDecoration = true;traits->doubleBuffer = true;traits->sharedContext = 0;osg::ref_ptr
    gc;if (gc.valid()) { gc->setClearColor(osg::Vec4f(0.2f, 0.2f, 1.6f, 1.0f)); gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);}// 创建CompositeViewerosg::ref_ptr
    viewer = new osgViewer::CompositeViewer();// 添加视图void View1(osg::ref_ptr
    viewer, osg::ref_ptr
    node, osg::ref_ptr
    traits, osg::ref_ptr
    gc) { osg::ref_ptr
    view = new osgViewer::View(); viewer->addView(view.get()); view->setSceneData(node.get()); view->getCamera()->setViewport(new osg::Viewport(0, 0, traits->width / 2, traits->height / 2)); view->getCamera()->setGraphicsContext(gc.get()); view->setCameraManipulator(new osgGA::TrackballManipulator); view->addEventHandler(new osgViewer::StatsHandler); view->addEventHandler(new osgViewer::WindowSizeHandler); view->addEventHandler(new osgViewer::ThreadingHandler); view->addEventHandler(new osgViewer::RecordCameraPathHandler);}void View2(osg::ref_ptr
    viewer, osg::ref_ptr
    node, osg::ref_ptr
    traits, osg::ref_ptr
    gc) { osg::ref_ptr
    view = new osgViewer::View(); viewer->addView(view.get()); view->setSceneData(node.get()); view->getCamera()->setViewport(new osg::Viewport(traits->width / 2, 0, traits->width / 2, traits->height / 2)); view->getCamera()->setGraphicsContext(gc.get()); view->setCameraManipulator(new osgGA::TrackballManipulator);}void View3(osg::ref_ptr
    viewer, osg::ref_ptr
    node, osg::ref_ptr
    traits, osg::ref_ptr
    gc) { osg::ref_ptr
    view = new osgViewer::View(); viewer->addView(view.get()); view->setSceneData(node.get()); double fovy, aspectRatio, zNear, zFar; view->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar); double newAspectRatio = traits->width / (traits->height / 2); double aspectRatioChange = newAspectRatio / aspectRatio; if (aspectRatioChange != 1.0) { view->getCamera()->getProjectionMatrix() *= osg::Matrix::scale(1.0 / aspectRatioChange, 1.0, 1.0); } view->getCamera()->setViewport(new osg::Viewport(0, traits->height / 2, traits->width / 2, traits->height / 2)); view->getCamera()->setGraphicsContext(gc.get()); view->setCameraManipulator(new osgGA::TrackballManipulator);}// 读取模型并优化osg::ref_ptr
    cow = osgDB::readNodeFile("cow.osg");osg::ref_ptr
    cessna = osgDB::readNodeFile("cessna.osg");osgUtil::Optimizer optimizer;optimizer.optimize(cow.get());optimizer.optimize(cessna.get());// 创建并设置图形环境osg::ref_ptr
    traits = new osg::GraphicsContext::Traits();osg::ref_ptr
    gc = CreateGraphicsContext(traits);// 初始化CompositeViewerviewer->realize();return viewer->run();

    转载地址:http://rkvfk.baihongyu.com/

    你可能感兴趣的文章
    PHP 统计数据功能 有感
    查看>>
    SpringBoot处理JSON数据
    查看>>
    Redis使用基本套路
    查看>>
    php 解决项目中多个自动加载冲突问题
    查看>>
    PHP 设置调试工具XDebug PHPStorm IDE
    查看>>
    php 身份证号检测
    查看>>
    PHP 输入输出流合集
    查看>>
    PHP 过滤器(Filter)
    查看>>
    php 运算符and or && || 的详解
    查看>>
    php 返回html字符串长度限制,记一次js中和php中的字符串长度计算截取的终极问题和完美...
    查看>>
    php 阿里云oss 上传回调
    查看>>
    PHP 面向对象 final类与final方法
    查看>>
    php+JQ+EasyUI自动加载数据
    查看>>
    php+sql server根据自增序号id区间查询第几条到第几条的数据
    查看>>
    php--------获取当前时间、时间戳
    查看>>
    php--正则表达式
    查看>>
    php--防止sql注入的方法
    查看>>
    PHP-CGI Windows平台远程代码执行漏洞复现(CVE-2024-4577)
    查看>>
    php-cgi耗尽报502错误
    查看>>
    php-cgi(fpm-cgi) 进程 CPU 100% 与 file_get_content...
    查看>>