【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

相关推荐
岁忧2 小时前
(nice!!!)(LeetCode 每日一题) 679. 24 点游戏 (深度优先搜索)
java·c++·leetcode·游戏·go·深度优先
小欣加油2 小时前
leetcode 3 无重复字符的最长子串
c++·算法·leetcode
zylyehuo5 小时前
C++基础编程
c++
tt5555555555556 小时前
C/C++嵌入式笔试核心考点精解
c语言·开发语言·c++
lg_cool_6 小时前
Qt 中最经典、最常用的多线程通信场景
c++·qt6.3
科大饭桶6 小时前
C++入门自学Day14-- Stack和Queue的自实现(适配器)
c语言·开发语言·数据结构·c++·容器
tt5555555555557 小时前
字符串与算法题详解:最长回文子串、IP 地址转换、字符串排序、蛇形矩阵与字符串加密
c++·算法·矩阵
audyxiao0018 小时前
为了更强大的空间智能,如何将2D图像转换成完整、具有真实尺度和外观的3D场景?
人工智能·计算机视觉·3d·iccv·空间智能
rainFFrain8 小时前
Boost搜索引擎项目(详细思路版)
网络·c++·http·搜索引擎
long_run8 小时前
C++之模板函数
c++