osg给osg::Geometry(自己绘制的几何体)添加纹理(二)

news2024/11/28 12:52:52

目录

1. 前言

2. 自会集合体贴纹理 

   2.1. 一张图贴到整个几何体

   2.2. 几何体每个面贴不同的图片纹理

3. 说明


1. 前言

             前文讲述了如何给osg自带的几何体,如:BOX等,添加纹理,文章参考链接如下:

  • osg给osg::Geometry(osg自带的几何体,如:BOX等)添加纹理(一)

2. 自己绘制的几何体贴纹理 

   2.1. 一张图贴到整个几何体

      下面代码展示将一张图作为纹理,贴到整个几何体上,即几何体由几个面组成,则每个面的纹理都是该图片形成的纹理。代码如下:

#include<osgDB\ReadFile>
#include<osgViewer\Viewer>
#include<osg\ShapeDrawable>
#include<osg\Geode>
#include<osg\StateSet>
#include<osg\Image>
#include<osg\Texture2D>
#include<osg\Material>
#include<osg\MatrixTransform>

osg::ref_ptr<osg::Geode> createBox()
{

	osg::ref_ptr<osg::Geode> spGeode = new osg::Geode;// Geode是Node的派生类,为了绘制图元的管理类

	osg::ref_ptr<osg::Geometry> spGeometory = new osg::Geometry;
	spGeode->addChild(spGeometory);
    //spGeode->addDrawable(spGeometory);  // 可以将addChild替换为这句。
	osg::ref_ptr<osg::Vec3Array> spCoordsArray = new osg::Vec3Array;

	// 右侧面
	spCoordsArray->push_back(osg::Vec3d(1.0, -1.0, -1.0));  // 前右下顶点
	spCoordsArray->push_back(osg::Vec3d(1.0, 1.0, -1.0));   // 后右下顶点
	spCoordsArray->push_back(osg::Vec3d(1.0, 1.0, 1.0));    // 后右上顶点 
	spCoordsArray->push_back(osg::Vec3d(1.0, -1.0, 1.0));   // 前右上顶点

	// 前面
	spCoordsArray->push_back(osg::Vec3d(1.0, -1.0, -1.0));  // 右下顶点
	spCoordsArray->push_back(osg::Vec3d(1.0, -1.0, 1.0));   // 右上顶点
	spCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, 1.0));  // 左上顶点 
	spCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, -1.0)); // 左下顶点

	// 左侧面
	spCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, -1.0));  // 前左下顶点
	spCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, 1.0));   // 前左上顶点
	spCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, 1.0));    // 后左上顶点 
	spCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, -1.0));   // 后左下顶点

	// 后面
	spCoordsArray->push_back(osg::Vec3d(1.0, 1.0, -1.0));    // 后下顶点
	spCoordsArray->push_back(osg::Vec3d(1.0, 1.0, 1.0));     // 后上顶点
	spCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, 1.0));    // 左上顶点 
	spCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, -1.0));   // 左下顶点

	// 上面
	spCoordsArray->push_back(osg::Vec3d(1.0, -1.0, 1.0));     // 前右顶点
	spCoordsArray->push_back(osg::Vec3d(1.0, 1.0, 1.0));      // 后右顶点
	spCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, 1.0));     // 后左顶点 
	spCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, 1.0));    // 前左顶点

	// 底面
	spCoordsArray->push_back(osg::Vec3d(1.0, -1.0, -1.0));     // 前右顶点
	spCoordsArray->push_back(osg::Vec3d(1.0, 1.0, -1.0));     // 后右顶点
	spCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, -1.0));    // 后左顶点 
	spCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, -1.0));   // 前左顶点

	spGeometory->setVertexArray(spCoordsArray);

	osg::DrawElementsUShort* pDrawElemt{ nullptr };
	for (auto nCoordIndex = 0; nCoordIndex < spCoordsArray->size(); ++nCoordIndex)
	{
		if (0 == (nCoordIndex % 4))
		{
			pDrawElemt = new osg::DrawElementsUShort(GL_QUADS);
			pDrawElemt->push_back(nCoordIndex);
			spGeometory->addPrimitiveSet(pDrawElemt);
		}
		else
		{
			pDrawElemt->push_back(nCoordIndex);
		}
	}

	// 设置纹理
	osg::ref_ptr<osg::Texture2D>spTexture2D = new osg::Texture2D;
	osg::ref_ptr<osg::Image> spImage = osgDB::readImageFile("guangzhou_tower.jpg");
	if (spImage.valid()) 
	{
		spTexture2D->setImage(spImage.get());
	}

	spTexture2D->setWrap(osg::Texture2D::WRAP_S, osg::Texture::CLAMP);
	spTexture2D->setWrap(osg::Texture2D::WRAP_T, osg::Texture::CLAMP);
	spTexture2D->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture::LINEAR);
	spTexture2D->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture::LINEAR);

	// 设置纹理坐标
	osg::ref_ptr<osg::Vec2Array> spTextureCoordsArray = new osg::Vec2Array;
	auto nPrimitiveSetSize = spGeometory->getPrimitiveSetList().size(); // 面的个数
	for (auto i = 0; i < nPrimitiveSetSize; i++) // 设置每个面的纹理坐标
	{
		spTextureCoordsArray->push_back(osg::Vec2(0, 0));
		spTextureCoordsArray->push_back(osg::Vec2(0, 1));
		spTextureCoordsArray->push_back(osg::Vec2(1, 1));
		spTextureCoordsArray->push_back(osg::Vec2(1, 0));
	}

	spGeometory->setTexCoordArray(0, spTextureCoordsArray, osg::Array::Binding::BIND_PER_PRIMITIVE_SET);
	spGeometory->getOrCreateStateSet()->setTextureAttributeAndModes(0, spTexture2D.get(), osg::StateAttribute::ON); // 开启纹理

	return spGeode;

}

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

	osg::ref_ptr<osg::MatrixTransform> spMatrixTransform = new osg::MatrixTransform;

	// 绕y、z轴转动下,这样便于观察效果
	spMatrixTransform->setMatrix(osg::Matrix::rotate(osg::PI / 3.0, osg::Vec3(0, 0, 1)) * osg::Matrix::rotate(osg::PI / 5.0, osg::Vec3(1, 0, 0)));
	spMatrixTransform->addChild(createBox());
	viewer->setSceneData(spMatrixTransform);

	return viewer->run();
}

