OSG开发笔记(三十三):同时观察物体不同角度的多视图从相机技术

​若该文为原创文章,未经允许不得转载
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/143932273
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

OSG开发专栏(点击传送门)

上一篇:《OSG开发笔记(三十二):深入理解相机视口、制作支持与主视图同步变换旋转的相机HUD》
下一篇:《OSG开发笔记(三十四): OsgUtil::Simplifier:简化几何体,提升显示性能和渲染效率》


前言

  前面的相机hud可以单独显示图形,继续深入研究相机hud,技术就是子视图了,实现该功能的直接技术是从相机技术。
  本篇描述osg从相机技术


Demo

  请添加图片描述

  请添加图片描述


相机视口的关键调用

是否清除颜色深度缓存(清除)

pCamera->setClearMask(GL_DEPTH_BUFFER_BIT);

  如果不清除颜色缓存,渲染的窗口中若无内容,则将其他窗口渲染的内容显示到当前窗口。

设置渲染顺序(最后渲染)

// 设置POST渲染顺序(最后渲染)
pCamera->setRenderOrder(osg::Camera::POST_RENDER);

  后渲染的优先级比较高(最后显示,显示优先级最高)。

设置是否接受事件(不接受)

// 设置为不接收事件,始终得不到焦点
pCamera->setAllowEventFocus(false);

设置视口大小

// 视口就是引擎三维的区域,但是注意区别于屏幕的坐标系(屏幕是左上为0,0,而三维引擎是左下为0,0)
pSlaveFrontCamera->setViewport(0,
                             0,
                             rect().width() / 4,
                             rect().height() / 4);

设置从相机故过程

步骤一:新建相机

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

步骤二:设置上下文

pSlaveFrontCamera->setGraphicsContext(_pViewer->getWindow());

步骤三:设置视图区域

// 视口就是引擎三维的区域,但是注意区别于屏幕的坐标系(屏幕是左上为0,0,而三维引擎是左下为0,0)
pSlaveFrontCamera->setViewport(0,
                             0,
                             rect().width() / 4,
                             rect().height() / 4);

步骤四:设置渲染顺序

pSlaveFrontCamera->setRenderOrder(osg::Camera::POST_RENDER);

步骤五:关键步骤添加从相机

  第二个参数是缩放矩阵,第三个参数是旋转矩阵

_pViewer->addSlave(pSlaveFrontCamera,
                  osg::Matrix(),
                  osg::Matrix::rotate(osg::DegreesToRadians(0.0), 0.0, 0.0, 0.0),
                  true);

Demo关键源码

osg::ref_ptr<osg::Node> OsgWidget::getMulViewCameraNode()
{
    // 隐藏整个demo全局的按钮面板(没用到按键的直接隐藏,不影响此Demo)
    {
        ui->groupBox_pannel->setVisible(false);
        ui->label_cursor->setVisible(false);
        ui->label_cursor_2->setVisible(false);
        ui->label_msg->setVisible(false);
        ui->label_state->setVisible(false);
    }

    osg::ref_ptr<osg::Group> pGroup = new osg::Group;
    // 绘制盒体(立方体、长方体)
    {
        osg::ref_ptr<osg::Geode> pGeode = new osg::Geode;
        // 创建专门指明精细度的类osg::TessellationHints,并设置对应精细度
        osg::ref_ptr<osg::TessellationHints> pHints = new osg::TessellationHints;
        pHints->setDetailRatio(0.5);
        // 绘制几何类型(几何体)
        qreal width = 5.0f;
        // 函数1
        pGeode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0, 0, 0), width), pHints));
#if 1
        // 设置关闭光照:OFF,同时旋转都能看到了(光照关闭,法向量不起作用)
        {
            osg::StateSet *pStateSet = pGeode->getOrCreateStateSet();
            pStateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON);
//            pStateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
        }
