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;// 函数1pGeode->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);}
#endifpGroup->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();}
#endifdouble 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;// 函数1pGeode->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
相关文章:
OSG开发笔记(三十三):同时观察物体不同角度的多视图从相机技术
若该文为原创文章,未经允许不得转载 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/143932273 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 长沙红胖子Qt…...
[极客大挑战 2019]BabySQL--详细解析
信息搜集 进入界面: 输入用户名为admin,密码随便输一个: 发现是GET传参,有username和password两个传参点。 我们测试一下password点位能不能注入: 单引号闭合报错,根据报错信息,我们可以判断…...
Java的字符串操作(二)(代码示例)
1. 字符串的定义 // 直接赋值方式定义字符串 String str1 "Hello World";// 使用new关键字定义字符串 String str2 new String("Hello World");// 可以通过打印对象的哈希码来查看是否是同一个对象(在一定程度上反映引用情况) Sy…...
2024-2025 ICPC, NERC, Southern and Volga Russian Regional Contest(ABCGJLN)
文章目录 N. Fixing the Expression思路code J. Waiting for...思路code C. DIY思路code L. Bridge Renovation思路code A. Bonus Project思路code G. Guess One Character思路code B. Make It Equal思路code N. Fixing the Expression 思路 签到题,只改变中间的字…...
SpringBoot(9)-Dubbo+Zookeeper
目录 一、了解分布式系统 二、RPC 三、Dubbo 四、SpringBootDubboZookeeper 4.1 框架搭建 4.2 实现RPC 一、了解分布式系统 分布式系统:由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统 二、RPC RPC:远程…...
现代密码学
概论 计算机安全的最核心三个关键目标(指标)/为:保密性 Confidentiality、完整性 Integrity、可用性 Availability ,三者称为 CIA三元组 数据保密性:确保隐私或是秘密信息不向非授权者泄漏,也不被非授权者使…...
websocket是什么?
一、定义 Websocket是一种在单个TCP连接上进行全双工通信的协议,它允许服务器主动向客户端推送数据,而不需要客户端不断的轮询服务器来获取数据 与http协议不同,http是一种无状态的,请求,响应模式的协议(单向通信)&a…...
idea怎么打开两个窗口,运行两个项目
今天在开发项目的时候,前端希望运行一下以前的项目,于是就需要开两个 idea 窗口,运行两个项目 这里记录一下如何设置:首先依次点击: File -> Settings -> Appearance & Behavior ->System Settings 看到如…...
aws服务--机密数据存储KMS(1)介绍和使用
在AWS(Amazon Web Services)中存储机密数据时,安全性和合规性是最重要的考虑因素。AWS 提供了多个服务和工具,帮助用户确保数据的安全性、机密性以及合规性。AWS Secrets Manager、KMS(Key Management Service)是推荐的存储机密数据的AWS服务和最佳实践。这里先看KMS。 …...
怎么编译OpenWrt镜像?-基于Widora开发板
1.准备相应的环境,我使用的环境是VMware16ubuntu20.04,如图1所示安装编译所需的依赖包; sudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-…...
Android opencv使用Core.hconcat 进行图像拼接
Android 集成OpenCV-CSDN博客 import org.opencv.android.Utils; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.imgcodecs.Imgcodecs; import android.graphics.Bitmap; import android.graphics.BitmapFactor…...
小杨的N字矩阵c++
题目描述 小杨想要构造一个m*m 的 N 字矩阵( m为奇数),这个矩阵的从左上角到右下角的对角线、第1 列和第m 列都 是半角加号 ,其余都是半角减号 - 。例如,一个 5*5 的 N 字矩阵如下: --- -- -- -- --- 请…...
C 语言面向对象
面向对象的基本特性:封装,继承,多态 1.0 面向过程概念 当我们在编写程序时,通常采用以下步骤: 1. 将问题的解法分解成若干步骤 2. 使用函数分别实现这些步骤 3. 依次调用这些函数 这种编程风格的被称作 面向过程…...
初试无监督学习 - K均值聚类算法
文章目录 1. K均值聚类算法概述2. k均值聚类算法演示2.1 准备工作2.2 生成聚类用的样本数据集2.3 初始化KMeans模型对象,并指定类别数量2.4 用样本数据训练模型2.5 用训练好的模型生成预测结果2.6 输出预测结果2.7 可视化预测结果 3. 实战小结 1. K均值聚类算法概述…...
部署实战(二)--修改jar中的文件并重新打包成jar文件
一.jar文件 JAR 文件就是 Java Archive ( Java 档案文件),它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…...
C++中的原子操作:原子性、内存顺序、性能优化与原子变量赋值
一、原子操作与原子性 原子操作(atomic operation)是并发编程中的一个核心概念,指的是在多线程环境中,一个操作一旦开始,就不会被其他线程的操作打断,直至该操作完成。这种不可分割的特性保证了操作的原子…...
【JavaEE初阶】多线程初阶下部
文章目录 前言一、volatile关键字volatile 能保证内存可见性 二、wait 和 notify2.1 wait()方法2.2 notify()方法2.3 notifyAll()方法2.4 wait 和 sleep 的对比(面试题) 三、多线程案例单例模式 四、总结-保证线程安全的思路五、对比线程和进程总结 前言…...
数据结构(Java版)第二期:包装类和泛型
目录 一、包装类 1.1. 基本类型和对应的包装类 1.2. 装箱和拆箱 1.3. 自动装箱和自动拆箱 二、泛型的概念 三、引出泛型 3.1. 语法规则 3.2. 泛型的优点 四、类型擦除 4.1. 擦除的机制 五、泛型的上界 5.1. 泛型的上界的定义 5.2. 语法规则 六、泛型方法 6.1…...
[原创](Modern C++)现在C++的关键性概念: 通俗易懂的解释“多态“与“虚函数“的内在关系
常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共23年] 职业生涯: 21年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse、C Bui…...
python操作Elasticsearch
使用elasticsearch 6.x版本,操作es数据。 #! -*- coding:utf-8 -* import timefrom elasticsearch import Elasticsearch, helpersclass EstUtil:_instance Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance super(EstUtil, cls).__ne…...
【数据分享】2024年我国省市县三级的住宿服务设施数量(8类住宿设施/Excel/Shp格式)
宾馆酒店、旅馆招待所等住宿服务设施的配置情况是一个城市公共基础设施完善程度的重要体现,一个城市住宿服务设施种类越丰富,数量越多,通常能表示这个城市的公共服务水平越高! 本次我们为大家带来的是我国各省份、各地级市、各区…...
从尾到头打印链表 剑指offer
题目描述 输入一个链表的头节点,从尾到头反过来打印出每个节点的值。 链表节点定义如下: struct ListNode {int m_nKey;ListNode*m_pNext; }; 代码实现 栈实现: 递归实现: 但是用递归实现可能存在的问题:...
【测试工具JMeter篇】JMeter性能测试入门级教程(二)出炉,测试君请各位收藏了!!!
上篇文章:CSDN 我们介绍了JMeter的一些原理介绍,以及安装配置和启动流程,本文我们就来讲讲JMeter如何使用。 一、JMeter目录结构组成 1. 根目录 Jmeter安装包解压后的根目录如下图: 1.1 backups目录:脚本备份目录&am…...
【JavaEE】Servlet:表白墙
文章目录 一、前端二、前置知识三、代码1、后端2、前端3、总结 四、存入数据库1、引入 mysql 的依赖,mysql 驱动包2、创建数据库数据表3、调整上述后端代码3.1 封装数据库操作,和数据库建立连接3.2 调整后端代码 一、前端 <!DOCTYPE html> <ht…...
WPF中如何让Textbox显示为一条直线
由于Textbox直接使用是一条直线 设置如下代码 可以让Textbox变为直线输入 <Style TargetType"TextBox"x:Key"UsernameTextBoxStyle"><Setter Property"Template"><Setter.Value><ControlTemplate TargetType"{x:Typ…...
多维数组与特殊矩阵:存储与压缩
多维数组与特殊矩阵:存储与压缩 一、多维数组的存储 (一)基本概念 多维数组是线性表的推广,例如二维数组可以看作是元素为一维数组的线性表,三维数组可以看作是元素为二维数组的线性表,以此类推。在内存…...
第三讲 架构详解:“隐语”可信隐私计算开源框架
目录 隐语架构 隐语架构拆解 产品层 算法层 计算层 资源层 互联互通 跨域管控 本文主要是记录参加隐语开源社区推出的第四期隐私计算实训营学习到的相关内容。 隐语架构 隐语架构拆解 产品层 产品定位: 通过可视化产品,降低终端用户的体验和演…...
springboot项目使用maven打包,第三方jar问题
springboot项目使用maven package打包为可执行jar后,第三方jar会被打包进去吗? 答案是肯定的。做了实验如下: 第三方jar的项目结构及jar包结构如下:(该第三方jar采用的是maven工程,打包为普通jar…...
突破内存限制:Mac Mini M2 服务器化实践指南
本篇文章,我们聊聊如何使用 Mac Mini M2 来实现比上篇文章性价比更高的内存服务器使用,分享背后的一些小的思考。 希望对有类似需求的你有帮助。 写在前面 在上文《ThinkPad Redis:构建亿级数据毫秒级查询的平民方案》中,我们…...
【Linux】Linux系统电源状态
前言 本文主要介绍Linux系统电源状态。 Linux内核代码声明如下,位于kernel/power/suspend.c。 参考链接 Linux系统电源状态 在Linux操作系统中,将电源划分为如下几个状态: ACPI StateLinux StateDescriptionS0On(on)WorkingS1Standby(sta…...
《用Python画蔡徐坤:艺术与编程的结合》
简介 大家好!今天带来一篇有趣的Python编程项目,用代码画出知名偶像蔡徐坤的形象。这个项目使用了Python的turtle库,通过简单的几何图形和精心设计的代码来展示艺术与编程的结合。 以下是完整的代码和效果介绍,快来试试看吧&…...
ARM(安谋) China处理器
0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China,2018年4月established,独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1(星辰处理器) STAT-MC1,主要为满足AIOT应用性能、功…...
硬中断关闭后的堆栈抓取方法
一、背景 性能和稳定性是一个计算机工程里的一个永恒的主题。其中尤其稳定性这块的问题发现和问题分析及问题解决就依赖合适的对系统的观测的手段,帮助我们发现问题,识别问题原因最后才能解决问题。稳定性问题里尤其底层问题里,除了panic问题…...
电影风格城市夜景旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色教程 电影风格城市夜景旅拍通过 Lightroom 调色,将城市夜晚的景色打造出如同电影画面般的质感和氛围。以独特的色彩和光影处理,展现出城市夜景的魅力与神秘。 预设信息 调色风格:电影风格预设适合类型:人像,街拍…...
基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功
基于FPGA的2FSK调制 前言一、2FSK储备知识二、代码分析1.模块分析2.波形分析 总结 前言 设计实现连续相位 2FSK 调制器,2FSK 的两个频率为:fI15KHz,f23KHz,波特率为 1500 bps,比特0映射为f 载波,比特1映射为 载波。 1)…...
【Python】构建事件驱动架构:用Python实现实时应用的高效系统
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 事件驱动架构(Event-Driven Architecture,EDA)是一种基于事件流动进行系统设计的模式,广泛应用于游戏开发、实时监控和分布式系统中。它通过解耦事件的生产者和消费者,提升系统的可扩展性和灵活性。本文章从…...
安装 Docker(使用国内源)
一、安装Docker-ce 1、下载阿里云的repo源 [rootlocalhost ~]# yum install yum-utils -y && yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && yum makecache # 尝试列出 docker-ce 的版本 [rootlocalh…...
001 MATLAB介绍
前言: 软件获取渠道有很多,难点也就是百度网盘下载慢; 线上版本每月有时间限制。 01 MATLAB介绍 性质: MATLAB即Matrix Laboratory 矩阵实验室的意思,是功能强大的计算机高级语言, 已广泛应用于各学科研究部门、…...
vscode利用ofExtensions插件可以调试单进程Openfoam,但是不能调试mpi多进程案例
问题: 准备调试流固耦合案例,包括流体和固体的,但是用ofextensions插件。但是流体的话使用的是域分解方法,将大的单元分成了小的单元用mpi并行处理,里面的program必须输入"/usr/bin/mpirun", // 这里改为使…...
2022年计算机网络408考研真题解析
第一题: 解析:网络体系结构-数据链路层 在ISO网络参考模型中,运输层,网络层和数据链路层都实现了流量的控制功能,其中运输层实现的是端到端的流量控制,网络层实现的是整个网络的流量控制,数据链…...
React-useEffect的使用
useEffect react提供的一个常用hook,用于在函数组件中执行副作用操作,比如数据获取、订阅或手动更改DOM。 基本用法: 接受2个参数: 一个包含命令式代码的函数(副作用函数)。一个依赖项数组,用…...
python学习笔记(10)算法(3)列表
一、列表 列表(list)是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历 等操作,无须使用者考虑容量限制的问题。列表可以基于链表或数组实现。 ‧ 链表天然可以看作一个列表&#…...
嵌入式系统与单片机工作原理详解
随着现代科技的发展,嵌入式系统已经深入到我们日常生活中的方方面面。无论是智能家居、汽车电子,还是工业控制、医疗设备,都离不开嵌入式系统的支持。而单片机作为嵌入式系统的核心组件,是实现这些功能的关键之一。本文将详细介绍…...
Spark SQL 之 QueryStage
ExchangeQueryStageExec ExchangeQueryStageExec 分为两种...
Flink Standalone 集群模式安装部署教程
目录 一、前言 二、环境准备 三、安装步骤 1. 下载并安装 Flink 4. 配置 Flink 5. 配置环境变量 6. 启动 Flink 集群 7. 访问 Flink Web 界面 四、简单测试 五、常见问题和解决办法 1. 启动失败,无法连接到 TaskManager 2. Web 界面无法访问 六、总结 …...
【运维】 使用 shell 脚本实现类似 jumpserver 效果实现远程登录linux 服务器
实现效果 通过序号选择登录: 配置证书登录 配置证书登录可以免去每次都输入密码的麻烦。详见另一篇博文: 【ssh】使用秘钥对(公钥/私钥)登录linux主机以及原理介绍 自动登录脚本 直接复用以下脚本即可,在 server…...
根据实验试要求,打通隧道连接服务器上的数据库,前端进行数据调用。
1.背景介绍 数据库布置在了工大实验试K80服务器上,本地属于外网无法直接访问校园内网。需要打通隧道,通过堡垒机进行服务器的访问。获取到数据库数据进行前端展示。 2.打通隧道 访问指令: 我选择使用Xshell打通隧道。优点:凭证…...
ubuntu 安装 docker 记录
本文假设系统为 Ubuntu,从 16.04 到 24.04,且通过 APT 命令安装。理论上也其他 Debian 系的操作系统。 WSL 也一样。 感觉 Docker 官方在强推 Docker Desktop,搜索 Docker 安装文档,一不小心就被导航到了 Docker Desktop 的安装页…...
46.坑王驾到第十期:vscode 无法使用 tsc 命令
点赞收藏加关注,你也能住大别墅! 一、问题重现 上一篇帖子记录了我昨天在mac上安装typescript及调试的过程。今天打开vscode准备开干的时候,发现tsc命令又无法使用了,然后按照昨天的方法重新安装调试后又能用了,但是关…...
pytorch3d linux安装
目录 测试成功2024.11.21: 测试成功2024.11.21: python3.10 GitHub - facebookresearch/pytorch3d: PyTorch3D is FAIRs library of reusable components for deep learning with 3D data 安装脚本: cd pytorch3d && pip install…...