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…...
模糊逻辑学习 | 模糊推理 | 模糊逻辑控制
注:本文为几位功夫博主关于 “模糊逻辑学习 / 推理 / 控制” 的相关几篇文章合辑。 初学模糊逻辑控制(Fuzzy Logic Control) ziqian__ 已于 2022-08-19 20:30:25 修改 一、前言 模糊逻辑控制(Fuzzy Logic Control)是…...
【JavaEE】Servlet:表白墙
文章目录 一、前端二、前置知识三、代码1、后端2、前端3、总结 四、存入数据库1、引入 mysql 的依赖,mysql 驱动包2、创建数据库数据表3、调整上述后端代码3.1 封装数据库操作,和数据库建立连接3.2 调整后端代码 一、前端 <!DOCTYPE html> <ht…...
C++特殊类设计(不能被拷贝的类、只能在堆上创建对象的类、不能被继承的类、单例模式)
C特殊类设计 在实际应用中,可能需要设计一些特殊的类对象,如不能被拷贝的类、只能在堆上创建对象的类、只能在栈上创建对象的类、不能被继承的类、只能创建一个对象的类(单例模式)。 1. 不能被拷贝的类 拷贝只会发生在两个场景…...
【小白学机器学习34】用python进行基础的数据统计 mean,var,std,median,mode ,四分位数等
目录 1 用 numpy 快速求数组的各种统计量:mean, var, std 1.1 数据准备 1.2 直接用np的公式求解 1.3 注意问题 1.4 用print() 输出内容,显示效果 2 为了验证公式的后背,下面是详细的展开公式的求法 2.1 均值mean的详细 2.2 方差var的…...
安装 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…...
Ajax学习笔记,第一节:语法基础
Ajax学习笔记,第一节:语法基础 一、概念 1、什么是Ajax 使用浏览器的 XMLHttpRequest 对象 与服务器通信2、什么是axios Axios是一个基于Promise的JavaScript库,支持在浏览器和Node.js环境中使用。相较于Ajax,Axios提供了更多…...
《用Python画蔡徐坤:艺术与编程的结合》
简介 大家好!今天带来一篇有趣的Python编程项目,用代码画出知名偶像蔡徐坤的形象。这个项目使用了Python的turtle库,通过简单的几何图形和精心设计的代码来展示艺术与编程的结合。 以下是完整的代码和效果介绍,快来试试看吧&…...
Unity中动态生成贴图并保存成png图片实现
实现原理: 要生成长x宽y的贴图,就是生成x*y个像素填充到贴图中,如下图: 如果要改变局部颜色,就是从x1到x2(x1<x2),y1到y2(y1<y2)这个范围做处理, 或者要想做圆形就是计算距某个点(x1,y1&…...
Mac配置maven环境及在IDEA中配置Maven
Mac配置maven环境及在IDEA中配置Maven 1. 介绍 Maven是一款广泛用于Java等JVM语言项目的工具,它以项目对象模型(POM)为基础进行项目管理,通过POM文件来定义项目信息和依赖关系。同时,它也是构建自动化工具࿰…...
Reactor 模式的理论与实践
1. 引言 1.1 什么是 Reactor 模式? Reactor 模式是一种用于处理高性能 I/O 的设计模式,专注于通过非阻塞 I/O 和事件驱动机制实现高并发性能。它的核心思想是将 I/O 操作的事件分离出来,通过事件分发器(Reactor)将事…...
vim 一次注释多行 的几种方法
在 Vim 中一次注释多行是一个常见操作。可以使用以下方法根据你的具体需求选择合适的方式: 方法 1:手动插入注释符 进入正常模式: 按 Esc 确保进入正常模式。 选择需要注释的多行: 移动到第一行,按下 Ctrlv 进入可视块…...
问题记录-Java后端
问题记录 目录 问题记录1.多数据源使用事务注意事项?2.mybatis执行MySQL的存储过程?3.springBoot加载不到nacos配置中心的配置问题4.服务器产生大量close_wait情况 1.多数据源使用事务注意事项? 问题:在springBoot项目中多表处理数…...
李春葆《数据结构》-课后习题代码题
一:假设不带权有向图采用邻接矩阵 g 存储,设计实现以下功能的算法: (1)求出图中每个顶点的入度。 代码: void indegree(MatGraph g){int i,j,n;printf("各个顶点的入度:\n");for(i…...
51c~C语言~合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/12652943 一、嵌入式开发中的C语言编译器 如果你和一个优秀的程序员共事,你会发现他对他使用的工具非常熟悉,就像一个画家了解他的画具一样。----比尔.盖茨1 不能简单的认为是个工具 嵌入式程序开发…...
【Python】构建事件驱动架构:用Python实现实时应用的高效系统
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 事件驱动架构(Event-Driven Architecture,EDA)是一种基于事件流动进行系统设计的模式,广泛应用于游戏开发、实时监控和分布式系统中。它通过解耦事件的生产者和消费者,提升系统的可扩展性和灵活性。本文章从…...
Git(一)基本使用
目录 一、使用git -v 查看安装git版本 二、使用mkdir 创建一个文件,并使用 git init 在该目录下创建一个本地仓库, 三、通过git clone命令接入线上仓库 四、使用git status查看仓库状态信息 五、利用echo写入一个文件 并使用cat进行查看 【Linux】e…...
HarmonyOS应用开发者基础认证,Next版本发布后最新题库(10月8日更新题库未收录)
笔者会尽量找到答案的出处,力求答案准确无误。有些题目答案可能有错,也有一些笔者实在找不到出处,也不知道答案的,如果读者发现错误或有补充建议,欢迎评论或私信笔者。您的每一条反馈都是宝贵的,能够帮助笔…...
【PGCCC】Postgresql BRIN 索引原理
前言 postgresql 提供了块级索引(简称 BRIN),主要适用于类似时序数据之类的,有着天然的顺序,而且都是添加写的场景。相比于 btree 索引,它的体积小得多,非常适用于大数据量的场景。 原理 pos…...
腾讯云 AI 代码助手:产品研发过程的思考和方法论
一、文章摘要 本文将详细阐述 腾讯云 AI 代码助手的历史发展形态与产品整体架构,并从技术、研发方法论的角度分别阐述了产品的研发过程。 全文阅读约 5~8 分钟。 二、产品布局 AI 代码助手产品经历了三个时代的发展 第一代诸如 Eclipse、Jetbrains、V…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
PLC入门【4】基本指令2(SET RST)
04 基本指令2 PLC编程第四课基本指令(2) 1、运用上接课所学的基本指令完成个简单的实例编程。 2、学习SET--置位指令 3、RST--复位指令 打开软件(FX-TRN-BEG-C),从 文件 - 主画面,“B: 让我们学习基本的”- “B-3.控制优先程序”。 点击“梯形图编辑”…...