效果如下:

   2.2. 几何体每个面贴不同的图片纹理

       有时需要对几何体每个面贴上不同图片形成纹理,即每个面纹理不同。解决思路是:每个面形成一个osg::Geometry,而不是所有面形成一个osg::Geometry,且每个osg::Geometry对象new出一个osg::Texture2D进行纹理关联。这是因为如下代码:

spGeometory->getOrCreateStateSet()->setTextureAttributeAndModes(0, spTexture2D.get(), osg::StateAttribute::ON); // 开启纹理

其中spGeometory表示 osg::Geometry对象,每个osg::Geometry对象只能设定一个osg::Texture2D对象,所以要想每个面绑定一个不同的osg::Texture2D对象,则必须对每个面单独形成一个osg::Geometry,而不是所有面形成一个osg::Geometry。为几何体每个面贴上不同图片的纹理代码如下:

osg::ref_ptr<osg::Geometry> createGeometry(const std::string& strImagePath, osg::ref_ptr<osg::Vec3Array> spCoordsArray, osg::ref_ptr<osg::Vec3Array> spNormalArray)
{
	osg::ref_ptr<osg::Geometry> spGeometory = new osg::Geometry;
	spGeometory->setVertexArray(spCoordsArray);
	spGeometory->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, spCoordsArray->size()));

	// 设置纹理
	osg::ref_ptr<osg::Texture2D>spTexture2D = new osg::Texture2D;
	osg::ref_ptr<osg::Image> spImage = osgDB::readImageFile(strImagePath);
	if (spImage.valid())
	{
		spTexture2D->setImage(0, spImage.get());
	}

	spTexture2D->setWrap(osg::Texture2D::WRAP_S, osg::Texture::CLAMP);
	spTexture2D->setWrap(osg::Texture2D::WRAP_T, osg::Texture::CLAMP);
	spTexture2D->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture::LINEAR);
	spTexture2D->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture::LINEAR);

	// 设置纹理坐标
	osg::ref_ptr<osg::Vec2Array> spTextureCoordsArray = new osg::Vec2Array;
	spTextureCoordsArray->push_back(osg::Vec2(0, 0));
	spTextureCoordsArray->push_back(osg::Vec2(0, 1));
	spTextureCoordsArray->push_back(osg::Vec2(1, 1));
	spTextureCoordsArray->push_back(osg::Vec2(1, 0));

	spGeometory->getOrCreateStateSet()->setTextureAttributeAndModes(0, spTexture2D.get(), osg::StateAttribute::ON); // 开启纹理
	spGeometory->setTexCoordArray(0, spTextureCoordsArray, osg::Array::Binding::BIND_PER_PRIMITIVE_SET);
	spGeometory->setNormalArray(spNormalArray, osg::Array::Binding::BIND_PER_PRIMITIVE_SET);

	return spGeometory;
}
osg::ref_ptr<osg::Geode> createBoxEx()
{
	osg::ref_ptr<osg::Geode> spGeode = new osg::Geode;// Geode是Node的派生类,为了绘制图元的管理类

	osg::ref_ptr<osg::Vec3Array> spRightFaceCoordsArray = new osg::Vec3Array;

	// 右侧面
	spRightFaceCoordsArray->push_back(osg::Vec3d(1.0, -1.0, -1.0));  // 前右下顶点
	spRightFaceCoordsArray->push_back(osg::Vec3d(1.0, 1.0, -1.0));   // 后右下顶点
	spRightFaceCoordsArray->push_back(osg::Vec3d(1.0, 1.0, 1.0));    // 后右上顶点 
	spRightFaceCoordsArray->push_back(osg::Vec3d(1.0, -1.0, 1.0));   // 前右上顶点

	osg::ref_ptr<osg::Vec3Array> spRightFaceNormalArray = new osg::Vec3Array;
	spRightFaceNormalArray->push_back(osg::Vec3(1, 0, 0));
	osg::ref_ptr<osg::Geometry> spRightFaceGeometory = createGeometry("guangzhou_tower.jpg", spRightFaceCoordsArray, spRightFaceNormalArray);
	spGeode->addChild(spRightFaceGeometory);

	// 前面
	osg::ref_ptr<osg::Vec3Array> spFrontFaceCoordsArray = new osg::Vec3Array;
	spFrontFaceCoordsArray->push_back(osg::Vec3d(1.0, -1.0, -1.0));  // 右下顶点
	spFrontFaceCoordsArray->push_back(osg::Vec3d(1.0, -1.0, 1.0));   // 右上顶点
	spFrontFaceCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, 1.0));  // 左上顶点 
	spFrontFaceCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, -1.0)); // 左下顶点

	osg::ref_ptr<osg::Vec3Array> spFrontFaceNormalArray = new osg::Vec3Array;
	spFrontFaceNormalArray->push_back(osg::Vec3(0, -1, 0));
	osg::ref_ptr<osg::Geometry> spFrontGeometory = createGeometry("csdn.jpg", spFrontFaceCoordsArray, spFrontFaceNormalArray);
	spGeode->addChild(spFrontGeometory);

	// 左侧面
	osg::ref_ptr<osg::Vec3Array> spLeftFaceCoordsArray = new osg::Vec3Array;
	spLeftFaceCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, -1.0));  // 前左下顶点
	spLeftFaceCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, 1.0));   // 前左上顶点
	spLeftFaceCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, 1.0));    // 后左上顶点 
	spLeftFaceCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, -1.0));   // 后左下顶点

	osg::ref_ptr<osg::Vec3Array> spLeftFaceNormalArray = new osg::Vec3Array;
	spLeftFaceNormalArray->push_back(osg::Vec3(-1, 0, 0));
	osg::ref_ptr<osg::Geometry> spLeftGeometory = createGeometry("desktop.jpg", spLeftFaceCoordsArray, spLeftFaceNormalArray);
	spGeode->addChild(spLeftGeometory);

	// 后面
    osg::ref_ptr<osg::Vec3Array> spBackFaceCoordsArray = new osg::Vec3Array;
	spBackFaceCoordsArray->push_back(osg::Vec3d(1.0, 1.0, -1.0));    // 后下顶点
	spBackFaceCoordsArray->push_back(osg::Vec3d(1.0, 1.0, 1.0));     // 后上顶点
	spBackFaceCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, 1.0));    // 左上顶点 
	spBackFaceCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, -1.0));   // 左下顶点

	osg::ref_ptr<osg::Vec3Array> spBackFaceNormalArray = new osg::Vec3Array;
	spBackFaceNormalArray->push_back(osg::Vec3(0, 1, 0));
	osg::ref_ptr<osg::Geometry> spBackGeometory = createGeometry("tower.jpg", spBackFaceCoordsArray, spBackFaceNormalArray);
	spGeode->addChild(spBackGeometory);

	// 上面
	osg::ref_ptr<osg::Vec3Array> spTopFaceCoordsArray = new osg::Vec3Array;
	spTopFaceCoordsArray->push_back(osg::Vec3d(1.0, -1.0, 1.0));     // 前右顶点
	spTopFaceCoordsArray->push_back(osg::Vec3d(1.0, 1.0, 1.0));      // 后右顶点
	spTopFaceCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, 1.0));     // 后左顶点 
	spTopFaceCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, 1.0));    // 前左顶点

	osg::ref_ptr<osg::Vec3Array> spTopFaceNormalArray = new osg::Vec3Array;
	spTopFaceNormalArray->push_back(osg::Vec3(0, 0, 1));
	osg::ref_ptr<osg::Geometry> spTopGeometory = createGeometry("xi_an_tower.jpg", spTopFaceCoordsArray, spTopFaceNormalArray);
	spGeode->addChild(spTopGeometory);

	// 底面
	osg::ref_ptr<osg::Vec3Array> spBottoomFaceCoordsArray = new osg::Vec3Array;
	spBottoomFaceCoordsArray->push_back(osg::Vec3d(1.0, -1.0, -1.0));     // 前右顶点
	spBottoomFaceCoordsArray->push_back(osg::Vec3d(1.0, 1.0, -1.0));     // 后右顶点
	spBottoomFaceCoordsArray->push_back(osg::Vec3d(-1.0, 1.0, -1.0));    // 后左顶点 
	spBottoomFaceCoordsArray->push_back(osg::Vec3d(-1.0, -1.0, -1.0));   // 前左顶点

	osg::ref_ptr<osg::Vec3Array> spBottomFaceNormalArray = new osg::Vec3Array;
	spBottomFaceNormalArray->push_back(osg::Vec3(0, 1, 0));
	osg::ref_ptr<osg::Geometry> spBottomGeometory = createGeometry("paris_tower.jpg", spBottoomFaceCoordsArray, spBottomFaceNormalArray);
	spGeode->addChild(spBottomGeometory);
	
	// 开启光照,要不然几何体有些面转到正对相机时是黑色的
	spGeode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::ON);
	osg::ref_ptr<osg::Light> spLight = new osg::Light;
	spLight->setDiffuse(osg::Vec4d(0.0, 1.0, 0.5, 1.0)); // 漫反射光颜色
	spLight->setAmbient(osg::Vec4d(0.6, 0.6, 0.6, 1.0)); // 设置环境光颜色
	spLight->setPosition(osg::Vec4d(1, -1, 1, 0));       // 设置光源位置
	spGeode->getOrCreateStateSet()->setAttributeAndModes(spLight, osg::StateAttribute::ON); // 开启纹理
	return spGeode;

}

