OSG开发笔记(二十九):OSG加载模型文件、加载3DMax三维型文件Demo

news2024/11/19 13:16:15


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

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

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

上一篇:《OSG开发笔记(二十八):OSG模型固定路径动画》
下一篇: 持续补充中…



前言

  Osg深入之后需要打开模型文件,这些模型文件是已有的模型文件,加载入osg之后可以在常见中展示模型文件,该节点可以操作,多个逼真的模型的节点就实现了基本的场景构建。


Demo

  请添加图片描述


说明

  三维模型文件一般是由专业的三维建模人员完成,可以去buy通用模型,但是定制模型的费用就相对不便宜了,几十几百几千几万的都有,三维项目一定要了解清楚前期建模,也有很多是由甲方自行提供,因为只有甲方才能知道模型效果是什么样。


Osg读取文件库:OsgDB库

  osg、osgEarth所有文件都是通过osgDB库来读取,通过Registry来查找文件拓展名对应的osg库,根据一定规则拼接成完成的osg库名并加载,通过ReaderWriter对象来完成节点的读取(ReaderWriter是读写节点的基类,可通过派生此类重写读写方法实现自己的读写格式)。
  在这里插入图片描述

  然后,查看我们的osg库名称:
  在这里插入图片描述

  发现支持的格式还真不少,然后我们进行大致归类:

三维格式

.3dc

  3DC文件是三维建模软件3DCrafter建的三维场景,用于存储和加载3D模型和场景。3DC文件包括场景的几何形状、形状、材质和灯光效果,用于创建3 图像和动画。

.3ds

  3DS(3D Studio)文件是一种用于 3D 图形模型的文件格式,它是 Autodesk 3ds Max 软件的主要文件格式之一。是一种常见的 3D 模型文件格式,用于存储和传输 3D 对象、材质、动画和变形等数据。可以被许多 3D 图形软件读取和编辑。它广泛应用于游戏开发、动画制作、虚拟现实等领域。

.bvh

  BVH文件包含角色的骨骼和肢体关节旋转数据。BVH 是一种通用的人体特征动画文件格式,,广泛地被当今流行的各种动画制作软件支持。通常可从记录人类行为运动的运动捕获硬件获得。

.Ive

  OpenSceneGraph 二进制三维文件。

.lwo

  由LightWave 3D创建的三维对象文件,该程序用于三维建模、动画和渲染;包含描述对象形状和外观的点、多边形和曲面;还可以包含对用于对象纹理的图像文件的引用。

.lws

  LightWave 3D Scene File 文件是最常用的文件类型,带有 LWS 文件扩展名,最初由 NewTek开发LightWave 3D。

.osc

  当前这种OSC格式是一种GIS地理信息文件,是由OpenStreetMap研发,作为一种 OpenStreetMap更改文件使用,此文件流行程度是 50 分(0-100满分)。

.osg(osgb)

  OSG场景数据格式,可以记录场景书结构的所有节点及其属性信息。它属于文本文件类型,不需要专门的编辑器。osgb是osg的二进制格式,osgb是倾斜摄影的格式,osg可以直接读取osgb文件。

.osga

  osgArchive 数据归档器 为众多 OSG 文件以及 IVE 文件打包提供了一个工具 它所生成的 OSGA 文件是整个文件,可以为海量数据的存放提供良好的支持

.md2

  MD2是Quake2中使用的模型文件格式,由于其比较简单,容易实现,所以应用很广,是一种经典的动画模型格式。该文件格式由2部分组成:一部分是文件头,包含了文件ID号、版本号和有关模型的各种数据的起始地址等;另一部分是文件的主体,包含了有关模型的各种数据,如顶点数据、纹理数据、法向量数据等。

.obj

  obj可以指一种3D模型格式的文件,也可以指一种程序编译中间代码文件。obj3D模型文件是一种文本文件,可以直接用写字板打开进行查看和编辑修改,里面不包含动画、材质特性、贴图路径、动力学、粒子等信息,但是可包含纹理信息,而对纹理进行轻量化压缩可以减小文件大小和提高加载性能。。obj目标文件一般是程序编译后的二进制文件,再通过链接器和资源文件链接就成可执行文件了。

