有人可以解释一下以下几行吗?
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库照顾的吗?
答案 0 :(得分:7)
第一行创建一个透视投影,相当于调用gluPerspective(45.0f,1.0f,0.1f,100.0f)。如果您不知道gluPerspective的作用,请查看link
glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);
下一行只是将旋转角度模数为360,以确保我们的投影角度小于360度。
angle = (GLfloat) (i % 360);
接下来的几行定义了我们的View矩阵。这基本上是您的相机视口,即您在显示器上看到的内容。 translate和rotate函数调用是转换函数调用以将我们的相机移动到位置
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橙皮书或在homogeneous coordinates上查看维基百科
glm::mat4 Model = glm::mat4(1.0);
最后两行完成设置场景,方法是计算模型视图投影矩阵并将其传递给OpenGL。
glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE, glm::value_ptr(MVP));
总的来说,你的代码块是通过将模型坐标转换为视图坐标来模拟OpenGL的绘图管道。
关于你问的第二个问题。我不明白第一部分,将数字转换为像素是什么意思?您是否尝试将1D矩阵中的点映射到2D矩阵中?如果是这种情况,只需做标准映射,像像素[索引/行] [索引%行],其中像素是你的屏幕像素对象,索引是你的数组索引,行是你的屏幕宽度。对于第二部分(如何设置(0,0)到屏幕的中间)我认为你需要做的只是在屏幕原点添加一个偏移,因为OpenGL使用左手坐标系,屏幕原点即(0,0)点将位于屏幕的左下角。因此,如果您希望系统位于屏幕中间,只需添加(-width / 2,-height / 2)偏移量即可将您的点转换为OpenGL空间或(宽度/ 2,高度/ 2)反之亦然投影。但是不建议使用自己建立的标准。
答案 1 :(得分:0)
设置透视摄像机转换:
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));