【11】使用透视投影建立一个3D空间的测试

核心操作:

1.proj view model 这三个矩阵

cpp 复制代码
glm::mat4 mvp = m_Proj * m_View * model;
m_Shader->Bind();
m_Shader->SetUniformMat4f("u_MVP", mvp);

着色器里面就:

proj:投影矩阵,可以选择正交投影,或者透视投影,为了营造3D透视的感觉,我们使用透视投影,m_Proj(glm::perspective(glm::radians(45.0f), 960.0f / 450.0f, 0.01f,1000.0f))

fov:45,一般标准是这样.

视窗宽高比 960/450.

视锥体前后0.01到1000,也就是说建立一个从人的视角看出去的一个锥体,物体不在这个视锥体范围内将不显示。

cpp 复制代码
m_View(glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, 0))),
		m_TranslationA(0, 0, 0)

view设置个在原点,model设置个不移动的。

这样glm::mat4 mvp = m_Proj * m_View * model;算下来,将是一个相机在原点,看向-z 方向,前后距离(0.01,1000)的情况。

放一个矩形在这:

cpp 复制代码
	float positions[] = {
		-150.0f, -150.0f,-10.0f,   0.0f, 0.0f,    0.1f,0.2f,0.2f,1.0f,// 0  后面的值为颜色
		150.0f,-150.0f,  -10.0f,   1.0f, 0.0f,		0.1f,0.2f,0.2f,1.0f,// 1
		150.0f, 150.0f,  -10.0f,   1.0f, 1.0f,		0.1f,0.2f,0.8f,1.0f,// 2
		-150.0f, 150.0f, -10.0f,   0.0f, 1.0f,		0.1f,0.1f,0.8f,1.0f,// 3
		};

索引数组:

cpp 复制代码
	unsigned int indices[] = {
			0, 1, 2,
			2, 3, 0
		};

一顿绑定,顶点数组,顶点缓冲区,索引缓冲区,着色器。。。

绘制:

通过调整model,控制物体移动,调整view控制相机移动。

调整model.z 可以看到矩形大小在变化,是个3D透视。

源码见 Test3D.h,Test3D.cpp

见github

相关推荐
Laurence7 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
蒸汽求职8 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
charlee448 小时前
最小二乘问题详解17:SFM仿真数据生成
c++·计算机视觉·sfm·数字摄影测量·无人机航测
Tanecious.8 小时前
蓝桥杯备赛:Day4-P9749 公路
c++·蓝桥杯
旖-旎8 小时前
分治(库存管理|||)(4)
c++·算法·leetcode·排序算法·快速选择算法
Tanecious.9 小时前
蓝桥杯备赛:Day3-P1102 A-B 数对
c++·蓝桥杯
Tanecious.9 小时前
蓝桥杯备赛:Day3-P1918 保龄球
c++·蓝桥杯
良木生香9 小时前
【C++初阶】:C++类和对象(下):构造函数promax & 类型转换 & static & 友元 & 内部类 & 匿名对象 & 超级优化
c语言·开发语言·c++
三雷科技10 小时前
使用 `dlopen` 动态加载 `.so` 文件
开发语言·c++·算法
旖-旎11 小时前
分治(快速选择算法)(3)
c++·算法·leetcode·排序算法·快速选择