上述代码开启了光照,在2.1节没开启光照时,当几何体有些面转到正对相机时,是黑色的,开启光照,则看得清些。 

将main函数中的如下代码:

spMatrixTransform->addChild(createBox());

 改为:

spMatrixTransform->addChild(createBoxEx());

效果如下:

 3. 说明

      在绑定每个面的纹理时,绑定方式必须为osg::Array::Binding::BIND_PER_PRIMITIVE_SET,否则2.1节只有第1次绘制的面即右侧面才有纹理。关于 osg::Array::Binding枚举各值含义,请参见:osg图元绑定方式总结

     对于某些图片作为纹理,需要相应的插件才行。如:读取jpg,故请保证jpg插件存在,否则读取jpg会失败。如下为读取png类型图片时,因为没有png的插件弹出的错误:

Error reading file Qt.png: read error (Could not find plugin to read objects from file "Qt.png".)

关于怎么编译jpg插件到osg,请参见:osg第三方插件的编译方法(以jpeg插件来讲解)

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

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

相关文章

6步带你弄懂敏捷软件开发管理

敏捷开发是一种项目管理和软件开发的迭代方法&#xff0c;可帮助团队较快地为客户创造价值&#xff0c;同时减少问题。为了获得好处&#xff0c;软件项目团队需要知道如何正确使用敏捷管理方法。 了解敏捷宣言 敏捷宣言阐述了基本的价值观&#xff0c;还详细说明了敏捷团队应…