#endif
        pGroup->addChild(pGeode);
    }
    // 创建多视口相机
    {
#if 0
        // 这里改用了自己窗口已经创建的,这块废掉了,但是保留,基本的核心思想是一样的
        osg::ref_ptr<osg::GraphicsContext::WindowingSystemInterface> pWindowingSystemInterface
                = osg::GraphicsContext::getWindowingSystemInterface();
        if(!pWindowingSystemInterface.get())
        {
            LOG << "if(!pWindowingSystemInterface.get())";
            return pGroup.get();
        }
        unsigned int width = 0;
        unsigned int height = 0;
        pWindowingSystemInterface->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0),
                                                       width,
                                                       height);
        osg::ref_ptr<osg::GraphicsContext::Traits> pTraits = new osg::GraphicsContext::Traits;
        {
            pTraits->x = 0;
            pTraits->y = 0;
            pTraits->width = width;
            pTraits->height = height;
            pTraits->windowDecoration = false;
            pTraits->doubleBuffer = true;
            pTraits->sharedContext = 0;
        }
        LOG << pTraits->x << pTraits->y << pTraits->width << pTraits->height;
        osg::ref_ptr<osg::GraphicsContext> pGraphicsContext = osg::GraphicsContext::createGraphicsContext(pTraits.get());
        if(!pGraphicsContext->valid())
        {
            LOG << "if(!pGraphicsContext->valid())";
            return pGroup.get();
        }
#endif

        double angle = 15.0f;

#if 1
        // 前
        osg::ref_ptr<osg::Camera> pSlaveFrontCamera = new osg::Camera;
        pSlaveFrontCamera->setGraphicsContext(_pViewer->getWindow());
        // 视口就是引擎三维的区域,但是注意区别于屏幕的坐标系(屏幕是左上为0,0,而三维引擎是左下为0,0)
        pSlaveFrontCamera->setViewport(0,
                                       0,
                                       rect().width() / 4,
                                       rect().height() / 4);
        pSlaveFrontCamera->setRenderOrder(osg::Camera::POST_RENDER);
        _pViewer->addSlave(pSlaveFrontCamera,
                           osg::Matrix(),
                           osg::Matrix::rotate(osg::DegreesToRadians(0.0), 0.0, 0.0, 0.0),
                           true);
#endif


#if 1
        // 后
        osg::ref_ptr<osg::Camera> pSlaveBehindCamera = new osg::Camera;
        pSlaveBehindCamera->setGraphicsContext(_pViewer->getWindow());
        // 视口就是引擎三维的区域,但是注意区别于屏幕的坐标系(屏幕是左上为0,0,而三维引擎是左下为0,0)
        pSlaveBehindCamera->setViewport(0,
                                        rect().width() / 4 * 3,
                                        rect().width() / 4,
                                        rect().height() / 4);
        pSlaveBehindCamera->setRenderOrder(osg::Camera::POST_RENDER);
        _pViewer->addSlave(pSlaveBehindCamera,
                           osg::Matrix::translate(0, 0, 0),
                           osg::Matrix::rotate(osg::DegreesToRadians(30), 1.0, 0.0, 0.0),
                           true);
#endif

#if 0
        // 左
//        osg::ref_ptr<osg::Camera> pSlaveLeftCamera = new osg::Camera;
//        pSlaveLeftCamera->setGraphicsContext(_pViewer->getWindow());
        osg::ref_ptr<HudRotateCamera> pSlaveLeftCamera = new HudRotateCamera;
        pSlaveLeftCamera->setGraphicsContext(_pViewer->getWindow());
        pSlaveLeftCamera->setMasterCamera(_pViewer->getCamera());
        pSlaveLeftCamera->setViewport(0,
                                      rect().height() / 8 * 3,
                                      rect().width()  / 4,
                                      rect().height() / 4);
        pSlaveLeftCamera->setRenderOrder(osg::Camera::POST_RENDER);

#if 0
        _pViewer->addSlave(pSlaveLeftCamera,
                           osg::Matrix(),
                           osg::Matrix::rotate(osg::DegreesToRadians(angle), 0.0, 0.0, 1.0),
                           true);
