C++ OpenGL绘制三维立体skybox场景obj模型AABB碰撞检测旋转动画界面

程序示例精选
C++ OpenGL绘制三维立体skybox场景obj模型AABB碰撞检测旋转动画界面
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!

前言

这篇博客针对《C++ OpenGL绘制三维立体skybox场景obj模型AABB碰撞检测旋转动画界面》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。


运行结果


文章目录

一、所需工具软件
二、使用步骤
       1. 主要代码
       2. 运行结果
三、在线协助

一、所需工具软件

       1. VS2019,
       2. C++

二、使用步骤

代码如下(示例):
void Scene::genDepthMap(GLuint*& depthMapFBO, GLuint*& depthMap, GLuint SHADOW_WIDTH, GLuint SHADOW_HEIGHT)
{
	glGenFramebuffers(1, depthMapFBO);

	glGenTextures(1, depthMap);
	glBindTexture(GL_TEXTURE_2D, *depthMap);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
		SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
//	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
//	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);


	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

	glBindFramebuffer(GL_FRAMEBUFFER, *depthMapFBO);
	//glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, *depthMap, 0);
	//设置不适用任何颜色
	glDrawBuffer(GL_NONE);
	glReadBuffer(GL_NONE);
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void Scene::RenderShadow()
{
	glViewport(0, 0, 1024, 1024);
	glBindFramebuffer(GL_FRAMEBUFFER, *depthMapFBO);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, *depthMap, 0);
	glDrawBuffer(GL_NONE);
	glEnable(GL_DEPTH_TEST);
	glClear(GL_DEPTH_BUFFER_BIT);
	glUseProgram(DepthShader);
	GLint loc = glGetUniformLocation(DepthShader, "lightMVP");
	assert(loc >= 0);
	mat4 MatInfo1 = light.PhysicalInfo.getPerspective() * light.PhysicalInfo.getView();
	glUniformMatrix4fv(loc, 1, GL_FALSE, &MatInfo1[0][0]);

	for (unsigned i = 0; i < Objects.size(); i++)
	{
		Objects[i].DepthFrameDraw(DepthShader);
	}
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void Scene::RenderObjects()
{

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glClearColor(.8f, .8f, .8f, 1.f);



	glUseProgram(Shader);
	glDrawBuffer(GL_FRONT);
	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, *depthMap);
	GLint loc = glGetUniformLocation(Shader, "shadowMap");
	assert(loc >= 0);
	glUniform1i(loc, 0);

	
	
	float iResolution[2];
	iResolution[0] = glutGet(GLUT_WINDOW_WIDTH);
	iResolution[1] = glutGet(GLUT_WINDOW_HEIGHT);
	glViewport(0, 0, iResolution[0], iResolution[1]);

	

	loc = glGetUniformLocation(Shader, "IntensityAmbient");
	assert(loc >= 0);
	glUniform1f(loc, light.IntensityAmbient);
	loc = glGetUniformLocation(Shader, "Intensity");
	assert(loc >= 0);
	glUniform1f(loc, light.Intensity);
	loc = glGetUniformLocation(Shader, "LightPos");
	assert(loc >= 0);
	vec3 lightPos = light.PhysicalInfo.getCameroPos();
	glUniform3f(loc, lightPos[0], lightPos[1], lightPos[2]);
	loc = glGetUniformLocation(Shader, "lightMVP");
	assert(loc >= 0);
	mat4 MatInfo = light.PhysicalInfo.getPerspective() * light.PhysicalInfo.getView();;
	glUniformMatrix4fv(loc, 1, GL_FALSE, &MatInfo[0][0]);

	loc = glGetUniformLocation(Shader, "LightKa");
	assert(loc >= 0);
	glUniform3f(loc, light.Ka[0], light.Ka[1], light.Ka[2]);
	loc = glGetUniformLocation(Shader, "LightKd");
	assert(loc >= 0);
	glUniform3f(loc, light.Kd[0], light.Kd[1], light.Kd[2]);
	loc = glGetUniformLocation(Shader, "LightKs");
	assert(loc >= 0);
	glUniform3f(loc, light.Ks[0], light.Ks[1], light.Ks[2]);


	loc = glGetUniformLocation(Shader, "CameroPos");
	assert(loc >= 0);
	vec3 CameroPos = Cam.getCameroPos();
	glUniform3f(loc, CameroPos[0], CameroPos[1], CameroPos[2]);
	loc = glGetUniformLocation(Shader, "View");
	assert(loc >= 0);
	mat4 MatV = Cam.getView();
	glUniformMatrix4fv(loc, 1, GL_FALSE, &MatV[0][0]);
	loc = glGetUniformLocation(Shader, "Perspective");
	assert(loc >= 0);
	mat4 MatP = Cam.getPerspective();
	glUniformMatrix4fv(loc, 1, GL_FALSE, &MatP[0][0]);

	glBindFramebuffer(GL_FRAMEBUFFER, 0);

	for (unsigned i = 0; i < Objects.size(); i++)
	{
		Objects[i].Draw(Shader);
	}
	glBindFramebuffer(GL_FRAMEBUFFER, 0);






}
void Scene::RenderSkyBox()
{
	skybox.Draw(Cam.getView(),Cam.getPerspective(), light.IntensityAmbient);
}