.openflight(FLT)

  FLY (OpenFlight) 格式(通常使用 .flt 文件扩展名)是一种用于表示三维场景和模型的文件格式。OpenFlight 最初由Multigen-Paradigm公司开发,用于航空模拟和虚拟环境的创建。后来,这个格式被移交给了Presagis公司继续开发和维护。

.shp

  shp是“空间数据开放”格式的文件。shp全称“ESRI Shapefile”,是美国环境系统研究所公司开发的一种空间数据开放格式,是一种矢量图形格式,该格式文件主要用于描述几何体对象(点,折线与多边形),能够保存几何图形的位置及相关属性。

.stl

  3d打印一般用stl格式的3d文件,3d打印机识别STL格式的文件

dxf

  DXF(Drawing Exchange Format)是一种用于图形交换的文件格式,由AutoDesk公司开发。DXF文件可以包含2D或3D图形数据,可以被多个CAD程序所支持。

图像格式

.bmp

  BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。

.dds

  DDS是一种图片格式,是DirectDraw Surface的缩写,它是DirectX纹理压缩(DirectX Texture Compression,简称DXTC)的产物。由NVIDIA公司开发。大部分3D游戏引擎都可以使用DDS格式的图片用作贴图,也可以制作法线贴图。通过安装DDS插件后可以在

.jpeg

  JPEG格式是最常用的图像文件格式,后缀名为.jpg或.jpeg。

.tga

  tga是由美国Truevision公司为其显示卡开发的一种图像文件格式,

.pic

  pic是一种图像文件格式,以图像文件格式是记录和存储影像信息的格式。对数字图像进行存储、处理、传播,必须采用一定的图像格式,也就是把图像的像素按照一定的方式进行组织和存储,把图像数据存储成文件就得到图像文件。

.rgb

  .rgb文件是SGI图像文件格式的24位RGB彩色位图图像文件。

.png

  PNG,全称Portable Network Graphics,是一种无损压缩的图像文件格式,广泛应用于互联网上的图像文件。

.pnm

  PNM(Portable Any Map)格式是一系列用于便携式图像的图像文件格式,这些图像是像素值的映射,可以表示灰度或彩色数据。

其他

.dot

  DOT文件扩展名信息一种Microsoft Word文档模板。

.dw

  DW格式文件是Dreamweaver的特有文件,它通常包括HTML代码和网页相关的资源(如图像、Flash、JavaScript、CSS等)。

.ktx

  KTX(Khronos Texture)是一个轻量级的纹理容器,用于OpenGL®、Vulkan®和其他GPU API。KTX文件包含纹理加载所需的所有参数。

.lua

  lua是一个简洁、轻量、可扩展的脚本语言,该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

.mdl

  MDL文件是一个文件包,里面包含模型,贴图,所有动作,以及脚本。

.osgjs

  osgjs是osjjs框架支持的格式,其实是json格式的文本类型。 要把自己建的模型转换成这个格式,首先要将3ds格式转换为osg格式,然后再osg中转成json格式。

.p3d

  panda3D打包系统中的完整文件;用于打包应用程序以供分发;类似于.MF 文件,但专门用于保存Panda3D应用程序而不是其他项;保存运行应用程序所需的所有内容,包括:Python代码、模型、纹理和已编译的.DLL 文件。

.ply

  PLY是一种电脑档案格式,全名为多边形档案(Polygon File Format)或斯坦福三角形档案(Stanford Triangle Format)。

.pov

  POV 文件扩展是POV-Ray Raytracing Format为 Pov-Ray 软件程序开发的 The POV-Team文件类型。

.pvr

  PVR文件扩展名来自POWERVR Texture File。该文件的开发由Imagination Technologies完成。该文件属于二进制格式,是光栅相关文件。

.rot

  rot文件扩展是Homeworld 2 Graphics File 文件,最初由Sierra Entertainment 为 Homeworld 2开发。 Annoymous用户数据统计推断,ROT 文件在China和使用Windows 10 设备的用户中最受欢迎。 这些用户中的大多数正在运行Google Chrome web浏览器。