【云计算与虚拟化】第五章—— vCenter Server 5.5 的高级功能(三)

第五章—— vCenter Server 5.5 的高级功能&#xff08;三&#xff09; 1.使用vsphere client 登陆vcenter服务器,创建一个群集&#xff0c;名称为自己的学号&#xff0c;&#xff08;截图&#xff09; 2.针对该群集打开HA功能&#xff08;截图&#xff09; 3.接入控制策略选择…

【Linux安装】从无到有!在VM虚拟机上安装Linux

系列文章目录 文章目录 系列文章目录准备工作1、Linux阿里云iso镜像: [Centos7.9.2009](http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.5ec0f5adDd8whz) 一、在虚拟机上开辟空间 这里使用VM15做安装例子&#xff0c;16也同样适用1、打开VM 点…

ORB-SLAM内的卡方检验

ORB-SLAM内的卡方检验 1. 概念2. 卡方检验的基本思想3. 卡方检测示例4. ORB-SLAM2中卡方检测剔除外点的策略4.1 示例&#xff0c;卡方检验计算置信度得分: CheckFundamental()、CheckHomography() Reference: 卡方检验(Chi-square test/Chi-Square Goodness-of-Fit Test)卡方检…

chatgpt在复杂问题的回答表现

2023年东南大学论文&#xff1a;Evaluation of ChatGPT as a Question Answering System for Answering Complex Questions 代码库已经无法访问了&#xff1a;https://github.com/tan92hl/Complex-Question-Answering- Evaluation-of-ChatGPT 1.简介 复杂问题的回答&#xff…

