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

本文共 3730 字,大约阅读时间需要 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);
    }
    // 创建CompositeViewer
    osg::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); // 初始化CompositeViewer viewer->realize(); return viewer->run();

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

    你可能感兴趣的文章
    oracle ogg 单实例双向复制搭建(oracle-oracle)--Oracle GoldenGate
    查看>>
    oracle rac集群的东西之QQ聊天
    查看>>
    oracle scott趣事
    查看>>
    oracle script
    查看>>
    Oracle select表要带双引号的原因
    查看>>
    Oracle SOA Suit Adapter
    查看>>
    Oracle Spatial GeoRaster 金字塔栅格存储
    查看>>
    Oracle Spatial空间数据库建立
    查看>>
    UML— 活动图
    查看>>
    oracle sqlplus已停止工作,安装完成客户端后sqlplus报“段错误”
    查看>>
    oracle SQLserver 函数
    查看>>
    Oracle Statspack分析报告详解(一)
    查看>>
    oracle tirger_在Oracle中,临时表和全局临时表有什么区别?
    查看>>
    oracle where 条件的执行顺序分析1
    查看>>
    Oracle 中的 decode
    查看>>
    oracle 使用leading, use_nl, rownum调优
    查看>>
    oracle 修改字段类型方法
    查看>>
    oracle 内存参数示意图
    查看>>
    Oracle 写存储过程的一个模板还有一些基本的知识点
    查看>>
    UML- 配置图(部署图)
    查看>>