.tf

  该格式是一种类似DOC格式的文件格式。tf是通常所说的富文本格式,也叫作多文本格式,常用来存储文档、图片信息。在不同的操作系统下创建的tf格式文档可以在其它操作系统和应用软件之间互相查看、传输,十分的方便。

.txf

  TXF是一种字体文件格式,用于保存税务数据,如收入和支出标准的基于文本的格式。它可以用于勒斯蒂亚、宇宙模拟和可视化程序的字体文件,也可以用于语言翻译和本地化程序创建的翻译文件。

.txp

  TXP是编辑浏览格式,最简单的例子,把网络上的小说储存到移动设备上(比如手机、MP4等等),有些情况就要将原文转换成.TXP

.vtf

  VTF(Valve Textures File)Valve贴图文件,是由VALVE独创的图象格式,由TGA格式演变而来,其优点是能很好的体现和展示TGA所具有的通道效果。

.x

  这是DirectX一种专用格式.。


自定义文件插件

  自定义文件插件主要是自定义一个插件读写类,继承osgDB::ReaderWriter类,然后根据需求重写如readNode等函数方法即可。
  在建立插件读写类时注意:
  需要建立一个dll项目工程,输出的dll必须为osgdb_扩展名.dll或osgdb_扩展名d.dll的形式为了实现插件注册,需要定义全局变量,方法如下REGISTER_OSGPLUGIN(VR, ReaderWriterVR),在该全局变量的初始化过程中,会使用Registery::addReaderWriter函数自动注册插件所对应的扩展名。
  在应用程序使用中,需要注册插件,方法如下 osgDB::Registry::instance->addFileExtensionAlias(“VR”, “VR”)
  其实我们不是做引擎没必要做插件,还是直接转换三维模型文件格式好一些。


测试加载模型文件

  选择obj格式最合适,但是又不带纹理等贴图格式,还需要配上贴图格式。
  在这里插入图片描述

步骤一:加载obj

  加载了obj文件,没有纹理,打开obj,发现需要一个mtllib的xxx.mtl作为纹理文件,拿到的模型是没有的。
  在这里插入图片描述

  mtllib:此前缀后指定了此OBJ文件所使用的材质库文件(*.mtl)的文件路径

步骤二:加载3ds文件

  加载了3ds文件,确实显示出来了,效果还不错,测试了拽托缩放完美流畅效果不错,达到预期。
  在这里插入图片描述


关键代码

初始化场景代码