void Scene::drive(int data)
{
	glutTimerFunc(20, drive, 1);
	glutPostRedisplay();
}
void Scene::display()
{



	//cout << "Pos(" << Cam.getCameroPos()[0] << "," << Cam.getCameroPos()[1] << "," << Cam.getCameroPos()[2] << endl;// "," <<

	float iTime = glutGet(GLUT_ELAPSED_TIME) / 10; 
	const float R = 20.f;  
	// const float T = 120.f; 
	const float T = 30.f; 
	float theta = iTime * 0.05f * PI / T; 
	theta = glm::mod((double)theta, 2.f * PI); 
	vec3 pos; 

	if (theta < PI)
	{
		pos = vec3(cos(theta) * R, sin(theta) * R, 0);  
		light.PhysicalInfo.setCameroPos(pos);
		float iResolution[2];
		iResolution[0] = glutGet(GLUT_WINDOW_WIDTH);
		iResolution[1] = glutGet(GLUT_WINDOW_HEIGHT);
		light.PhysicalInfo.setPerspective(150, iResolution[0] / iResolution[1], 0.1, 80); 
		light.PhysicalInfo.setView(vec3(0, 0, 1), vec3(0, 0, 0) - pos);  
		light.Intensity = glm::max(0.5f * dot(vec3(0, 1, 0), normalize(pos)), 0.5f); 
		light.IntensityAmbient = light.Intensity + 0.2f;  // 计
		light.Kd = vec3(1); 

	}
	else
	{
		pos = vec3(10.806, 5.25367, 10.0413); 
		light.PhysicalInfo.setCameroPos(pos);
		light.PhysicalInfo.setView(vec3(1, 0, 0), vec3(0, -1, 0));  
		light.PhysicalInfo.setPerspective(90, 1, 0.1, 10);  // 
		light.Intensity = 0.7;  
		light.IntensityAmbient = 0.7f;  
		light.Kd = vec3(0.8, 0.8, 0.5); 

	}
	
	RenderShadow();
	RenderObjects();
	RenderSkyBox();
	glutSwapBuffers();
	
}
void Scene::init()
{

	//glEnable(GL_CULL_FACE);
	
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_TEXTURE_2D);


	glEnable(GL_MULTISAMPLE);
	glHint(GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST);

	// detect current settings
	GLint iMultiSample = 0;
	GLint iNumSamples = 0;
	glGetIntegerv(GL_SAMPLE_BUFFERS, &iMultiSample);
	glGetIntegerv(GL_SAMPLES, &iNumSamples);
	printf("MSAA on, GL_SAMPLE_BUFFERS = %d, GL_SAMPLES = %d\n", iMultiSample, iNumSamples);
	string VertShader, FragShader;

	VertShader = "shaders/Shader.vert";
	FragShader = "shaders/Shader.frag";

	ShaderInfo shaders[] = {
		{ GL_VERTEX_SHADER, VertShader.c_str()},
		{ GL_FRAGMENT_SHADER, FragShader.c_str()},
		{ GL_NONE, NULL }
	};
	Shader = LoadShaders(shaders);
	VertShader = "shaders/depthShader.vert";
	FragShader = "shaders/depthShader.frag";
	ShaderInfo Depthshaders[] = {
		{ GL_VERTEX_SHADER, VertShader.c_str()},
		{ GL_FRAGMENT_SHADER, FragShader.c_str()},
		{ GL_NONE, NULL }
	};
	DepthShader = LoadShaders(Depthshaders);
	depthMapFBO = new GLuint;
	depthMap = new GLuint;
	genDepthMap(depthMapFBO, depthMap, 1024, 1024);
	for (unsigned i = 0; i < Objects.size(); i++)
		Objects[i].Init(false,Shader);
	for (unsigned i = 0; i < Objects.size(); i++)
		Objects[i].Init(true, DepthShader);
	skybox.init();


	vector<Material> materials = Material::loadMate("texture", "your_material_file.mtl");


	if (Man2Index < Objects.size()) {
		cout << "testMan2Index" << endl;
		Material man2Material = Material(vec3(0.1f, 0.1f, 0.1f),  // Ka
			vec3(0.7f, 0.7f, 0.7f),  // Kd
			vec3(1.0f, 1.0f, 1.0f),  // Ks
			32.0f,                   // Ns
			"man2Material");       

		man2Material.Ka = vec3(0.1, 0.1, 0.1);  
		man2Material.Kd = vec3(0.7, 0.7, 0.7);  
		man2Material.Ks = vec3(1.0, 1.0, 1.0); 
		man2Material.Ns = 2000.0;  

		
	}
}

