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

news2024/9/30 1:44: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/585902.html

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

相关文章

动态规划专题一(动态规划的基本模型)

先上例题1 1258&#xff1a;【例9.2】数字金字塔 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn) 1258&#xff1a;【例9.2】数字金字塔 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 36341 通过数: 21547 【题目描述】 观察下面的数字…

HotSpot虚拟机OutOfMemoryError异常

目录 一、JVM内存区域 二、堆中对象 1. 对象的创建 2. 对象的内存布局 3. 对象的访问定位 三、OOM异常 1. 堆OOM异常测试 2. 栈SOF异常测试 1)&#xff1a;栈容量过小 2)&#xff1a;大量本地变量 3. 常量池OOM异常测试 4. 方法区测试 5. 堆外内存测试 四、参考资料…

详解FreeRTOS:嵌入式多任务系统的任务互斥和优先级反转(理论篇—9)

在嵌入式多任务系统中,有些资源必须是独占使用的,多个任务对这样的资源的并发访问将导致错误的发生。一般来说,对需要独占使用的资源必须使用互斥方法将对其的并发访问串行化。 在优先级多任务系统中引入互斥方案,会导致任务优先级反转的问题:假如某时低优先级的任务占有…

Zabbix之2023 Zabbix6.4最新高级特性、优缺点及其实现原理总结

目录 Zabbix高级特性1. 自动发现 Zabbix高级特性2. 分布式监控 Zabbix高级特性3. 高级报警 Zabbix高级特性4. 可视化 Zabbix高级特性5. API Zabbix高级特性6. 高可用性 Zabbix高级特性7. 安全性 Zabbix高级特性8. 无代理监控 SNMP IPMI JMX Zabbix高级特性9. Agent…

【Windows】局域网内远程桌面控制

【Windows】局域网内远程桌面控制 1、背景2、设置登录密码3、启用远程桌面4、远程示例 1、背景 工作中的很多场景需要远程操作&#xff0c;这时候可以借助远程桌面应用程序实现&#xff0c; 比如AnyDesk、向日葵、TeamViewer等。 windows10系统&#xff0c;其操作系统自带了远…

python基础知识(三):比较运算符、布尔运算符和位运算

目录 1. 比较运算符2. 布尔运算符3. 位运算 1. 比较运算符 比较运算符通常为以下6种&#xff1a; (1) 大于">“&#xff0c;比较两个数a、b的大小&#xff0c;比较的结果如果a大于b则为True&#xff0c;否则为False&#xff1b; (2) 大于等于”>“&#xff0c;比较…

【论文阅读笔记】Contrast image correction method

论文小结&#xff1a; 本文是2010年发表出来的一篇文章&#xff0c;提出的方法是一种增强对比度的方法&#xff0c;其基本原理是自适应参数的 ganma 校正。ganma 校正的目标在于同时校正曝光过度和曝光不足区域的图像。   同时&#xff0c;为了防止光晕伪影&#xff0c;使用双…

vue 【git】

文章目录 前言一、git 工作流程二、常用的git命令1.git 初始化2.修改的内容提交到暂存区3.暂存区的内容提交到本地仓库4.创建分支5.切换分支6.展示分支7.删除分支8.合并指定分支到当前分支9.本地仓库的内容提交到远程仓库10.合并分支11.上传本地仓库分支到远程仓库分支 前言 什…

路径规划算法:基于闪电搜索优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于闪电搜索优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于闪电搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

第12届蓝桥杯Scratch国赛真题集锦

程题 第 1 题 问答题 博土江出题 题目说明 编程实现:博土汪出了5道加法选择题&#xff0c;请同学们给出正确选项 具体要求 1).博士汪问:“n m ?”&#xff0c;n (0-9随机数)&#xff0c;m (0-9随机数) 2).下方A、B、C、D四个选项&#xff0c;随机一个选项为正确答案&#xff…

通过Python的PyPDF2库合并多个pdf文件