osg::ref_ptr<osg::Node> OsgWidget::getModel3DMaxFile()
{
    // 隐藏整个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::Camera> pCamera = 0;
    osg::ref_ptr<osg::Geode> pGeode = 0;
    osg::ref_ptr<osg::Node> pNode = 0;

    // 添加模型
    {
//        osgDB::Options* a = new osgDB::Options(std::string("noTriStripPolygons"));
//        osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile("D:/qtProject/osgDemo/modelData/grass.obj", a);
//        osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile("D:/qtProject/osgDemo/modelData/grass.obj");
        pNode = osgDB::readNodeFile("D:/qtProject/osgDemo/modelData/grass.3ds");
    }
    // 创建背景相机(相机需要配合几何题图,可以理解为相机是最后得,相机中有一个全屏的图,这个图是个元素节点,这样图节点在相机中就成为了背景图)
    {
        // 步骤一:创建相机
        pCamera = new osg::Camera();
        // 步骤二:设置矩阵  显示得界面边坐标      左    右  下    上
        pCamera->setProjectionMatrixAsOrtho2D(0, 1920, 0, 1080);
        // 步骤三:设置视图矩阵
        pCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        // 步骤四:不受父类矩阵影响
        pCamera->setViewMatrix(osg::Matrix::identity());
        // 步骤五:清除深度缓存
        pCamera->setClearMask(GL_DEPTH_BUFFER_BIT);
        // 步骤六:设置为不接受事件,让其得不到焦点
        pCamera->setAllowEventFocus(false);
        // 步骤七:设置渲染顺序
//        pCamera->setRenderOrder(osg::Camera::PRE_RENDER);       // 不显示了
        pCamera->setRenderOrder(osg::Camera::NESTED_RENDER);    // 显示为背景HUD
//        pCamera->setRenderOrder(osg::Camera::POST_RENDER);      // 显示为前景HUD
        // 步骤八:关闭光照,通过osg::StateSet设置
        pGeode = new osg::Geode();
        osg::ref_ptr<osg::StateSet> pStateSet = pGeode->getOrCreateStateSet();
        pStateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
        // 步骤九:关闭深度测试
        pStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
    }

    // 创建铺满窗口的方形(窗口形状),并贴背景纹理图
    {
        // 步骤一:创建几何信息对象
        osg::ref_ptr<osg::Geometry> pGeometry = new osg::Geometry;
        // 步骤二:绑定顶点
        osg::ref_ptr<osg::Vec3Array> pVec3Array = new osg::Vec3Array;
        pGeometry->setVertexArray(pVec3Array);
#if 0
        pVec3Array->push_back(osg::Vec3( 300.0, 100.0, 0.0));
        pVec3Array->push_back(osg::Vec3( 600.0, 100.0, 0.0));
        pVec3Array->push_back(osg::Vec3( 600.0, 200.0, 0.0));
        pVec3Array->push_back(osg::Vec3( 300.0, 200.0, 0.0));
#else
        pVec3Array->push_back(osg::Vec3(   0,    0, 0));
        pVec3Array->push_back(osg::Vec3(1920,    0, 0));
        pVec3Array->push_back(osg::Vec3(1920, 1080, 0));
        pVec3Array->push_back(osg::Vec3(   0, 1080, 0));
#endif
        // 步骤三:读取图片(用于贴纹理)
        osg::ref_ptr<osg::Image> pImage = new osg::Image;
        pImage = osgDB::readImageFile(QString("D:/qtProject/osgDemo/osgDemo/modules/osgWidget/image/background2.png").toStdString());
        if(!pImage->valid())
        {
            LOG_WARN(QString("Failed to open image file: %1").arg(QString::fromStdString(pImage->getFileName())));
            return 0;

        }
        // 步骤四:创建纹理
        osg::ref_ptr<osg::Texture2D> pTexture2D = new osg::Texture2D();
        pTexture2D->setImage(pImage);
        pTexture2D->setUnRefImageDataAfterApply(true);
        // 步骤五:绑定纹理映射顶点
        osg::ref_ptr<osg::Vec2Array> pVec2Array = new osg::Vec2Array();
        pGeometry->setTexCoordArray(0, pVec2Array.get());
        pVec2Array->push_back(osg::Vec2(0.0, 0.0));
        pVec2Array->push_back(osg::Vec2(1.0, 0.0));
        pVec2Array->push_back(osg::Vec2(1.0, 1.0));
        pVec2Array->push_back(osg::Vec2(0.0, 1.0));
        // 步骤六:设置纹理环境
//        osg::ref_ptr<osg::TexEnv> pTexEnv=new osg::TexEnv;
//        pTexEnv->setMode(osg::TexEnv::Mode::BLEND);
//        pTexEnv->setColor(osg::Vec4(1.0,0.0,0.0,1.0));
        // 步骤七:关联纹理状态(包括纹理和纹理环境),通过osg::StateSet
        osg::ref_ptr<osg::StateSet> pStateSet = pGeometry->getOrCreateStateSet();
        pStateSet->setTextureAttributeAndModes(0, pTexture2D.get(), osg::StateAttribute::ON);
//        pStateSet->setTextureAttributeAndModes(0, pTexEnv.get(), osg::StateAttribute::ON);
        // 步骤八:为唯一的法线创建一个数组    法线: normal
        osg::ref_ptr<osg::Vec3Array> pVec3ArrayNormal = new osg::Vec3Array;
        pGeometry->setNormalArray(pVec3ArrayNormal.get());
        pGeometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
        pVec3ArrayNormal->push_back(osg::Vec3(0.0, 1.0, 0.0));
        // 步骤九:由保存的数据绘制四个顶点的多边形
        pGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));
        // 步骤十:将图形添加进几何节点
        pGeode->addDrawable(pGeometry.get());

    }
    pCamera->addChild(pGeode);  // 几何背景贴图为底图
    pGroup->addChild(pCamera);
    pGroup->addChild(pNode);    // 插入草地