#endif
#if 0
        // 设置相机位置,观察目标点和方向
        osg::Vec3f vec3Eye = osg::Vec3f(100, 100, 0);
        osg::Vec3f vec3Center = osg::Vec3f(0, 0, 0);
        osg::Vec3f vec3Up = osg::Vec3f(0, 1, 0);
        pSlaveLeftCamera->setViewMatrixAsLookAt(vec3Eye, vec3Center, vec3Up);
        _pViewer->addSlave(pSlaveLeftCamera);
#endif
#if 1
        // 设置slave相机的位置和方向
        osg::ref_ptr<osg::MatrixTransform> transform = new osg::MatrixTransform();
        // 设置平移矩阵,根据需要进行调整
        osg::Matrix matrix;
        matrix.makeTranslate(0, 0, 0); // 这里的x, y, z是你想要平移到的位置
        transform->setMatrix(matrix);
        transform->addChild(pGroup);
        _pViewer->addSlave(pSlaveLeftCamera,
                           osg::Matrix(),
                           osg::Matrix::rotate(osg::DegreesToRadians(15.0f), 0.0, 1.0, 1.0),
                           true);
        pSlaveLeftCamera->setProjectionMatrixAsPerspective(
                    100.0f, 1.0, 1.0f, 100.0f);
#endif

#endif

#if 0
        // 右
        osg::ref_ptr<osg::Camera> pSlaveRightCamera = new osg::Camera;
        pSlaveRightCamera->setGraphicsContext(_pViewer->getWindow());
        pSlaveRightCamera->setViewport(rect().width()  / 4 * 3,
                                       rect().height() / 8 * 3,
                                       rect().width()  / 4,
                                       rect().height() / 4);
        pSlaveRightCamera->setRenderOrder(osg::Camera::POST_RENDER);
        _pViewer->addSlave(pSlaveRightCamera,
                           osg::Matrix(),
                           osg::Matrix::rotate(osg::DegreesToRadians(-angle), 0.0, 0.0, 1.0),
                           true);
#endif

#if 0
        // 上
        osg::ref_ptr<osg::Camera> pSlaveUpCamera = new osg::Camera;
        pSlaveUpCamera->setGraphicsContext(_pViewer->getWindow());
        pSlaveUpCamera->setViewport(rect().width()  / 8 * 3,
                                    0,
                                    rect().width()  / 4,
                                    rect().height() / 4);
        pSlaveUpCamera->setRenderOrder(osg::Camera::POST_RENDER);
        _pViewer->addSlave(pSlaveUpCamera,
                           osg::Matrix(),
                           osg::Matrix::rotate(osg::DegreesToRadians(angle), 1.0, 0.0, 0.0),
                           true);
#endif

#if 0
        // 下
        osg::ref_ptr<osg::Camera> pSlaveDownCamera = new osg::Camera;
        pSlaveDownCamera->setGraphicsContext(_pViewer->getWindow());
        pSlaveDownCamera->setViewport(rect().height() / 8 * 3,
                                      rect().height() / 8 * 6,
                                      rect().width() / 4,
                                      rect().height() / 4);
        pSlaveDownCamera->setRenderOrder(osg::Camera::POST_RENDER);
        _pViewer->addSlave(pSlaveDownCamera,
                           osg::Matrix(),
                           osg::Matrix::rotate(osg::DegreesToRadians(-angle), 1.0, 0.0, 0.0),
                           true);
#endif

    }
    return pGroup.get();
}

工程模板v1.36.0

  在这里插入图片描述


入坑

入坑一:设置相机就崩溃

问题

  在这里插入图片描述

