场景图形管理 - (2)

      1. 裁剪平面示例(二)

裁剪平面(osg::Scissor)示例(二)的代码如程序清单8-2所示

// 裁剪平面测试(2)

void scissor_8_2(const string strDataFolder)

{

    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;

    traits->x = 50;

    traits->y = 50;

    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());

    osg::ref_ptr<osg::Camera> camera = new osg::Camera;

    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->addSlave(camera.get());

    // 创建一个裁剪面

    osg::ref_ptr<osg::Scissor> scissor = new osg::Scissor;

    // 设置裁剪面矩形(左下角坐标,长和宽)

    scissor->setScissor(150, 150, 800, 600);

    osg::ref_ptr<osg::Group> root = new osg::Group();

    string strDataPath = strDataFolder + "cow.osg";

    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);

    if (node == nullptr)

    {

        cout << "读取cow.osg失败!" << endl;

        return;

    }

    root->addChild(node.get());

    osgUtil::Optimizer optimizer;

    optimizer.optimize(root.get());

    viewer->setSceneData(root.get());

    viewer->realize();

    viewer->run();

}

运行程序,截图如图 8-9 所示。

图8-9裁剪平面示例(二)截图

      1. 单视图与相机

在OSG中,单视图的管理是通过osgViewer.:Viewer来实现的。osgViewer.:Viewer 继承自多个类,负责OSG中单视图的管理,继承关系图如图8-10所示

图8-10 osgViewer::Viewer 的继承关系图

从继承关系图中可以看出osgViewer:Viewer继承自osgVicwer:View类和osg:Viewer:ViewerBase同样它也间接继承自osg::Referenced 类。因此,可以使用智能指针来管理

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

在osgViewer:Viewer中,只允许单视图,单视图可以同时包含多个相机渲染,也可以在多窗口中渲染。为了能够进行正常的渲染,还需要创建一个图形环境(默认的情况下已经创建了一个)。有时为了方便控制场景渲染,需要设置一个合适的图形环境窗口。

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

  1. 通过 WindowingSystemInterface 类得到系统窗口接口,该系统接口主要是为了关联窗口系统与图形环境。
  2. 下面是OSG中图形环境的主要特性,但在实际应用的过程中,没有必要设置每一个参数,只需根据实际需要来设置合理的参数即可。

x;y,width,height;// 窗口的坐标、高度及宽度,默认值都为0;windowDecration(false); // 是否支持窗口扩展的功能,Wi32中style

supportsResize(truc),// 是否支持窗口编放

red(8). //红色位数,默认8位

blue(8)//蓝色位数,默认8位

green(8)//绿色位数,默认8位

alpha(0)//alpha值位数,透明度,默认没有alpha通道,为RGB格式

depth(24)//颜色的深度(16,24,32),默认使用24位

stencil(0)//模板默认无

sampleBuffers(0)//采样缓存,默认无

samples(0).//采样倍数(抗锯齿的倍数),默认无

pbuffer(false)//pbuffer,默认不支持

quadBufferStereo(false)//立体四缓存,主要在高端显卡上有,如QUDRO显卡上

doubleBuffer(false) //是否支持双缓存,默认不支持

target(0),//目标

format(0)//格式

level(0)//嵌套的层数,默认无

face(0)./

mipMapGeneration(false),//是否支持生成Mipmap,默认不支持

vsync(true)//是否支持同步,默认同步模式

useMultiThreadedOpenGLEngine(false)/是否采用多线程,默认不支持

useCursor(true)//是否使用鼠标的指针,默认使用

sharedContext(0),//共享上下文

setInheritedWindowPixelFormat(false)//是否继承Window 中的位格式

  1. 通过图形环境特性创建图形环境。通过调用一个静态成员函数创建图形环境的代码如下:

osg::GraphicsContext:createGraphics(trait.get());

<4> 通过图形环境建窗口(hwnd)

有时仅用上面的方法创建一个图形环境是远远不够的,在OSG2.x系列以后,窗口的控制方式发生了变换,主要由宽度来控制场景的缩放。当窗口的宽度和高度不是 4:3 时,会出现一系列的问题,如变形等。这时调整宽度和高度肯定是可以的,还有一种方法就是设置投影矩阵。可以通过得到默认的对称透视投影,然后根据当前窗口的比例来确定一个合适的投影矩阵,代码可参看第 8.1.5节的示例。

      1. 宽屏变形示例

宽屏变形示例的代码如程序清单8-3所示

// 单视图+单相机 宽屏变形示例(3)