ROS学习——在rviz中调用电脑摄像头

一、安装相关软件包 安装uvc camera sudo apt-get install ros-kinetic-uvc-camera安装image相关功能包 sudo apt-get install ros-kinetic-image-* sudo apt-get install ros-kinetic-rqt-image-view 要记得把kinetic换成 你自己的ros版本。 二、启动ros&#xff0c;调用…

我国中央商务区(CBD)的空间重构及发展模式

中央商务区&#xff08;Central Business District&#xff0c;简称为CBD&#xff09;&#xff0c;原始意义为“商业会聚之地”是指一个国家或城市商务活动的主要集中的区域&#xff0c;是汇聚商务服务、金融服务、科技服务、咨询服务、会展服务、文化服务等服务业的集聚区域&a…

科海思针对锂盐溶液/锂电废水除钙镁、除硼、除铊的解决方案

碳酸锂是锂电行业阳极生产中的一个重要原材料&#xff0c;主要用于制造钴酸锂、镍酸锂、锰酸锂等电极材料&#xff0c;在充电锂电池中也用作非水溶液电解质等&#xff0c;具有良好的电化学性能&#xff0c;应用领域还在不断扩大。 工业级碳酸锂主含量&#xff08;Li2CO3&#…

es elasticsearch 八 mapping 映射 、复杂数据类型