解决过程

  定位到不设置相机就不崩溃,然后这里是笔者自己造的Qt与OSG结合的,使用了位置,这里也可以查看实际打印的创建的区域坐标和大小,确实也是不对:
  在这里插入图片描述

  那直接把场景里面的gc赋值给他测试,是可以的,修改的地方有点多,因为这个Qt+OSG是笔者根据源码原理进行调整渲染的,与直接编译出来的qt+osg还是有点区别,总之一句话,就是Qt渲染窗口里面已经有这个osg::ref_ptrosg::GraphicsContext了,不用去额外建立了:
  删除以下代码:
  在这里插入图片描述

  然后再调整相机代码,还有从Qt渲染窗口里面增加拿到这个内容上下文的函数就好了。

解决

  新增获取函数,原本不能获取
  在这里插入图片描述

  在这里插入图片描述

  这里实际大小为:
  在这里插入图片描述

  所以外面代码,直接用窗口的宽高好了(笔者是铺满的):这里是要缩小放前面,那就是改为4/1吧:
  在这里插入图片描述

  在这里插入图片描述

入坑二:左视图没有

问题

  左视图应该显示,但是没显示
  在这里插入图片描述

解决过程

  改成一样的:
  在这里插入图片描述

  然后不偏移试试:
  在这里插入图片描述

  偏移一个小角度试试:
  在这里插入图片描述

  所以是Y轴的中心不对,但是我们也没有改,测试绕x轴:
  在这里插入图片描述

  然后绕z轴,发现就z轴没有偏移:
  在这里插入图片描述

  在这里插入图片描述

  在这里插入图片描述

  尝试单独设置添加相机的视口是无效的:
  在这里插入图片描述

  在这里插入图片描述

  尝试单独修改同步旋转的相机去修改视口,也是无效:
  在这里插入图片描述

  继续尝试:
  在这里插入图片描述

  是否与内置相机的视口有关系,测试也无关:
  在这里插入图片描述

  在这里插入图片描述

解决(主技术方向未解决)

  从原始从相机技术方面暂时没有解决,因为也尝试了更改矩阵、修改相机视角观看位置都没什么变化。
  可以确认的是,应该是相机旋转的中心不对,并不是场景中心不对,所以鼠标拽托中间还是在旋转,而视角旋转则x和y轴存在偏移。X和y存在偏移就是左右和里外,若是与屏幕有关也是上下和左右,所以这里这么分析推断也不对。
  代码全部放出,读者有兴趣可以提供协助,一起探讨。

规避解决方法

  直接在相机中修改偏移旋转,然后当作结点加入,是可以解决,而且还不能是从相机,需要addChild进入:
  在这里插入图片描述

  这时候拉伸有问题:
  在这里插入图片描述

  变形了:
  在这里插入图片描述

  在这里插入图片描述

  终于外挂一个东西解决:
  在这里插入图片描述

  在这里插入图片描述

  但是鼠标中键按下偏移中心点,会都向右,理论上反向180°的y轴应该向左,但是还是向右,因为是场景偏移,我们规避是对场景下的相机进行旋转,所以实际是移动场景相机了,相机里面的正反对外无效。

官方从相机示例(也存在问题,怀疑是osg3.4.0源码bug)

  为了再次深入论证是否代码问题,笔者又用官方的demo实现:

#include <osg/Camera>
#include <osg/Group>
#include <osg/Geode>
#include <osg/ShapeDrawable>
#include <osgViewer/Viewer>
#include <osg/GraphicsContext>