文章目录 前言一、PyPDF2库是什么&#xff1f;二、安装PyPDF2库三、查看PyPDF2库版本四、合并多个pdf文件1.引入库2.定义pdf路径3.获取所有要合并的PDF文件名4.创建一个新的PDF文件5.遍历所有PDF文件名6.打开PDF文件7.创建PDF阅读器对象8.遍历PDF中的每一页&#xff0c;并将它们…

嵌入式c语言-进制转换

10进制转2进制 以10进制的16,18为例子 利用短除法 每次除以2并且记录余数 直到商为1 然后从下往上写出 商余数 10进制转16进制 以55 180 500举例 利用短除法 每次除以16并且记录余数 直到商为1 然后从下往上写出 商余数 商和余数要写成16进制的形式 10进制转8进制 以15为…

(浙大陈越版)数据结构 第三章 树(上) 3.3 二叉树的遍历

目录 3.3.1 遍历&#xff08;先中后&#xff09; 二叉树的遍历 先序遍历&#xff1a; 中序遍历 后序遍历 tips: 3.3.2 中序非递归遍历 非递归算法实现的基本思路&#xff1a;使用堆栈 中序遍历的非递归算法具体实现方法为&#xff1a; 3.3.3 层序遍历 难点 解决方法…

经典神经网络(5)GoogLeNet及其在Fashion-MNIST数据集上的应用

经典神经网络(5)GoogLeNet及其在Fashion-MNIST数据集上的应用 1 Inception V1 的简述 Inception 网络是卷积神经网络的一个重要里程碑。在Inception 之前&#xff0c;大部分流行的卷积神经网络仅仅是把卷积层堆叠得越来越多&#xff0c;使得网络越来越深。这使得网络越来越复杂…

计算机组成原理-中央处理器-控制器功能和原理

目录 一、硬布线控制器 二、硬布线控制器的设计(硬件) 2.1分析每个阶段的微操作序列(取址、间址、执行、中断) 2.2选择cpu的控制方式 2.3 安排微操作时序 2.4电路设计 2.4.1列出操作时间表 2.4.2 写出微操作命令的最简表达式 2.4.3画出电路图 *三、微程序控制器基本原理 四…

剪映 自动打关键帧 AutoHotkey

牙叔教程 简单易懂 明确目的 做小说推文的话&#xff0c; 前面几分钟肯定要自己打关键帧&#xff0c; 所以这里的自动打关键帧指的是后面几分钟的图片&#xff0c; 对关键帧要求比较高的同学可以划走了, 因为这里介绍的是简单的 上上下下缩放的关键帧 要求 用剪映提取字幕…

【Python Twisted】零基础也能轻松掌握的学习路线与参考资料

Python Twisted是一个用于网络编程的事件驱动的框架&#xff0c;该框架使用异步I/O模型和回调函数。它支持多种协议&#xff0c;包括TCP、UDP、SSL/TLS、XMPP等&#xff0c;可以用来编写Web服务器、聊天应用、邮件服务器等。Twisted是一个成熟的框架&#xff0c;拥有强大的社区…

【JavaEE】文件操作和IO

目录 1、认识文件 1.1、路径 1.1.1 、绝对路径 1.1.2、相对路径 1.2、文本文件 vs 二进制文件 2、文件系统操作 3、文件内容操作 3.1、字节流用来输入的抽象类InputStream的方法使用 3.1.1、FileInputStream类的构造方法 3.1.2、字节流读操作 3.1.3、字节流写操作 3.…

Presto从入门到精通以及案例实操系列

1、简介 1.1、Presto的由来 Presto最初由Facebook公司开发&#xff0c;旨在解决Facebook内部大规模数据处理和数据分析的问题。在传统的Hadoop生态圈中&#xff0c;MapReduce作为数据处理框架&#xff0c;虽然能够处理海量数据&#xff0c;但是其查询性能却比较低下&#xff…

《面试1v1》CountDownLatch和CyclicBarrier

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 你用过 CountDownLatch 和 CyclicBarrier 吗&#xff1f; 候选人&#xff1a; 当然可以。CountDownLatch 和 CyclicBarrier 都是 Java 中用于多…