OpenGL学习笔记五

您所在的位置:网站首页 opengl坐标系统 OpenGL学习笔记五

OpenGL学习笔记五

2023-02-22 22:53| 来源: 网络整理| 查看: 265

OpenGL学习笔记五——摄像机 五大坐标系统 各个坐标系统之间的转换关系: 投影矩阵的两种形式——摄像机的2D和3D类型 实战 运行结果 图片链接

五大坐标系统

局部空间(Local Space,或者称为物体空间(Object Space)) 局部坐标是对象中心或者轴心为原点的坐标,位置相对于对象中心或者轴心。

世界空间(World Space) 世界空间坐标,在世界空间中,有一个坐标系,就如Unity引擎中物体的坐标。

观察空间(View Space,或者称为视觉空间(Eye Space)) 观察空间是以摄像机为原点的坐标系

裁剪空间(Clip Space) 坐标到达观察空间之后,我们需要将其投影到裁剪坐标。裁剪坐标会被处理至-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上。

屏幕空间(Screen Space) 我们将裁剪坐标变换为屏幕坐标,我们将使用一个叫做视口变换(Viewport Transform)的过程。视口变换将位于-1.0到1.0范围的坐标变换到由glViewport函数所定义的坐标范围内。最后变换出来的坐标将会送到光栅器,将其转化为片段。

各个坐标系统之间的转换关系:

图片来源OpenGL学习笔记五——摄像机与坐标变换

局部空间到世界空间,需要乘上矩阵Model(模型矩阵) 世界空间变换到相机空间,乘上View(观察矩阵) 观察空间变换到裁剪空间乘上Projection(投影矩阵) 即:Vclip=Mprojection⋅Mview⋅Mmodel⋅Vlocal 投影矩阵的两种形式——摄像机的2D和3D类型

关于GLM库,请参考链接

正交投影

使用GLM库函数进行模拟:

glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);

前两个参数指定了平截头体的左右坐标,第三和第四参数指定了平截头体的底部和顶部。通过这四个参数我们定义了近平面和远平面的大小,然后第五和第六个参数则定义了近平面和远平面的距离。这个投影矩阵会将处于这些x,y,z值范围内的坐标变换为标准化设备坐标。

透视投影

使用GLM库函数进行模拟:

glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)width/(float)height, 0.1f, 100.0f);

它的第一个参数定义了fov的值,它表示的是视野(Field of View),并且设置了观察空间的大小。如果想要一个真实的观察效果,它的值通常设置为45.0f,但想要一个末日风格的结果你可以将其设置一个更大的值。第二个参数设置了宽高比,由视口的宽除以高所得。第三和第四个参数设置了平截头体的近和远平面。我们通常设置近距离为0.1f,而远距离设为100.0f。所有在近平面和远平面内且处于平截头体内的顶点都会被渲染。

OpenGL学习笔记五——摄像机与坐标变换

实战 #include #include #include "stb_image.h" #include #include #include #include void framebuffer_size_callback(GLFWwindow* window, int width, int height); void processInput(GLFWwindow *window); // settings const unsigned int SCR_WIDTH = 800; const unsigned int SCR_HEIGHT = 600; int main() { //初始化 glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 创建窗口 GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL); if (window == NULL) { std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3