【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

相关推荐
高冷小鱼殿下22 分钟前
C 语言指针与输入输出
c++
Solange__1 小时前
图片转3D导出GLB、FBX还是OBJ?按5类任务比较材质、动画与可编辑性
人工智能·3d·ai·自然语言处理·编辑器·blender·材质
路溪非溪1 小时前
C++标准库之智能指针
linux·开发语言·c++
hetao17338371 小时前
2026-11-02 hetao1733837 的刷题记录
c++·算法
Jmyd01231 小时前
博物馆AR导览数字孪生架构设计:从空间数据到AR应用全链路
3d·系统安全·ar·数字孪生·博物馆·三维数字化
Tairitsu_H2 小时前
[C++高阶数据结构·图论下] 最短路径:为什么“挑最小的”一定正确?
数据结构·c++·图论
chaoyuanl3 小时前
超元力玻璃剧场:裸眼3D、8K高清与悬空栈桥的成熟文旅解决方案
大数据·人工智能·3d·xr·vr
weixin199701080163 小时前
官方授权通道和灰色爬虫,做数据服务该选哪条路(附 python 源码)
c++·爬虫·python
wuminyu3 小时前
JVM执行引擎学习总结:热点字节码编译成本地机器码
java·linux·c语言·jvm·c++
Tairitsu_H3 小时前
[C++高阶数据结构·图论上] 最小生成树:为什么“选边”和“选点”是两条路?
数据结构·c++·图论·最小生成树