//    pGroup->addChild(pGeode);   // 几何背景又插入一次中间作为元素
    // 设置漫游器,并禁止拽拖自动旋转
    osg::ref_ptr<osgGA::TrackballManipulator> pManipulator = new osgGA::TrackballManipulator;
    pManipulator->setAllowThrow(false);

    return pGroup.get();
} 

工程模板:对应版本号v1.31.0

  (中间有几个版本号是预言项目的,后面再回头说26~30版本的)
  在这里插入图片描述


上一篇:《OSG开发笔记(二十八):OSG模型固定路径动画》
下一篇: 持续补充中…


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

班主任必get,超实用的成绩发布方式

分享给老师们一个超级实用的教程&#xff0c;看看如何使用各种代码和Excel实现学生自主查询成绩的功能吧&#xff01;不用再繁琐的手动操作&#xff0c;让学生和家长自己就能查到成绩&#xff01; 成绩查询系统是什么&#xff1f; 成绩查询系统是一种方便学生查询考试成绩的应…

Android 和 iOS APP 测试的那些区别

目前市面上主流的移动操作系统就是 Android 和 iOS 两种&#xff0c;移动端测试本身就跟 Web 应用测试有自己的专项测试&#xff0c;比如安装、卸载、升级、消息推送、网络类型测试、弱网测试、中断测试、兼容性测试等都是区别于 Web 应用需要关注的测试领域。 那么&#xff0…

办公用品经营配送小程序商城的作用是什么

对办公人员来说&#xff0c;办公设备是不可缺少的&#xff0c;对办公用品经营商家来说&#xff0c;市场生意很高很多&#xff0c;但想要获取却也不容易&#xff0c;线下方式难以拓展&#xff0c;线上无平台&#xff0c;入驻第三方也有诸多限制与不足&#xff0c;私域是商家们增…

关键词搜索1688商品数据接口(标题|主图|SKU|价格|优惠价|掌柜昵称|店铺链接|店铺所在地)

1688商品列表接口是一个用于获取1688网站上商品列表信息的接口。通过该接口&#xff0c;您可以获取到1688网站上不同类别的商品列表&#xff0c;包括商品的名称、价格、图片等信息。 要使用1688商品列表接口&#xff0c;您需要按照以下步骤进行操作&#xff1a; 登录1688网站…

Linux 磁盘挂载2(文件系统格式化、磁盘挂载、VFS虚拟化文件系统)

目录 Linux文件系统 文件系统类型 Linux如何保存文件 VFS虚拟文件系统 文件格式化命令 mkfs 格式化文件系统 磁盘挂载命令 mount 临时挂载命令 umount 卸载文件系统 vim /etc/fstab 永久挂载 Linux文件系统 Linux 磁盘挂载1&#xff08;硬盘分区&#xff09;_linux磁…

高效遮挡!一键隐藏Logo标志,让您的内容更自由!

亲爱的用户&#xff0c;您是否曾经因为在营销、宣传、推广等领域使用的图片或视频中&#xff0c;存在不合适的Logo标志而感到烦恼&#xff1f;现在&#xff0c;我们向您推荐一款高效的遮挡工具&#xff0c;让您轻松隐藏Logo标志&#xff0c;让您的内容更自由&#xff01; 第一…

面试题:为什么HashMap 使用的时候指定容量?

文章目录 前言正文为什么要指定容量&#xff1f; 前言 其实可以看到我写了这么久的博客&#xff0c;很少去写hashMap的东西。 为什么&#xff1f;因为这个东西感觉是java面试必备的&#xff0c;我感觉大家都看到腻了&#xff0c;所以一直没怎么去写hashMap相关的。 本篇内容&…

eclispe项目中静态文件出现错误解决方法

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 很多时间…

C++项目——云备份-⑧-客户端各模块实现

文章目录 专栏导读1.客户端数据管理模块实现2.客户端文件检测模块实现3.客户端文件备份模块设计4.客户端文件备份模块实现 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿…

创建一个具有背景轮播和3D卡片翻转效果的个人名片网页