int main(int argc, char *argv[])
{

    osg::ref_ptr<osg::Group> pGroup = new osg::Group;
    // 绘制盒体(立方体、长方体)
    {
        osg::ref_ptr<osg::Geode> pGeode = new osg::Geode;
        // 创建专门指明精细度的类osg::TessellationHints,并设置对应精细度
        osg::ref_ptr<osg::TessellationHints> pHints = new osg::TessellationHints;
        pHints->setDetailRatio(0.5);
        // 绘制几何类型(几何体)
        double width = 5.0f;
        // 函数1
        pGeode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0, 0, 0), width), pHints));
        // 设置关闭光照:OFF,同时旋转都能看到了(光照关闭,法向量不起作用)
        {
            osg::StateSet *pStateSet = pGeode->getOrCreateStateSet();
            pStateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON);
        }
        pGroup->addChild(pGeode);
    }

    osg::GraphicsContext::WindowingSystemInterface * wsi = osg::GraphicsContext::getWindowingSystemInterface();
    if(!wsi)
    {
        return 0;
    }

    osg::ref_ptr<osg::GraphicsContext::Traits > traits = new osg::GraphicsContext::Traits;
    traits->x = 0;
    traits->y = 0;
    traits->width = 800;
    traits->height = 600;
    traits->windowDecoration = false;
    traits->doubleBuffer = true;
    traits->sharedContext = 0;

    osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits);
    if(!gc.valid())
    {
        return 0;
    }


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

    osg::ref_ptr<osg::Camera> master = new osg::Camera;
    master->setGraphicsContext(gc);
    master->setViewport(0, 0, 800, 600);
    viewer->addSlave(master.get());

    osg::ref_ptr<osg::Camera> leftcam = new osg::Camera;
    leftcam->setGraphicsContext(gc);
    leftcam->setViewport(0, 0, 800 / 2, 600 / 2);
    leftcam->setRenderOrder(osg::Camera::POST_RENDER);
    viewer->addSlave(leftcam.get(),
                     osg::Matrix(),
                     osg::Matrix::rotate(osg::DegreesToRadians(15.0), 0.0, 1.0, 0.0),
                     true);

    viewer->setSceneData(pGroup);

    viewer->run();

    return 0;
}

  在这里插入图片描述

  改进后相机代码:

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

    osg::ref_ptr<osg::Camera> master = new osg::Camera;
    master->setGraphicsContext(gc);
    master->setViewport(0, 0, 800, 800);
    viewer->addSlave(master.get());

    {
        osg::ref_ptr<osg::Camera> leftcam = new osg::Camera;
        leftcam->setGraphicsContext(gc);
        leftcam->setViewport(0, 0, 100, 100);
        leftcam->setRenderOrder(osg::Camera::POST_RENDER);
        viewer->addSlave(leftcam.get(),
                         osg::Matrix(),
                         osg::Matrix::rotate(osg::DegreesToRadians(15.0), 1.0, 0.0, 0.0),
                         true);
    }

    {
        osg::ref_ptr<osg::Camera> leftcam = new osg::Camera;
        leftcam->setGraphicsContext(gc);
        leftcam->setViewport(100, 0, 100, 100);
        leftcam->setRenderOrder(osg::Camera::POST_RENDER);
        viewer->addSlave(leftcam.get(),
                         osg::Matrix(),
                         osg::Matrix::rotate(osg::DegreesToRadians(15.0), 0.0, 1.0, 0.0),
                         true);
    }

    {
        osg::ref_ptr<osg::Camera> leftcam = new osg::Camera;
        leftcam->setGraphicsContext(gc);
        leftcam->setViewport(200, 0, 100, 100);
        leftcam->setRenderOrder(osg::Camera::POST_RENDER);
        viewer->addSlave(leftcam.get(),
                         osg::Matrix(),
                         osg::Matrix::rotate(osg::DegreesToRadians(15.0), 0.0, 0.0, 1.0),
                         true);
    }

    {
        osg::ref_ptr<osg::Camera> leftcam = new osg::Camera;
        leftcam->setGraphicsContext(gc);
        leftcam->setViewport(300, 0, 100, 100);
        leftcam->setRenderOrder(osg::Camera::POST_RENDER);
        viewer->addSlave(leftcam.get(),
                         osg::Matrix(),
                         osg::Matrix::rotate(osg::DegreesToRadians(180.0), 0.0, 0.0, 1.0),
                         true);
    }

  所以是osg3.4.0的源码这块就有问题:
  在这里插入图片描述


上一篇:《OSG开发笔记(三十二):深入理解相机视口、制作支持与主视图同步变换旋转的相机HUD》
下一篇:《OSG开发笔记(三十四): OsgUtil::Simplifier:简化几何体,提升显示性能和渲染效率》