void wideScreen_8_3(const string strDataFolder)

{

    // 创建Viewer对象,场景浏览器

    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

    // 创建场景组节点

    osg::ref_ptr<osg::Group> root = new osg::Group();

    // 读取模型

    string strDataPath = strDataFolder + "cow.osg";

    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);

    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." << 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" << 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();

}

运行程序,截图如图8-11所示

图8-11宽屏变形示例截图

      1. 单视图多相机渲染示例

单视图多相机渲染示例的代码如程序清单8-4所示

// 单视图多相机示例(4)

void singleWindowMultipleCameras(osg::ref_ptr<osgViewer::Viewer> viewer)

{

    // 创建窗口系统接口

    osg::ref_ptr<osg::GraphicsContext::WindowingSystemInterface> wsi = osg::GraphicsContext::getWindowingSystemInterface();

    if (!wsi)

    {

        osg::notify(osg::NOTICE) << "Error, no WindowSystemInterface available cannot create windows." << 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." << 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." << 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(9, 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());

}

void sinGraphMulCam_8_4(const string strDataFolder)

{

    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

    // 读取牛的模型

    string strDataPath = strDataFolder + "cow.osg";

    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);

    // 启用单视图多相机渲染

    singleWindowMultipleCameras(viewer.get());

    // 优化场景数据

    osgUtil::Optimizer optimizer;

    optimizer.optimize(node.get());

    viewer->setSceneData(node.get());

    viewer->realize();

    viewer->run();

}

运行程序,截图如图8-12所示

图8-12单视图多相机染示例截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/149669.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FPGA电平标准的介绍

对FPGA的管脚进行约束的时候&#xff0c;常常看到这样的电平标准&#xff0c;例如LVCOM18&#xff0c;LVCOS25&#xff0c;LVDS&#xff0c;LVDS25等等&#xff0c;其实这些都是一系列的电平标准。 针对数字电路而言&#xff0c;数字电路表示电平的只有1和0两个状态&#xff0c…

11.15 知识总结(模板层、模型层)

一、 模板层 1.1 过滤器 1.什么是过滤器&#xff1f; 过滤器类似于python的内置函数&#xff0c;用来把变量值加以修饰后再显示。 2. 语法 1、 {{ 变量名|过滤器名 }} 2、链式调用&#xff1a;上一个过滤器的结果继续被下一个过滤器处理 {{ 变量名|过滤器1|过滤器2 }} 3、有的过…

栈与队列:用队列实现栈

目录 题目&#xff1a; 栈和队列的数据模型对比&#xff1a; 思路分析&#xff1a; 代码分析&#xff1a; 一、定义栈 二、初始化栈 三、入栈 四、出栈⭐ 代码解析&#xff1a; 五、获取栈顶元素 六、 判断栈是否为空 七、销毁栈 完整代码&#xff1a; 需…

在webstorm中配置sass编译环境

1.下载ruby 下载地址&#xff1a;ruby下载 2.安装ruby 下载之后&#xff0c;有一个exe安装包 双击exe文件 &#xff0c;并选择自己的安装位置&#xff08;这个位置一定要记得&#xff0c;需要在webstorm中使用&#xff09;。其他的步骤默认安装即可。 3.安装sass ruby安装成功后…

记feign调用第三方接口时header是multipart/form-data

1.请求第三方接口&#xff0c;用feign请求 请求第三方接口&#xff0c;用feign请求&#xff0c;header不通&#xff0c;feign的写法不同 调用时报错Could not write request: no suitable HttpMessageConverter found for request type [com.ccreate.cnpc.mall.dto.zm.ZMPage…

程序员的护城河:技术深度、创新精神与软实力的完美结合

文章目录 1. 技术深度&#xff1a;建立坚实的技术基石2. 创新精神&#xff1a;应对变革的利器3. 软实力&#xff1a;沟通协作构筑团队防线4. 结合三者构筑完美护城河 &#x1f389;程序员的护城河&#xff1a;技术深度、创新精神与软实力的完美结合 ☆* o(≧▽≦)o *☆嗨~我是I…

【Maven】进阶

文章目录 1. 聚合2. 继承3. 属性变量定义与使用4. 版本管理5. 资源配置6. 多环境配置7. 跳过测试&#xff08;了解&#xff09; 1. 聚合 为了防止某个模块&#xff08;dao&#xff09;更新了&#xff0c;重新编译了&#xff0c;导致和其他模块不兼容&#xff0c;需要用一个roo…

移植freertos到qemu上运行