目录 项目展示 图片展示 前言 项目目标 项目目标 步骤 3&#xff1a;CSS 样式 步骤 4&#xff1a;JavaScript 动画 项目源码 知识点介绍 &#xff08;大佬请绕道&#xff09; HTML 结构的构建 2. CSS 样式的设计 3. JavaScript 动画的实现 4. 背景图轮播的逻辑 5…

java智慧工地云平台源码 人工智能AI+多系统集成+智能预警平台

智慧工地云平台源码 人工智能AI多系统集成智能预警平台 智慧工地企业级监管平台融入AIoT、移动互联网和物联网等领先技术&#xff0c;再结合工地“人、机、料、法、环”五大要素&#xff0c;劳务实名制管理、环境监测管理、安全施工管理、质量及能耗管理等智慧化应用&#xff0…

21.8 Python 使用BeautifulSoup库

BeautifulSoup库用于从HTML或XML文件中提取数据。它可以自动将复杂的HTML文档转换为树形结构&#xff0c;并提供简单的方法来搜索文档中的节点&#xff0c;使得我们可以轻松地遍历和修改HTML文档的内容。广泛用于Web爬虫和数据抽取应用程序中。 读者如果需要使用这个库&#x…

Leetcode---368周赛

题目列表 2908. 元素和最小的山形三元组 I 2909. 元素和最小的山形三元组 II 2910. 合法分组的最少组数 2911. 得到 K 个半回文串的最少修改次数 一、元素和最小的山形三元组I 没什么好说的&#xff0c;不会其他方法就直接暴力&#xff0c;时间复杂度O(n^3)&#xff0c;代…

SpringCloudGateway 入门

目录 POM 依赖一、内容网关的作用Spring-Cloud-Gateway的核心概念 二、基于Ribbon的负载均衡三、核心概念详细3.1 断言 Predicate3.2 过滤器3.2.1 内置过滤器3.2.2 自定义过滤器构造器&#xff08;原理&#xff09;资源结构Route / Predicate 的构造器构造器的增强器整体协同关…

人大金仓(Kingbase)部署

点击上方蓝字关注我 1. 介质下载 下载地址&#xff1a;https://www.kingbase.com.cn/rjcxxz/index.htm 选择安装包及授权文件&#xff1a;根据对应的操作系统类型选择安装包 2. 部署环境配置 2.1 部署环境&#xff1a; 8C 16G KylinV10SP3系统 2.2 修改操作系统内核参数 sy…

什么是pmp证书,pmp证书有什么用,pmp项目管理证书的认证考试时间是什么时候啊?

PMP是项目管理证书&#xff0c;目标是项目经理。 英文全称是Project Management Professional&#xff0c;中文全称叫做项目管理专业人士资格认证。 它是由美国项目管理协会&#xff08;PMI&#xff09;在全球范围内推出的针对项目经理的资格认证体系&#xff0c;严格评估项目…

贪心算法总结(未完结)

贪心的定义&#xff08;摘自百度百科&#xff09; 贪心算法&#xff08;greedy algorithm&#xff0c;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;算法得到的…

LeetCode刷题:26. 删除有序数组中的重复项

文章目录 写在前面⭐️26. 删除有序数组中的重复项⭐️&#x1f510;题目描述&#x1f4a1;解题思路&#x1f511;代码 写在前面 本题的题解代码是用C语言编写的。 &#x1f4d2;博客主页&#xff1a;2023Fighting的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f…

Springboot 使用JavaMailSender发送邮件 + Excel附件

目录 1.生成Excel表格 1.依赖设置 2.代码&#xff1a; 2.邮件发送 1.邮件发送功能实现-带附件 2.踩过的坑 1.附件名中文乱码问题 3.参考文章&#xff1a; 需求描述&#xff1a;项目审批完毕后&#xff0c;需要发送邮件通知相关人员&#xff0c;并且要附带数据库表生成的…

[ubuntu系统下的文本编辑器nano,vim,gedit,文件使用,以及版本更新问题]

文本编辑器概要 在Ubuntu系统下&#xff0c;有许多文本编辑器可供选择&#xff0c;每个编辑器都有其独特的特性和用途。以下是一些常见的文本编辑器&#xff1a; Gedit&#xff1a; 这是Ubuntu默认的文本编辑器&#xff0c;它简单易用&#xff0c;适合基本的文本编辑任务。 安…