本文章博客地址:https://blog.csdn.net/qq21497936/article/details/143932273

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

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

相关文章

数据结构(Java版)第二期:包装类和泛型

目录 一、包装类 1.1. 基本类型和对应的包装类 1.2. 装箱和拆箱 1.3. 自动装箱和自动拆箱 二、泛型的概念 三、引出泛型 3.1. 语法规则 3.2. 泛型的优点 四、类型擦除 4.1. 擦除的机制 五、泛型的上界 5.1. 泛型的上界的定义 5.2. 语法规则 六、泛型方法 6.1…

ffmpeg 视频滤镜:高斯模糊-gblur

滤镜描述 gblur 官网地址 > FFmpeg Filters Documentation 这个滤镜会将视频变得模糊。 滤镜使用 参数 gblur AVOptions:sigma <float> ..FV.....T. set sigma (from 0 to 1024) (default 0.5)steps <int> ..FV.....T…

vue中路由缓存

vue中路由缓存 问题描述及截图解决思路关键代码及打印信息截图 问题描述及截图 在使用某一平台时发现当列表页码切换后点击某一卡片进入详情页后&#xff0c;再返回列表页时页面刷新了。这样用户每次看完详情回到列表页都得再重新输入自己的查询条件&#xff0c;或者切换分页到…

eclipse-git项目提示NO-HEAD

1、出现该问题的过程 本人在用eclipse拉取git代码&#xff0c;刚拉取完&#xff0c;可能还没来得及跟本地的分支合并&#xff0c;电脑就卡动了。无奈只能重启电脑&#xff0c;打开eclipse&#xff0c;maven项目后面就出现了xxx NO-HEAD的提示。 2、问题解决 根据错误提示&am…

网络安全与加密

1.Base64简单说明描述&#xff1a;Base64可以成为密码学的基石&#xff0c;非常重要。特点&#xff1a;可以将任意的二进制数据进行Base64编码结果&#xff1a;所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符&#xff1a;A~Z a~z 0~9 / 对文件进行base64编码…

goframe开发一个企业网站 在vue-next-admin 显示验证码 19

index.go 文件中的代码&#xff0c;我将为该文件中的主要功能和方法添加注释&#xff0c;并生成一篇 Markdown 格式的文章。这将包括对每个函数的用途、输入参数和返回值的简要说明。 index.go 包和导入 package adminimport ("context""errors""gf…

数据库的联合查询

数据库的联合查询 简介为什么要使⽤联合查询多表联合查询时MYSQL内部是如何进⾏计算的构造练习案例数据案例&#xff1a;⼀个完整的联合查询的过程 内连接语法⽰例 外连接语法 ⽰例⾃连接应⽤场景示例表连接练习 ⼦查询语法单⾏⼦查询多⾏⼦查询多列⼦查询在from⼦句中使⽤⼦查…

Oracle 23ai 对应windows版本安装配置PLSQL导入pde文件navicat连接Oracle

因为有一个pde文件需要查看里面的数据&#xff0c;所以这次需要配置本地oracle数据库&#xff0c;并且导入数据&#xff0c;因为还有navicat&#xff0c;所以就想用navicat去连接查看。 1、找到官网。 Get Started with Oracle Database 23ai | Oracle 2、下载windows版本。…

Juc01_多线程概述、四种实现方式、常用方法API、生命周期、买票案例、synchronized锁

目录 本章讲述内容&#xff1a;多线程概述、四种实现方式、常用方法API、生命周期、买票案例、synchronized锁 ①. 多线程的概述 ②. 多线程的实现方式 ①. 继承Thread ②. 实现Runnable接口 ③. Callable接口(创建线程) ④. 线程池 ③. 设置和获取线程名称 ④. 线程…

一个高度可扩展的 Golang ORM 库【GORM】

