opengl和glm的一些解释

opengl和glm的一些解释,opengl,glm-math,Opengl,Glm Math,谁能给我解释一下下面这几行是干什么的 glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f); angle = (GLfloat) (i % 360); glm::mat4 View = glm::mat4(1.); View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f)); View = glm::rotate(View, angle * -1.0f, glm::

谁能给我解释一下下面这几行是干什么的

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);
angle = (GLfloat) (i % 360);
glm::mat4 View = glm::mat4(1.);
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f));
View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));
glm::mat4 Model = glm::mat4(1.0);
glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE, glm::value_ptr(MVP));

它们将单位转换为像素,但我不确定它们是否就是这样做的。另一个更一般的问题是,我如何表示一个数字,即sin(90)=1到10像素,或40或任何数字?我如何指定(0,0)将在屏幕中间?glm库是否负责上述所有工作?

设置透视摄影机变换:

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);
将相机沿Z轴向下移动一点:

View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f));
绕X轴向后旋转相机:

View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));
绕Y轴和Z轴旋转相机的速度为X轴的一半:

View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));

设置透视摄影机变换:

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);
将相机沿Z轴向下移动一点:

View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f));
绕X轴向后旋转相机:

View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));
绕Y轴和Z轴旋转相机的速度为X轴的一半:

View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));

第一行创建一个透视投影,相当于调用透视(45.0f、1.0f、0.1f、100.0f)。如果你不知道你该做什么,检查这个

下一行只是将旋转角度模化为360度,以确保投影角度小于360度

angle = (GLfloat) (i % 360);
接下来的几行定义了我们的视图矩阵。这基本上是您的摄像头查看端口,即您在显示器上看到的内容。“平移”和“旋转”函数调用是用于将相机移动到位的变换函数调用

glm::mat4 View = glm::mat4(1.);
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f));
View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));
下一行定义了我们模型的位置。在这种情况下,它将是(1.0f,1.0f,1.0f,1.0f)。如果您想知道为什么有4个参数而不是3个,请阅读OpenGL橙色手册或查看维基百科

最后两行通过计算模型视图投影矩阵并将其传递给OpenGL完成场景设置

glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE,     glm::value_ptr(MVP));
总体而言,代码块所做的是模拟OpenGL的绘图管道,将模型坐标转换为视图坐标


关于你问的第二个问题。我不明白第一部分,你把一个数字转换成一个像素是什么意思?是否尝试将一维矩阵中的点映射到二维矩阵?如果是这种情况,只需进行标准映射,例如像素[index/rows][index%rows],其中像素是屏幕像素对象,索引是数组索引,行是屏幕宽度。对于第二部分(如何将(0,0)设置为屏幕的中间部分),我认为您需要做的只是向屏幕的原点添加一个偏移量,因为OpenGL使用左手坐标系,因此屏幕原点即(0,0)点将位于屏幕的左下角。因此,如果希望系统位于屏幕中间,只需添加一个偏移量(-width/2,-height/2)即可将点转换为OpenGL空间,反之亦然(width/2,height/2)。但是不建议使用自行建立的标准。

第一行创建一个透视投影,相当于调用gluPerspective(45.0f、1.0f、0.1f、100.0f)。如果你不知道你该做什么,检查这个

下一行只是将旋转角度模化为360度,以确保投影角度小于360度

angle = (GLfloat) (i % 360);
接下来的几行定义了我们的视图矩阵。这基本上是您的摄像头查看端口,即您在显示器上看到的内容。“平移”和“旋转”函数调用是用于将相机移动到位的变换函数调用

glm::mat4 View = glm::mat4(1.);
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f));
View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));
下一行定义了我们模型的位置。在这种情况下,它将是(1.0f,1.0f,1.0f,1.0f)。如果您想知道为什么有4个参数而不是3个,请阅读OpenGL橙色手册或查看维基百科

最后两行通过计算模型视图投影矩阵并将其传递给OpenGL完成场景设置

glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE,     glm::value_ptr(MVP));
总体而言,代码块所做的是模拟OpenGL的绘图管道,将模型坐标转换为视图坐标

关于你问的第二个问题。我不明白第一部分,你把一个数字转换成一个像素是什么意思?是否尝试将一维矩阵中的点映射到二维矩阵?如果是这种情况,只需进行标准映射,例如像素[index/rows][index%rows],其中像素是屏幕像素对象,索引是数组索引,行是屏幕宽度。对于第二部分(如何将(0,0)设置为屏幕的中间部分),我认为您需要做的只是向屏幕的原点添加一个偏移量,因为OpenGL使用左手坐标系,因此屏幕原点即(0,0)点将位于屏幕的左下角。因此,如果希望系统位于屏幕中间,只需添加一个偏移量(-width/2,-height/2)即可将点转换为OpenGL空间,反之亦然(width/2,height/2)。但不建议使用自行制定的标准