核心操作:
1.proj view model 这三个矩阵
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,也就是说建立一个从人的视角看出去的一个锥体,物体不在这个视锥体范围内将不显示。
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)的情况。
放一个矩形在这:
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
};
索引数组:
unsigned int indices[] = {
0, 1, 2,
2, 3, 0
};
一顿绑定,顶点数组,顶点缓冲区,索引缓冲区,着色器。。。
绘制:
通过调整model,控制物体移动,调整view控制相机移动。
调整model.z 可以看到矩形大小在变化,是个3D透视。
源码见 Test3D.h,Test3D.cpp
见github