GORM 是一个功能强大的 Golang 对象关系映射&#xff08;ORM&#xff09;库&#xff0c;它提供了简洁的接口和全面的功能&#xff0c;帮助开发者更方便地操作数据库。 1. 完整的 ORM 功能 • 支持常见的关系模型&#xff1a; • Has One&#xff08;一对一&#xff09; • …

ubuntu24挂载硬盘记录

1、显示硬盘及所属分区情况。在终端窗口中输入如下命令&#xff1a; sudo fdisk -l 找到自己硬盘的分区 我的地址/dev/sda 2、显示硬盘及所属分区情况。在终端窗口中输入如下命令&#xff0c;格式化自己硬盘&#xff1a; sudo mkfs -t ext4 /dev/sda 3、在终端窗口中输入如下…

Flink四大基石之Window

为什么要用WIndow 在流处理应用中&#xff0c;数据是连续不断的&#xff0c;有时我们需要做一些聚合类的处理&#xff0c;例如&#xff1a;在过去的1分钟内有多少用户点击了我们的网页。 在这种情况下&#xff0c;我们必须定义一个窗口(window)&#xff0c;用来收集最近1分钟内…

使用ENSP实现默认路由

一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为2.2.2.1/24 ip address 2.2.2.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为1.…

《基于FPGA的便携式PWM方波信号发生器》论文分析(三)——数码管稳定显示与系统调试

一、论文概述 基于FPGA的便携式PWM方波信号发生器是一篇由任青颖、庹忠曜、黄洵桢、李智禺和张贤宇 等人发表的一篇期刊论文。该论文主要研究了一种新型的信号发生器&#xff0c;旨在解决传统PWM信号发生器在移动设备信号调控中存在的精准度低和便携性差的问题 。其基于现场可编…

vue 预览pdf 【@sunsetglow/vue-pdf-viewer】开箱即用,无需开发

sunsetglow/vue-pdf-viewer 开箱即用的pdf插件sunsetglow/vue-pdf-viewer, vue3 版本 无需多余开发&#xff0c;操作简单&#xff0c;支持大文件 pdf 滚动加载&#xff0c;缩放&#xff0c;左侧导航&#xff0c;下载&#xff0c;页码&#xff0c;打印&#xff0c;文本复制&…

1-golang_org_x_crypto_bcrypt测试 --go开源库测试

1.实例测试 package mainimport ("fmt""golang.org/x/crypto/bcrypt" )func main() {password : []byte("mysecretpassword")hashedPassword, err : bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)if err ! nil {fmt.Println(err)…

嵌入式的C/C++:深入理解 static、const 与 volatile 的用法与特点

目录 一、static 1、static 修饰局部变量 2、 static 修饰全局变量 3、static 修饰函数 4、static 修饰类成员 5、小结 二、const 1、const 修饰普通变量 2、const 修饰指针 3、const 修饰函数参数 4. const 修饰函数返回值 5. const 修饰类成员 6. const 与 #defi…

超高流量多级缓存架构设计!

文章内容已经收录在《面试进阶之路》&#xff0c;从原理出发&#xff0c;直击面试难点&#xff0c;实现更高维度的降维打击&#xff01; 文章目录 电商-多级缓存架构设计多级缓存架构介绍多级缓存请求流程负载均衡算法的选择轮询负载均衡一致性哈希负载均衡算法选择 应用层 Ngi…

【C++ 算法进阶】算法提升二十三

目录 左右数组相减绝对值最大值 &#xff08;题意代换&#xff09;题目题目分析 可整合数组 &#xff08;题意代换&#xff09;题目题目分析代码 水王问题题目题目分析代码水王问题变形思路讲解 合并石头的最低成本 &#xff08;动态规划&#xff09;题目题目分析代码 左右数组…

solr 远程命令执行 (CVE-2019-17558)

漏洞描述 Apache Velocity是一个基于Java的模板引擎&#xff0c;它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目&#xff0c;旨在确保Web应用程序在表示层和业务逻辑层之间的隔离&#xff08;即MVC设计模式&#xff09;。 Apa…