运行结果


在这里插入图片描述

三、在线协助:

如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!

1)远程安装运行环境,代码调试
2)Visual Studio, Qt, C++, Python编程语言入门指导
3)界面美化
4)软件制作
5)云服务器申请
6)网站制作

当前文章连接:https://blog.csdn.net/alicema1111/article/details/132666851
个人博客主页:https://blog.csdn.net/alicema1111?type=blog
博主所有文章点这里:https://blog.csdn.net/alicema1111?type=blog

博主推荐:
Python人脸识别考勤打卡系统:
https://blog.csdn.net/alicema1111/article/details/133434445
Python果树水果识别:https://blog.csdn.net/alicema1111/article/details/130862842
Python+Yolov8+Deepsort入口人流量统计:https://blog.csdn.net/alicema1111/article/details/130454430
Python+Qt人脸识别门禁管理系统:https://blog.csdn.net/alicema1111/article/details/130353433
Python+Qt指纹录入识别考勤系统:https://blog.csdn.net/alicema1111/article/details/129338432
Python Yolov5火焰烟雾识别源码分享:https://blog.csdn.net/alicema1111/article/details/128420453
Python+Yolov8路面桥梁墙体裂缝识别:https://blog.csdn.net/alicema1111/article/details/133434445

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HBase 数据导入导出

HBase 数据导入导出 1. 使用 Docker 部署 HBase2. HBase 命令查找3. 命令行操作 HBase3.1 HBase shell 命令3.2 查看命名空间3.3 查看命名空间下的表3.4 新建命名空间3.5 查看具体表结构3.6 创建表 4. HBase 数据导出、导入4.1 导出 HBase 中的某个表数据4.2 导入 HBase 中的某…

从源代码看Chrome 版本号

一直以来都是用Chrome 浏览器&#xff0c;但是看到Chrome 点分4 组数据的表达方式&#xff0c;总是感觉怪怪的&#xff0c;遂深入源代码了解她的版本号具体表示的内容 chrome 浏览器中显示的版本号 源代码中的版本号标识 版本号文件位于 chrome/VERSION &#xff0c; 看到源代…

nginx初学者指南

一、启动、停止和重新加载配置 前提&#xff1a;先要启动nginx 在Windows上启动nginx的步骤如下&#xff1a; 1. 下载并安装nginx。可以从nginx官网下载适合自己操作系统的版本&#xff0c;一般是zip压缩包&#xff0c;解压到指定目录中。 2. 进入nginx的安装目录&#xff…

Shell脚本⑧免交互

目录 一.Here Document 1.定义 2.变量 &#xff08;1&#xff09;变量替换成实际值 &#xff08;2&#xff09;整行内容作为变量并输出结果 &#xff08;3&#xff09;多行注释 &#xff08;4&#xff09;自动划分磁盘免交互 二.Expect 1.定义 2.安装 3.免交互操作 …

微软的Copilot for Sales(销售助手)和Copilot for Service(服务助手)现已全面开放

深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领域的领跑者。点击订阅&#xff0c;与未来同行&#xff01; 订阅&#xff1a;https://rengongzhineng.io/ 。 微…

基于控制台的购书系统(Java 语言实现)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…

Llama2大模型开源,大模型的Android时代来了?