目录 Mapping 映射 复杂数据类型 Mapping 映射 精确匹配 必须和对应字段值安全一致才可查出 全文检索 缩写搜索全程、格式转换 大小写 同义词 全文检索核心原理 分词&#xff0c;初步的倒排索引的建立 重建倒排索引 时态转换、重复数的转换、同义词的转换、大小写的转换 …

公文写作素材:工作落实类过渡句50例

1.再美的发展蓝图&#xff0c;如果不能落到实处&#xff0c;都是纸上谈兵&#xff1b;再大的奋进决心&#xff0c;如果没有实际行动&#xff0c;对工作毫无益处。 2.会议提出的任务再明确不落实只是纸上谈兵&#xff0c;会议出台的措施再可行不担当只是空中楼阁。 3.既要有不…

buildroot简介

网址 官网&#xff1a;https://buildroot.org/ 下载地址&#xff1a;https://buildroot.org/download.html 使用 解压后&#xff0c;执行make menuconfig Target options &#xff08;目标板配置&#xff09; Target Architecture&#xff1a; 目标架构&#…

SpringCloud微服务踩坑系列-java.lang.IllegalStateException

异常如下&#xff1a; 2023-05-24 08:47:10.764 ERROR 118400 --- [nio-8084-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exceptio…

1978-2020年337个城市的原材料储备量数据

铜、钢、铝、木材、水泥等原材料是城市建设和经济发展的必备物质&#xff01;厘清原材料的储备情况对于经济发展、资源可持续利用等都具有重要意义&#xff01; 我们发现在Springer Nature平台上分享有1978-2020年我国337个城市的原材料储备量数据&#xff01;该数据包括了337…

《Spring Guides系列学习》guide16 - guide20

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

【微博-计算Cell子控件的frame Objective-C语言】

一、计算Cell子控件的frame 1.来,看一下,刚才我们已经做到把这个模型设置给自定义的cell了吧, 那么,在这个自定义Cell里面呢,我们是不是要开始设置数据了, 设置数据,我们,设置数据,其实很简单,就是把我们这里边的每一个控件,对应的值,从模型里面取出来,给了它,…

挂耳式耳机品牌排行榜,看看谁被推荐上榜

下班路上就想放空自己刷会儿视频&#xff0c;但是马路、地铁还有公交上都会有嘈杂的声音影响&#xff0c;如果佩戴入耳式耳机放大声音不仅会过度屏蔽外界&#xff0c;同时还会损伤我们的耳朵&#xff0c;所以新近流行的开放式耳机很好的解决了这些问题&#xff0c;但也有很多小…

智安网络|如何做好网络漏洞管理?这几点一定要了解!

随着网络技术的不断发展和应用&#xff0c;网络安全已经成为了各个企业、机构、甚至个人都需要面对和解决的难题。而在网络安全中&#xff0c;漏洞管理是非常重要的一个方面。本文将阐述网络安全中漏洞管理的相关知识和如何有效地进行漏洞管理。 一、漏洞管理的定义 漏洞是指软…

5.YAML介绍

什么是YAML&#xff1f; YAML是一种存储数据的文件格式。类似json和xml。 Ansible playbooks或者配置文件,以称为YAML的特定格式编写&#xff61;如果您使用过其他数据结构格式&#xff08;如XML或JSON&#xff09;,则应该能够轻松地使用它&#xff61; 上图中就是以3种格式表…

找不到vcruntime140.dll,无法继续执行代码,vcruntime140.dll怎么修复

vcruntime140.dll是一个Microsoft Visual C Redistributable包的一部分&#xff0c;它是用于运行在Windows操作系统上使用Visual C开发的程序和应用程序的必备文件之一。它是Microsoft Visual C Redistributable的动态链接库文件&#xff0c;也就是所谓的DLL文件。如果这个文件…

nova 11系列可打断动画闪亮登场,带你领略极致丝滑体验

华为nova 11系列手机自发布以来就受到广大消费者的好评和青睐&#xff0c;尤其是全网热捧的丝滑流畅动效体验&#xff0c;更是让不少用户直呼——“一旦上手&#xff0c;就回不去了”&#xff0c;让我们先来欣赏一下nova 11系列上的动效吧&#xff01; 从上面的视频演示&#x…