1、freertos源码下载 参考博客&#xff1a;《freertos源码下载和目录结构分析》&#xff1b; 2、编译freertos 2.1、选择合适的Demo freertos官方已经适配过qemu&#xff0c;所以我们并不需要做源码级别的移植&#xff0c;只需要选择合适的Demo文件夹。 2.2、修改Makefile 2.3…

sCrypt 发布零知识证明精选列表

sCrypt 发布了与零知识证明相关的精选列表&#xff0c;包括&#xff1a;教程&#xff0c;编程语言&#xff0c;工具&#xff0c;书籍&#xff0c;社区&#xff0c;证明系统。欢迎收藏 github 代码仓&#xff1a;https://github.com/sCrypt-Inc/awesome-zero-knowledge-proofs。…

spark与scala的对应版本查看

仓库地址 https://mvnrepository.com/artifact/org.apache.spark/spark-core 总结 spark3.0 以后&#xff0c;不再支持 scala2.11spark3.0 以后&#xff0c;只能用 scala2.12以上

Zabbix邮箱告警

1.在邮箱中获取授权码 2.zabbix配置 agengt配置 添加以下配置 [rootserver03 ~]# visudo zabbix ALL(ALL) NOPASSWD: ALL [rootserver03 ~]# vim /etc/zabbix/zabbix_agentd.conf EnableRemoteCommands1 #允许接收远程命令 修改原有的值&#xff0c;不要在末…

Windows系统CMake+VS编译protobuf

目录 一些名词CMake构建VS工程下载protobuf源码下载CMake编译QT中使用 方案二失败&#xff1a;CMakeQT自带的Mingw编译参考链接 一些名词 lib dll lib库实际上分为两种&#xff0c;一种是静态链接lib库或者叫做静态lib库&#xff0c;另一种叫做动态链接库dll库的lib导入库或称…

.Net8 Blazor 尝鲜

全栈 Web UI 随着 .NET 8 的发布&#xff0c;Blazor 已成为全堆栈 Web UI 框架&#xff0c;可用于开发在组件或页面级别呈现内容的应用&#xff0c;其中包含&#xff1a; 用于生成静态 HTML 的静态服务器呈现。使用 Blazor Server 托管模型的交互式服务器呈现。使用 Blazor W…

LINMP搭建wordpress-数据库不分离

目录 一、nginx部署 1.安装nginx前的系统依赖环境检查 2.下载nginx源代码包 3.解压缩源码包 4.创建普通的nginx用户 5.开始编译安装nginx服务 6.创建一个软连接以供集中管理 7.配置nginx环境变量 二、mysql 1.创建普通mysql用户 2.下载mysql二进制代码包 3.创建mys…

吴恩达《机器学习》8-5->8-6:特征与直观理解I、样本与值观理解II

8.5、特征与直观理解I 一、神经网络的学习特性 神经网络通过学习可以得出自身的一系列特征。相对于普通的逻辑回归&#xff0c;在使用原始特征 x1​,x2​,...,xn​ 时受到一定的限制。虽然可以使用一些二项式项来组合这些特征&#xff0c;但仍然受到原始特征的限制。在神经网…

【MySQL】MVCC(多版本并发控制)详解

MVCC MVCC概述 MVCC&#xff0c;全称 Multi-Version Concurrency Control &#xff0c;即多版本并发控制。MVCC 是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问&#xff0c;在编程语言中实现事务内存。 MVCC就是在ReadCommitte…

echarts实现不展示X轴Y轴轴线、刻度

今日工作中需要实现折线图的简图&#xff0c;就是只看个大概趋势不展示具体坐标&#xff0c;查阅了文档记录一下。 initCharts(_id, _name, yAxisData, _unit){if(this[_id]) this[_id].clear();this[_id] $echarts.init(document.getElementById(_id));const options {grid…

基于Springboot+Vue的社区医院管理系统

基于SpringbootVue的社区医院管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 医生列表 医生详情 登录界面 管理员界面 医生界面 摘要 社区医院管…

van-dialog弹窗异步关闭-校验表单

van-dialog弹窗异步关闭 有时候我们需要通过弹窗去处理表单数据&#xff0c;在原生微信小程序配合vant组件中有多种方式实现&#xff0c;其中UI美观度最高的就是通过van-dialog嵌套表单实现。 通常表单涉及到是否必填&#xff0c;在van-dialog的确认事件中直接return是无法阻止…

POE也收费了

一直通过POE在用chatgpt&#xff0c;今天下午发现要收费了…