就昨天凌晨,微软和Meta宣布Llama2大模型开源且进一步放开商用,一下朋友圈刷屏。要知道,开源界最强大的模型就是过去Meta开源的Llama,而现在Llama2更强大,又开放商用,更有微软大模型霸主企业撑腰(微软既投资大模型界的IOS——ChatGPT,又联合发布大模型的Android——Llam…

【DDD】学习笔记-什么是模型

从领域驱动的战略设计进入战术设计&#xff0c;简单说来&#xff0c;就是跨过系统视角的限界上下文边界进入它的内部&#xff0c;从分层架构的逻辑分层进入到每一层的内部。在思考内部的设计细节时&#xff0c;首先需要思考的问题就是&#xff1a;什么是模型&#xff08;Model&…

Leaf——美团点评分布式ID生成系统

0.普通算法生成id的缺点 1.Leaf-segment数据库方案 第一种Leaf-segment方案&#xff0c;在使用数据库的方案上&#xff0c;做了如下改变&#xff1a; - 原方案每次获取ID都得读写一次数据库&#xff0c;造成数据库压力大。改为利用proxy server批量获取&#xff0c;每次获取一…

x-shell安装、使用以及配置cuda、cudnn和conda

x-shell安装、使用以及安装最新版本conda x-shell安装远程连接服务器conda安装和环境配置 x-shell安装 x-shell是一款终端模拟软件&#xff0c;用于在Windows界面下远程访问和使用不同系统下的服务器。免费版本下载地址&#xff1a; https://www.xshell.com/zh/free-for-home-…

网络流数据集处理(深度学习数据处理基础)

一、数据集处理 处理数据集是一个文件夹 一个文件夹处理的&#xff0c;将原网络流数据集 放入一个文件夹 处理转换成 Json文件。&#xff08;数据预处理&#xff09;然后将这些文件处理成目标文件格式 再分割成训练集和测试集。每次运行只会处理一个文件夹。 运行train.py 导入…

070:vue中provide、inject的使用方法(图文示例)

第070个 查看专栏目录: VUE 本文章目录 示例背景示例效果图示例源代码父组件代码子组件代码孙组件代码 基本使用步骤 示例背景 本教程是介绍如何在vue中使用provide和inject。在 Vue 中&#xff0c;provide 和 inject 是用于实现祖先组件向后代组件传递数据的一种方式。 在这个…

分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别

分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别 目录 分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现G…

26条prompt规则应用于大模型

1、引入动机 llm大模型在回答一些问题上表现出了惊人的能力&#xff0c;例如数学逻辑推理&#xff0c;代码生成&#xff0c;问题答复等。提词工程是和大预言模型交流的一门艺术。 大模型的返回结合和用户的指令和输入直接相关prompts是用户和大模型沟通的一种编码方式 一般地…

python计算两个DataFrame的指定两列中,相同的数据有多少

目的&#xff1a;查询数据1和数据2中&#xff0c;red与red列相同 并且blue与blue列相同的&#xff0c;情况有多少。 &#xff08;备注&#xff1a;两个数据中格式不一致&#xff0c;需要经过json提取等处理步骤&#xff09; 思路步骤&#xff1a; 1、读取数据1&#xff0c;筛选…

12种算法优化CNN-BiLSTM-Attention多特征输入单步预测,机器学习预测全家桶,持续更新,MATLAB代码...

截止到本期&#xff0c;一共发了12篇关于机器学习预测全家桶MATLAB代码的文章。参考文章如下&#xff1a; 1.五花八门的机器学习预测&#xff1f;一篇搞定不行吗&#xff1f; 2.机器学习预测全家桶&#xff0c;多步预测之BiGRU、BiLSTM、GRU、LSTM&#xff0c;LSSVM、TCN、CNN&…

Vue工程引入Element-ui

npm 安装ELement-ui npm i element-ui -S 于package.json中发现有“element-ui”版本号即可 引入 Element 在 main.js 中写入以下内容&#xff1a; import element-ui/lib/theme-chalk/index.css; import ElementUI from element-ui;Vue.use(ElementUI);之后根据自己的需求设计…

《动手学深度学习(PyTorch版)》笔记6.1

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

考研/计算机二级数据结构刷题之顺序表

目录 第一题 顺序表的初始化&#xff0c;销毁&#xff0c;头插&#xff0c;尾插&#xff0c;头删&#xff0c;尾删&#xff0c;指定位置插入&#xff0c;指定删除以及打印 第二题 移除元素 题目链接&#xff1a; OJ链接 题目详解&#xff1a;移除元素 第三题&#xff1a;删…

这种学习单片机的顺序是否合理?

这种学习单片机的顺序是否合理&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01…